#星光不负 码向未来# 说多了都是泪:给鸿蒙APP加隐私政策,我竟“画蛇添足”? 原创

racyHat
发布于 2025-10-22 12:41
浏览
0收藏

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

一、“画蛇添足”的由来

既然这么重要,又是必须的,怎么说是画蛇添足了呢。这就需要从APP审核被拒绝说起了。审核被拒的原因
自己写了隐私政策,而又使用了AppGallery后台隐私政策托管,导致上线审核时出现了两个隐私政策弹窗,如下图审核反馈。
#星光不负 码向未来# 说多了都是泪:给鸿蒙APP加隐私政策,我竟“画蛇添足”?-鸿蒙开发者社区

1.这里可能就有人疑问了?难道自己看不到会出现两个吗?

  • 真真的告诉你,使用DevEco Studio 调试模式运行到真机或者模拟器,看不到,只能看到自己写的哪个隐私政策弹窗。
  • 真真的告诉你,云调试模式下,release模式包安装到云调试的测试机器上,也看不到系统的哪个隐私政策弹窗。
  • 真真的告诉你,云测试模式下 ,release模式包安装到云测试机器上,依然看不到系统的哪个隐私政策弹窗。

2.解决很简单

其实知道了问题具体是什么,也就是知道了答案。解决方法无外乎两个,“鱼与熊掌不可兼得”

  • 方式1:去掉自己写的隐私政策弹窗。这里可能会纠结,劳资花了时间,一点点码字码出来的功能,哪能说去掉就去掉。你可以选择下一个方式。
  • 方式2:去掉AppGallery的隐私托管,使用自定义的隐私政策,填入你的隐私政策网址。

#星光不负 码向未来# 说多了都是泪:给鸿蒙APP加隐私政策,我竟“画蛇添足”?-鸿蒙开发者社区

细说缘由

我在AppGallery后台创建版本时,发现可以进行隐私政策的托管,就想试试这个新功能,然后就迫不及待的的搞一个。结果在提交审核的时候,忘记取消了,因为我APP中自己也写了一个。这不就有两个隐私政策弹窗了,用户一打开APP就会弹出两个隐私政策弹窗出来,这就成功地促成了我的“画蛇添足”。
#星光不负 码向未来# 说多了都是泪:给鸿蒙APP加隐私政策,我竟“画蛇添足”?-鸿蒙开发者社区

既然都实现了,我不妨告诉大家我是怎么做到的吧。接下来我从难到易分开说一下。

  • 难:自己实现《隐私政策》弹窗。
  • 易:使用AppGallery的隐私政策托管服务。

二、自己实现《隐私政策》弹窗

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

原理:

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

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

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

#星光不负 码向未来# 说多了都是泪:给鸿蒙APP加隐私政策,我竟“画蛇添足”?-鸿蒙开发者社区

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('用户不同意协议,退出应用');
    // 获取UIAbilityContext
    let context = getContext(this) as common.UIAbilityContext;
    // 终止当前UIAbility
    context.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;
      }
    })
  }
}

三、使用AppGallery后台托管服务。

托管隐私,更简单地实现隐私政策弹窗的功能以及更简单地制作隐私政策。下面是几个简单的实现步骤。

1.登录到AppGallery

2.新建隐私协议

登录AppGallery后台后,找到你要上架的APP的要上线的版本,从左侧菜单中,选择协议政策,然后新建协议。接着填写隐私政策信息,根据APP的情况,填写政策信息,写完后点击提交审核即可,提交审核后,在返回的页面中,我们会发现多了一条隐私政策,你可以点击链接访问查看一下。

#星光不负 码向未来# 说多了都是泪:给鸿蒙APP加隐私政策,我竟“画蛇添足”?-鸿蒙开发者社区

3.使用隐私政策

在新创建的版本中,隐私声明这一项,选择隐私托管,选择刚刚你创建的隐私政策即可,记得保存哦。
#星光不负 码向未来# 说多了都是泪:给鸿蒙APP加隐私政策,我竟“画蛇添足”?-鸿蒙开发者社区

四、结论

不过现在想一想,也是好事情咯,后面再上架APP,直接走隐私托管,自己就不要再去写隐私政策了,同理用户协议也是如此。因祸得福咯。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
收藏
回复
举报
回复
    相关推荐