从零开始带你实现HarmonyOS鸿蒙Next中APP隐私协议弹框功能

发布于 1周前 作者 itying888 来自 鸿蒙OS

从零开始带你实现HarmonyOS鸿蒙Next中APP隐私协议弹框功能

前言

大家好,今天给大家分享使用 ArkUI 的 Navigation(导航组件)和 WebView(加载本地 rawfile html 协议文件)来实现 APP 的隐私弹框功能,让我们开始吧。

创建 Dialog 组件

使用 自定义的 @CustomDialog 实现弹窗会有BUG,见[[自定义的CustomDialog中,跳转另一个Page 问题]],所以我们采用 Navigation 的 DIALOG mode 来实现。

import { common } from '@kit.AbilityKit';

@Component
export default struct PrivacyPolicyDialog {

  @Consume('NavPathStack') pageStack: NavPathStack;

  titleColor: string = '#333333'
  mainColor: string = '#F1525A'
  bodyColor: string = '#666666'
  otherColor: string = '#999999'

  build() {
    NavDestination() {
      Stack(){
        Column() {
          Text($r('app.string.simple_user_policy')).fontSize(18).fontColor(this.titleColor).margin({ top: 30, bottom: 19 })

          Scroll(){
            Text(){
              Span($r('app.string.privacy_policy_start'))
              Span($r('app.string.user_agreement_two')).fontColor(this.mainColor).onClick(() => {
                this.openWebUrl($rawfile("user_protocol.html"));
              })
              Span($r('app.string.and'))
              Span($r('app.string.privacy_policy_two')).fontColor(this.mainColor).onClick(() => {
                this.openWebUrl($rawfile("privacy_policy.html"));
              })
              Span($r('app.string.simple_privacy_policy'))
            }.fontSize(16).fontColor(this.bodyColor).margin({
              left:25,
              right:25
            })
          }.height(120)

          Column(){
            Button($r('app.string.disagree_privacy_policy')).onClick(() => {
              (getContext(this) as common.UIAbilityContext)?.terminateSelf()
            }).fontColor(this.otherColor).fontSize(15).backgroundColor(Color.Transparent)

            Button($r('app.string.agree_privacy_policy')).onClick(() => {
              // save state todo
              this.pageStack.pop()
            }).fontColor($r('sys.color.white')).fontSize(17)
              .linearGradient({
                direction: GradientDirection.Right, colors:[[this.mainColor,0.0],[this.mainColor,1.0]]
              }).width('80%').margin({
              top:15,bottom:21
            }).borderRadius(24)
          }
        }.backgroundColor($r('sys.color.comp_background_primary')).borderRadius(13).width('80%')
      }.width('100%').height('100%').backgroundColor("#4D000000")//黑色背景 透明度约为 30%
    }
    .hideTitleBar(true)
    .mode(NavDestinationMode.DIALOG)
    .onBackPressed(() => { // 禁用返回键
      return true
    })
  }

  openWebUrl(url:string|Resource){
    this.pageStack.pushPath({
      "name": "WebViewPage",
      "param": url
    })
  }

}

弹窗中的文字做了 i18n,这边仅列出 string.json zh 的实现供大家参考:

{
    "string": [
        [
            {
                "name": "privacy_policy_two",
                "value": "《隐私政策》"
            }, 
            {
                "name": "simple_privacy_policy",
                "value": "\n我们非常重视您的隐私和个人信息保护。在您使用的过程中,我们不会对您的个人信息进行收集和使用。"
            }, 
            {
                "name": "simple_user_policy",
                "value": "用户协议和隐私政策说明"
            }, 
            {
                "name": "agree_privacy_policy",
                "value": "同意"
            }, 
            {
                "name": "disagree_privacy_policy",
                "value": "不同意"
            }, 
            {
                "name": "privacy_policy_start",
                "value": "请您充分阅读并理解"
            }, 
            {
                "name": "user_agreement_two",
                "value": "《用户协议》"
            }, 
            {
                "name": "and",
                "value": "和"
            }
        ]
    ]
}

WebViewPage 加载 HTML 协议

import webView from '@ohos.web.webview';

@Builder
export function WebViewPageBuilder(name: string, param: string | Resource) {
  WebViewPage({url: param})
}

@Entry
@Component
struct WebViewPage {
  @State url:string | Resource = "";
  @State title:string|undefined = "";

  controller: webView.WebviewController = new webView.WebviewController()

  build() {
    NavDestination() {
      Column() {

        Web({ src: this.url, controller: this.controller })
          .javaScriptAccess(true)
          .onTitleReceive((event) => {
            this.title = event?.title;
          })

      }.justifyContent(FlexAlign.Start)
    }
    .title(this.title)
    .mode(NavDestinationMode.STANDARD)

  }

配置 router_map

{
    "routerMap": [
        {
            "name": "WebViewPage",
            "pageSourceFile": "src/main/ets/pages/WebViewPage.ets",
            "buildFunction": "WebViewPageBuilder",
            "data": {
                "description": "this is webview page"
            }
        }
    ]
}

以上,我们就实现了隐私弹窗,感谢大家的阅读。


更多关于从零开始带你实现HarmonyOS鸿蒙Next中APP隐私协议弹框功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中实现APP隐私协议弹框功能,可以通过以下步骤进行:

  1. 创建隐私协议弹框布局:在resources/base/layout目录下创建XML布局文件,定义弹框的UI元素,如标题、内容、同意和拒绝按钮。

  2. 编写弹框逻辑:在ets目录下创建TypeScript文件,编写弹框的显示逻辑。使用@ohos.promptAction模块的showDialog方法显示弹框,并处理用户点击同意或拒绝按钮的事件。

  3. 隐私协议内容:将隐私协议内容存储在resources/base/element目录下的字符串资源文件中,方便管理和多语言支持。

  4. 用户选择处理:根据用户的选择,将用户是否同意隐私协议的状态存储在@ohos.data.storage模块的Preferences中,以便后续使用。

  5. 应用启动时检查:在应用启动时,通过AbilityonCreate方法检查用户是否已经同意隐私协议。如果未同意,则显示隐私协议弹框。

  6. 权限申请:如果隐私协议涉及权限申请,使用@ohos.abilityAccessCtrl模块的requestPermissionsFromUser方法在用户同意隐私协议后申请相关权限。

  7. 测试与调试:使用DevEco Studio进行测试和调试,确保隐私协议弹框功能在不同设备和场景下正常工作。

通过以上步骤,可以在HarmonyOS鸿蒙Next中实现APP隐私协议弹框功能,确保应用符合隐私保护要求。

更多关于从零开始带你实现HarmonyOS鸿蒙Next中APP隐私协议弹框功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中实现APP隐私协议弹框功能,首先需要在config.json中声明权限,确保应用具备弹框权限。接着,在MainAbilityonStart方法中,使用PromptAction.showDialog创建弹框,设置标题、内容和按钮。通过onConfirmonCancel回调处理用户选择。最后,确保在用户同意隐私协议后,将状态保存到Preferences中,避免重复弹框。代码示例如下:

PromptAction.showDialog({
    title: "隐私协议",
    message: "请阅读并同意隐私协议",
    buttons: [
        {text: "同意", color: "#FF0000"},
        {text: "取消", color: "#0000FF"}
    ]
}).then(data => {
    if (data.index === 0) {
        // 用户同意,保存状态
        Preferences.putBoolean("privacyAgreed", true);
    } else {
        // 用户取消,退出应用
        terminateAbility();
    }
});

确保在应用启动时检查Preferences中的状态,决定是否显示弹框。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!