当前位置: 首页 > 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.dtcms.com/a/349635.html

相关文章:

  • JavaWeb(八)EL表达式,JSTL标签
  • 阿里云短信验证码服务
  • 奔赴少年CIIU携专辑《我们的出发》正式出道 与J.Y. Park同台首秀备受关注
  • 基于SpringBoot的招聘管理系统【2026最新】
  • 【Linux基础知识系列】第一百一十篇 - 使用Nmap进行网络安全扫描
  • C# NX二次开发:绘图区控件和指定矢量控件详解
  • [MH22D3开发笔记]2. SPI,QSPI速度究竟能跑多快,双屏系统的理想选择
  • 基于WebTransport(底层QUIC)实现视频传输(HTML+JavaScript)
  • C语言基础:(二十五)预处理详解
  • 从0到1:用 Qwen3-Coder 和 高德MCP 助力数字文旅建造——国庆山西游
  • Rust面试题及详细答案120道(58-65)-- 集合类型
  • 解锁处暑健康生活
  • Docker:部署Nginx
  • week4-[一维数组]数码个数
  • Gemini 2.5 Flash-Lite 与 GPT-5-mini:高性能低成本模型,如何选择?
  • 链表OJ习题(1)
  • redis-缓存-持久化
  • 使用 Gemini CLI作为 Claude Code的 subagent
  • OC-MVC模式下的折叠cell
  • 利用 Python 爬虫获取 1688 商品详情 API 返回值说明(代码示例)实战指南
  • 爬虫基础学习-爬取网页项目
  • vue2使用WaveSurfer实现简易的音频播放
  • 波音787项目:AR技术重塑航空制造的数字化转型
  • 用MessageBus优化模块通信:实现订阅/发布模式
  • nmcli命令详解
  • 文吃透朴素贝叶斯:从原理到实战
  • 【python文件处理】使用 open() 函数打开文件、 File 操作文件、使用 OS 对象操作文件目录的知识,使用 open() 函数打开文件
  • DMP-Net:面向脑组织术中成像的深度语义先验压缩光谱重建方法|文献速递-深度学习人工智能医疗图像
  • Android进入Activity时闪黑生命周期销毁并重建
  • 集成电路学习:什么是Caffe深度学习框架