uniapp--- 微信小程序 用户隐私新规相关代码调整【vue3+ts+uView框架】

news2024/11/26 10:49:49

uniapp— 微信小程序 用户隐私新规相关代码调整【vue3+ts+uView框架】

官方公告地址:https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801
用户隐私保护指引填写说明地址:https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/

1)需要在9月15前更新完毕,否则会无法使用获取手机号 手机相册等相关信息。
2)微信小程序开发工具需要3.0版本以上
3)因现在uniapp官方未添加相关API,所以还是要先使用微信官方的

1. 在manifest.json文件中添加 “usePrivacyCheck”: true

在这里插入图片描述

2. 在hooks(如没有可以在自己的封装文件库下进行新建)里面新建一个ts文件封“查询隐私授权情况”的方法 【wx.getPrivacySetting】
ps:如果没有封装缓存那么可以直接用 uni.setStorageSync

import cache from '@/utils/cache'
const PrivacyProtocol = {
    needAuthorization: false, 
    privacyContractName: ''
}
export function checkUserPrivacyProtocol() {
    if (wx.getPrivacySetting) {
        wx.getPrivacySetting({
            success: (res:any) => {
                console.log('协议显示的值',res)
                PrivacyProtocol.needAuthorization = res.needAuthorization
                if (res.needAuthorization) {
                    // 需要弹出隐私协议  
                    PrivacyProtocol.privacyContractName = res.privacyContractName
                }
                cache.set('PrivacyProtocol', PrivacyProtocol)
            }
        })
    }
}
*2.1 如果有朋友想用这个@/utils/cache 下面是封装缓存的完整代码(cache.ts)*
const cache = {
    key: 'app_',
    //设置缓存(expire为缓存时效)
    set(key: string, value: any, expire?: string) {
        key = this.getKey(key)
        let data: any = {
            expire: expire ? this.time() + expire : '',
            value
        }

        if (typeof data === 'object') {
            data = JSON.stringify(data)
        }
        try {
            uni.setStorageSync(key, data)
        } catch (e) {
            return null
        }
    },
    get(key: string) {
        key = this.getKey(key)
        try {
            const data = uni.getStorageSync(key)
            if (!data) {
                return null
            }
            const { value, expire } = JSON.parse(data)
            if (expire && expire < this.time()) {
                uni.removeStorageSync(key)
                return null
            }
            return value
        } catch (e) {
            return null
        }
    },
    //获取当前时间
    time() {
        return Math.round(new Date().getTime() / 1000)
    },
    remove(key: string) {
        key = this.getKey(key)
        uni.removeStorageSync(key)
    },
    getKey(key: string) {
        return this.key + key
    },
    clear() {
        //清除全部缓存
        uni.clearStorageSync()
    }
}

export default cache

3. 在App.vue页面中调用checkUserPrivacyProtocol 方法

