当前位置: 首页 > news >正文

审核问题——首次进入APP展示隐私政策弹窗

背景:隐私政策弹窗,在很久很久以前,就开始了。如果用户没有同意您的APP的《隐私政策》,如果有用户系统的话,在加上一个《用户协议》,就不能进入您的APP。并且这个是强制要求的。

一、先了解一下,首次进入APP展示《隐私政策》弹窗

之前在iOS和Android中都实现过,觉得在鸿蒙中的思路应该也是一样的,只是实现的代码不同,殊途同归。

原理:

  • 在用户未同意《隐私政策》和《用户协议》之前,不加载数据,可以展示一个空页面或者登录页面。在用户点击同意按钮之后,在进入主页面中,就可以正常的使用APP了。

  • 点击同意的时候,顺便呢存一下,存到轻量级缓存SharedPreferences中,下次进入首页的时候,验证一下是否同意过。同意了就直接进入APP主页面,没同意接着用《隐私政策》弹窗去拦截,直到同意为止。

二、实现步骤

1.首先要有一个弹窗吧,就像下图的内容一样。需要有内容,有可以跳转到隐私政策的按钮。还要有两个同意、不同意按钮。

2.在首页进行验证,是否要展示隐私政策弹窗。

在鸿蒙中可以通过IF-ELSE条件渲染器,通过状态变量isAgress进行页面切换。

  // 是否同意隐私政策@State isAgress:boolean = true;build() {if(this.isAgree){Column().width('100%').height('100%')} else {/// 主页面}

3.需要在onPageShow()中,进行验证是否,需要展示隐私政策弹窗

  onPageShow(): void {preferences.getPreferences(this.getUIContext().getHostContext(), AgreementDialog.PREFERENCE_NAME).then((pref)=>{if (pref) {// 获取用户已同意协议的状态pref.get(AgreementDialog.HAS_AGREED_KEY,true).then((flag)=>{if(flag == false){this.isAgree = flag;}else{this.agreementDialogController.open();}})}})}

4.隐私政策弹窗中,做了一些处理。除了显示页面效果外,轻缓存保存用户同意的操作、跳转到隐私政策页面,都在这里处理。

其中这里用到了@Link isAgree:boolean; 进行双向通知。

import { preferences } from "@kit.ArkData";
import { common } from "@kit.AbilityKit";@CustomDialog
export struct AgreementDialog {static  readonly PREFERENCE_NAME: string = 'agreement_preferences';static  readonly HAS_AGREED_KEY: string = 'has_agreed_to_terms';controller: CustomDialogController;@Link isAgree:boolean;build() {Column() {// Text('用户协议与隐私政策')Text('隐私政策').fontSize(20).fontWeight(FontWeight.Bold).margin({ top: 20, bottom: 10 })// Text('欢迎使用环球国典!为了更好地保护您的个人信息和合法权益,请您在使用我们的产品前,认真阅读并了解《用户协议》和《隐私政策》的全部内容。')Text('欢迎使用环球国典!为了更好地保护您的个人信息和合法权益,请您在使用我们的产品前,认真阅读并了解《隐私政策》的全部内容。').fontSize(16).margin({ bottom: 10, left: 20, right: 20 }).textAlign(TextAlign.Start)Text() {Span('点击"同意"即表示您已阅读并同意').fontSize(14)// Span('《用户协议》')//   .fontSize(14)//   .fontColor(Color.Blue)//   .onClick(() => {//     this.controller.close()//     this.getUIContext().getRouter().pushUrl({//       url: 'pages/SilWebViewPage',//       params: {//         title: '用户协议',//         url: 'file:///rawfile/agreement.html'//       }//     });//   })// Span('和')//   .fontSize(14)Span('《隐私政策》').fontSize(14).fontColor(Color.Blue).onClick(() => {this.controller.close()this.getUIContext().getRouter().pushUrl({url: 'pages/SilWebViewPage',});})}.margin({ bottom: 20, left: 20, right: 20 }).textAlign(TextAlign.Center)Row() {Button('不同意').fontColor(Color.Gray).backgroundColor(Color.White).borderRadius(20).borderWidth(1).borderColor(Color.Gray).width('40%').height(40).onClick(() => {this.controller.close();this.onAgreementCancel();})Button('同意').fontColor(Color.White).backgroundColor('#0D9FFB').borderRadius(20).width('40%').height(40).onClick(() => {this.onAgreementConfirm()this.controller.close();})}.width('100%').justifyContent(FlexAlign.SpaceEvenly).margin({ bottom: 20 })}.width('90%').backgroundColor(Color.White).borderRadius(20).padding({ top: 10, bottom: 10 })}// 用户不同意协议的处理方法onAgreementCancel():void {console.info('用户不同意协议,退出应用');// 获取UIAbilityContextlet context = getContext(this) as common.UIAbilityContext;// 终止当前UIAbilitycontext.terminateSelf();}// 用户同意协议的处理方法onAgreementConfirm():void {preferences.getPreferences(this.getUIContext().getHostContext(), AgreementDialog.PREFERENCE_NAME).then((pref)=>{if (pref) {// 保存用户已同意协议的状态pref.put(AgreementDialog.HAS_AGREED_KEY, false)pref.flush()this.controller.close();console.info('用户已同意协议,状态已保存');this.isAgree = false;}})}
}

三、总结,先梳理原理,然后再实现,不迷路。

http://www.xdnf.cn/news/1366363.html

相关文章:

  • 大模型(一)什么是 MCP?如何使用 Charry Studio 集成 MCP?
  • 深分页实战
  • 计算机网络:HTTP、抓包、TCP和UDP报文及重要概念
  • GPT5的Test-time compute(测试时计算)是什么?
  • Legion Y7000P IRX9 DriveList
  • HTTP 与 HTTPS 深度解析:从原理到实际应用
  • 链表OJ习题(1)
  • 1. 并发产生背景 并发解决原理
  • pytest 并发执行用例(基于受限的测试资源)
  • 现代C++工具链实战:CMake + Conan + vcpkg依赖管理
  • week4-[一维数组]数码个数
  • k8s笔记02概述
  • C++|UDP通讯使用总结
  • HTML应用指南:利用GET请求获取MSN 天气数据并可视化
  • [系统架构设计师]应用数学(二十一)
  • list容器的使用
  • GNN:用MPNN(消息传递神经网络)落地最短路径问题模型训练全流程
  • 用 GSAP + ScrollTrigger 打造沉浸式视频滚动动画
  • 【Day 33】Linux-Mysql日志
  • DDR3入门系列(二)------DDR3硬件电路及Xilinx MIG IP核介绍
  • linux 正则表达式学习
  • 使用 gemini 来分析 github 项目
  • 安卓11 12系统修改定制化_____修改固件 默认给指定内置应用系统级权限
  • 大模型的思考方式
  • Java全栈开发实战:从Spring Boot到Vue3的项目实践
  • ZKmall开源商城多端兼容实践:鸿蒙、iOS、安卓全平台适配的技术路径
  • 8.25作业
  • [MH22D3开发笔记]2. SPI,QSPI速度究竟能跑多快,双屏系统的理想选择
  • Linux笔记9——shell编程基础-3
  • Tesseract OCR之页面布局分析