PS: 返回以及存入缓存的结果为 { needAuthorization: true/false, privacyContractName: ‘《xxx隐私保护指引》’ 。needAuthorization为true的时候代表需要进行隐私授权

import { onLaunch} from '@dcloudio/uni-app'
import { checkUserPrivacyProtocol } from '@/hooks/checkUserPrivacyProtocol'
onLaunch(async () => {
	await checkUserPrivacyProtocol() //检查小程序是否同意隐私协议
})

4. 新建隐私弹窗的组件privacy-popup,使用了uView框架以及Tailwind CSS IntelliSense

<template>
    <u-popup v-model="showPrivacyPopup" :border-radius="10" mode="center" @close="showPrivacyPopup = false" width="600">
        <view class="w-full px-[40rpx] py-[40rpx] box-border">
            <view class="w-full text-center text-lg mb-[40rpx]">温馨提示</view>
            <view>
                在你使用服务之前,请仔细阅读<text class="text-[#3478F7]" @click="onClickPrivacyPopupTitle">{{
                    PrivacyProtocol.privacyContractName }}</text>。如果你同意{{ PrivacyProtocol.privacyContractName
    }},请点击“同意”开始使用。
            </view>
            <view class="flex justify-between" style="margin-top: 40rpx">
                <view class="w-[48%]">
                    <button @click="handleRefusePrivacyAuthorization">拒绝</button>
                </view>
                <view class="w-[48%] agree">
                    <button id="agree-btn" class="btn-agree" open-type="agreePrivacyAuthorization"
                        @agreeprivacyauthorization="handleAgreePrivacyAuthorization">
                        同意
                    </button>
                </view>
            </view>
        </view>
    </u-popup>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import cache from '@/utils/cache'
let resolvePrivacyAuthorization: any
const showPrivacyPopup = ref(false) // 是否需要弹出协议

const PrivacyProtocol = reactive(cache.get('PrivacyProtocol'))

// 打开弹窗
function openPrivacyPopup() {
    showPrivacyPopup.value = true
}
// 关闭弹窗
function closePrivacyPopup() {
    showPrivacyPopup.value = false
}
// 用户点击同意
function handleAgreePrivacyAuthorization() {
    console.log('点击了同意')
    resolvePrivacyAuthorization({
        buttonId: 'agree-btn',
        event: 'agree'
    })
    showPrivacyPopup.value = false
}
// 用户点击拒绝
function handleRefusePrivacyAuthorization() {
    uni.showModal({
        content:
            '如果拒绝,我们将无法获取您的信息, 包括手机号、位置信息、相册等该小程序十分重要的功能,您确定要拒绝吗?',
        success: (res) => {
            if (res.confirm) {
                console.log('点击了拒绝', resolvePrivacyAuthorization)
                resolvePrivacyAuthorization({
                    event: 'disagree'
                })
                closePrivacyPopup()
                uni.$u.toast('用户拒绝了隐私请求,无法使用相关微信的Api')
            }
        }
    })
}
// 打开隐私协议
function onClickPrivacyPopupTitle() {
    wx.openPrivacyContract({})
}

// 监听调用微信api的函数
function saveWXCallBack() {
    if (wx.onNeedPrivacyAuthorization) {
        wx.onNeedPrivacyAuthorization((resolve: any) => {
            openPrivacyPopup()
            resolvePrivacyAuthorization = resolve
        })
    }
}
onLoad(async () => {
    await saveWXCallBack()
})
</script>
<style lang="scss" scoped>
button {
    height: 80rpx;
    text-align: center;
    line-height: 80rpx !important;
    font-size: 28rpx;
    color: #101010;
    border: 1px solid #eee;
}

.agree button {
    background-color: #3478f7;
    color: #fff;
}

button::after {
    border: none;
}
</style>

6. 在需要用到隐私协议的地方引用,(只需同意一次即可,同意后其他地方不会再吊起)【如我在获取手机号授权时调用,当点击授权时,会先提示下面弹窗,同意后才能进行授权】

 <privacy-popup></privacy-popup>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/953002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++信息学奥赛1177:奇数单增序列

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int arr[n]; // 创建大小为 n 的整型数组for(int i0;i<n;i) cin>>arr[i]; // 输入数组元素for(int i0;i<n;i){ // 对数组进行冒泡排序f…

Resource Hacker下载

下载路径 Resource Hacker (angusj.com)http://www.angusj.com/resourcehacker/#download 应用方法示例 【2023年更新】手把手教你去除 WinRAR 的弹窗广告_winrar广告怎么去除_areosun的博客-CSDN博客https://blog.csdn.net/haiyunzhiqiu/article/details/119176038#comment…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——性质模态

性质&模态 角度一 角度二 矛盾关系 【对象】(1)所有、有的不;(2)所有不、有的;(3)某个、某个不。 【典例】①所有偶像都是靠颜值的。 ②有的偶像不是靠颜值的。 试分析: (1)如果①为真,试判断②的真假。 (2)如果①为假,试判断②的真假。 (3)①和②是否可…

u盘提示需要格式化如何恢复里边的数据?你可以这么做

“昨天我和往常一样往U盘传输一些重要文件&#xff0c;突然收到一个提示&#xff1a;说我需要格式化它才能使用&#xff0c;但是我里面有重要的数据&#xff0c;所以我不敢点&#xff0c;可是没法复制出里面的数据&#xff0c;有没有人告诉我&#xff0c;如何恢复里边的数据&am…

【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先我们要知道后序遍历数组的最后一个元素必然是根节点&#xff0c;然后根据根节点在中序遍历数组中的…

Zynq GTX全网最细讲解,aurora 8b/10b协议,OV5640板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX 接收接口GTX IP核调用和使用 4、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX aurora 8b/10b数据对…

Docker Harbor 私有镜像仓库的部署和管理

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 四、部署配置Docker Harbor 首先需要安装 Docker-Compose 服务 部署 Harbor 服务 修改配置文件 docker配置文件添加本地仓库地址 关于 Harbor.cfg 配置文件中有两类参数&#xff1a;所需参数和可选参数 &a…

双基证券:游戏版号发放整体趋势的向好将持续优化供给端

双基证券表示&#xff0c;版号发放整体趋势的向好将继续优化供应端&#xff0c;游戏新产品周期正逐渐开启&#xff0c;各家游戏公司盈余端将逐渐企稳&#xff0c;同时将推进游戏商场规划进一步增加。长时间来看&#xff0c;AIGC等技术对游戏全工业链具有降本增效&#xff0c;提…

节日书单视频怎么制作?这个工具不要错过

节日书单视频制作是一项具有一定专业性和科普性质的任务。在制作节日书单视频时&#xff0c;我们需要注意一些方法和注意事项&#xff0c;以确保视频的质量和效果。本文将介绍一些关键的步骤和技巧&#xff0c;帮助您顺利完成节日书单视频的制作。 编辑制作节日书单视频的话&am…

Python2021年9月Python二级 -- 编程题解析

题目一: 日期转换 编写一个程序&#xff0c;实现用户输入一个日期&#xff0c;格式为"月/日/年"&#xff0c;如输入05/21/2021&#xff0c;程序输出日期为’May 21,20211至12月的英文名称如下: January,February,March,April, May, June, July&#xff0c;August, Se…

YOLO目标检测——人脸表情识别数据集下载分享

受试者在15个视点和19个照明条件下成像&#xff0c;同时显示一系列面部表情&#xff0c;资源包括PIE照明子集&#xff08;1154张人脸灰度图&#xff0c;3232&#xff09;和三个Pose05、Pose07、Pose09子集&#xff08;分别包括3332张、1629张、859张人脸灰度图&#xff0c;6464…

RTP协议简介

介绍 RTP&#xff0c;real-time transport protocol&#xff0c;实时传输协议&#xff0c;用于传输具有实时属性的数据。RTP提供端到端的网络传输功能&#xff0c;适用于通过组播或单播网络服务传输实时数据(如音频、视频或仿真数据)的应用。 RTP协议层有两个子协议&#xff…

构建稳定的爬虫系统:如何选择合适的HTTP代理服务商

在构建一个稳定、高效的爬虫系统中&#xff0c;选择合适的HTTP代理服务商是至关重要的一步。本文将介绍如何选取可靠且性能优秀的HTTP代理服务供应商&#xff0c;来完成搭建一个强大而稳定的爬虫系统。 1.了解不同类型和特点 -免费公开代理服务器:提供免费但可能存在限制或不…

C++信息学奥赛1179:奖学金

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int id[n], arr[n], brr[n], crr[n]; // 创建大小为 n 的整型数组 id, arr, brr, crrfor(int i0;i<n;i) {id[i] i1; // 初始化 id 数组为 1,2,3…

使用maven创建springboot项目

创建maven快速启动项目 命令行或者idea、eclipse快捷创建也可以 pom.xml下project项目下导入springboot 父工程 <!--导入springboot 父工程--> <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.bo…

Linux socket网络编程实战(tcp)实现双方聊天

在上节已经系统介绍了大致的流程和相关的API&#xff0c;这节就开始写代码&#xff01; 回顾上节的流程&#xff1a; 创建一个NET文件夹 来存放网络编程相关的代码&#xff1a; tcp服务端代码初步实现--上 这部分先实现服务器的连接部分的代码并进行验证 server1.c&#xff…

服务器中locked勒索病毒的原因和影响,勒索病毒解密,数据恢复

locked勒索病毒是一种流行的计算机病毒&#xff0c;它会对感染的计算机进行加密&#xff0c;并要求用户支付一定数量的赎金才能解锁。这种病毒已经存在了几年&#xff0c;对许多计算机用户造成了严重的困扰。 locked勒索病毒通常是通过电子邮件或恶意网站传播的。电子邮件中可能…

项目详细描述

目录、 一、SOC智能游戏机&#xff08;集创赛-西南赛区三等奖&#xff09; 二、AXI2AHB Bridge 三、基于FPGA智能导盲拐杖&#xff08;FPGA竞赛全国二等奖&#xff09; 三、基于FPGA的倾角监测系统 四、图像压缩核心算法 一、SOC智能游戏机&#xff08;集创赛-西南赛区三等…

vue3 页面显示中文,分页显示中文

vue3 分页默认为英文 &#xff0c;但想要中文显示 那么在App.vue中的代码为三步即可&#xff0c;引入中文&#xff0c;声明中文 &#xff0c;绑定中文&#xff1b; 1. import zhCn from element-plus/es/locale/lang/zh-cn&#xff1b; 2. let locale zhCn; 3. :locale&q…

Spring retry(一)-使用指南

一、接入 spring boot 2.7.14 spring retry 从2.0.2版本之后&#xff0c;从spring batch里剥离出来成为一个单独的工程&#xff0c;因此我们引入spring retry最新版本可以直接如下引入 <dependency><groupId>org.springframework.retry</groupId><arti…