【HarmonyOS】元服务隐私协议开发指导样例

【关键字】

隐私、弹窗、元服务、协议

【介绍】

每个元服务必须提供隐私声明,否则将导致提交元服务发布上架时,审核无法通过。隐私声明的具体要求请参见隐私声明规范。用户使用元服务前,必须引导其了解隐私声明信息,获取用户授权后,才能继续使用元服务。

废话不多说,上代码!!

【方式一】推荐在首次启动或者注册登录时呈现隐私声明:

cke_93727.png

代码结构:新建detailman页面用来显示上图超链接跳转的H5页面,index页面是元服务首页

cke_1032.png

实现代码:index.hml文件,使用dialog组件实现协议弹出框,协议内容使用<text>+<span>组件实现协议跳转,span的value定义在JS文件的data中。(这里请注意:直接将协议内容写到组件内无法实现首行缩进,API7+才支持)

<div class="container"><button style="height: 5%; width: 30%;" onclick="onShow">Helloworld</button><!--方式一:首次打开弹窗-->
<!--下方dialog组件整体复制到元服务首页hml中任意位置-->
<!-- copy   start--><dialog id="dragDialog" dragable="false" style="height: 60%; width: 90%; margin-bottom: 15%;"><div style="flex-direction: column; align-items: center; height: 100%; width: 100%;"><div style="height: 15%; width: 100%; justify-content: center; align-items: center;"><text style="font-size: 20px; font-weight: 900;">{{ this.head }}</text></div><div style="height: 70%; width: 100%; justify-content: center;"><text style="width: 95%; text-align: start; padding: 2%; line-height: 25px;"><span class="fontStyle">{{ firstContext }}</span><span class="fontStyle" style="color: #ff0800ff;" onclick="go(rule)">{{ rule }}</span><span class="fontStyle">,</span><span class="fontStyle" style="color: #ff0800ff;" onclick="go(privacy)">{{ privacy }}</span><span class="fontStyle">{{ secondContext }}</span></text></div><div style="height: 15%; width: 100%; flex-direction: row; justify-content: center; align-items: center;"><button type="text" style="width: 40%; font-size: 20px; text-align: center; text-color: black;"onclick="noAgree">不同意</button><button type="text" style="width: 40%; font-size: 20px; text-align: center; text-color: #ff0800ff;"onclick="agree">同意</button></div></div></dialog>
<!-- copy  end-->
</div>

index.js文件,在oninit中获取轻量存储文件路径,在onshow中判断是否已同意协议,未同意则弹窗。用户同意则保存同意数据到轻量存储中(要实现用户关联建议使用云存储)

import Router from '@system.router';
import storage from '@ohos.data.storage';
import featureAbility from '@ohos.ability.featureAbility';
export default {data: {head: "用户隐私条款",privacy: "《隐私政策》",rule: "《用户协议》",firstContext: "       为了更好地保护您的个人信息,我们根据最新的法律法规及相关政策的要求,对隐私条款进行了更新,请您仔细阅读并确认",secondContext: "。(特别是加粗及下划线部分),我们会严格按照本协议的约定收集、使用、存储您在" +"使用本软件过程中设计的个人信息,以便为您提供更优质的服务,感谢您的信任与理解。\n       如需换行参照此样例实现,如不需要请删除。。。",filepath: "",imagePath:"/common/images/uncheck.png"},onInit() {var context = featureAbility.getContext();context.getFilesDir().then((filePath) => {this.filepath = filePath + '/myDatastore';})},onShow() {let dataStorage = storage.getStorageSync(this.filepath);//方式一:判断页面打开是否需要弹窗dataStorage.get("hasAgree", "false").then((value) => {if (value == "false") {this.$element('dragDialog').show();}})},agree() {//处理同意的业务this.$element('dragDialog').close();let dataStorage = storage.getStorageSync(this.filepath);dataStorage.putSync("hasAgree", "true");dataStorage.flushSync();},noAgree() {//处理不同意的业务this.$element('dragDialog').close();//允许继续浏览,或选择退出},go(flag) {let url = "https://www.51miz.com/so-wendang/11963302.html?utm_term=12452681&utm_source=baidu3&bd_vid=8250967139616741558"if (flag == "《用户协议》") {url = "https://www.51miz.com/so-wendang/11963302.html?utm_term=12452681&utm_source=baidu3&bd_vid=8250967139616741558"}else {url = "https://www.tukuppt.com/wordmuban/yinsizhengce.html?plan=11177-37593-12085827&bd_vid=8439929694061694080"}Router.push({uri: "pages/detailman/detailman", params: {param: url}})this.$element('dragDialog').close();},
}

index.css文件:

.container {display: flex;flex-direction: column;justify-content: flex-start;align-items: center;left: 0px;top: 0px;width: 100%;height: 100%;
}
.fontStyle{font-size: 16px
}

协议详情页面detailman.hml,使用web组件显示H5内容,web组件会覆盖页面其他组件,无法使用组件事件实现回退,如果需要回退可以考虑使用JAVA webView实现

<div class="container"><web src="{{param}}"></web>
</div>

detailman.js,定义param变量接受index页面router传过来的参数

export default {data: {param: ""},onInit() {}
}

detailman.css

.container {display: flex;flex-direction: column;justify-content: center;align-items: center;left: 0px;top: 0px;width: 100%;height: 100%;}

【效果展示】

01.gif

【参考样式二】如果元服务需要登录后使用,建议登录界面提供隐私声明提示,引导用户阅读和授权,获取授权后才可继续使用。

cke_108244.png

代码结构:新建detailman页面用来显示上图超链接跳转的H5页面,index页面是元服务首页,common下新增

cke_117281.png

实现代码:index.hml文件,因JS UI中不支持checkBox组件,这里使用image来实现选择效果

<div class="container">
<!--方式二:首页使用check框--><div style="flex-direction: row; align-items: center; justify-content: center;"><image id="checkImage" style="width: 25px; height: 25px;margin: 3%;" src="{{imagePath}}"onclick="agreeCheck"></image><text style="width: 80%; text-align: start; padding: 2%; line-height: 25px;justify-content: center;"><span class="fontStyle" style="color: #ff181717;">我已阅读并同意</span><span class="fontStyle" style="color: #ff0800ff;" onclick="go(rule)">{{ rule }}</span><span class="fontStyle">与</span><span class="fontStyle" style="color: #ff0800ff;" onclick="go(privacy)">{{ privacy }}</span></text></div>
</div>

index.js文件,在oninit中获取轻量存储文件路径,在onshow中查询存储数据,初始化check状态。

import Router from '@system.router';
import storage from '@ohos.data.storage';
import featureAbility from '@ohos.ability.featureAbility';
export default {data: {privacy: "《隐私政策》",rule: "《用户协议》",        filepath: "",imagePath:"/common/images/uncheck.png"},onInit() {var context = featureAbility.getContext();context.getFilesDir().then((filePath) => {this.filepath = filePath + '/myDatastore';})},onShow() {let dataStorage = storage.getStorageSync(this.filepath);//方式二:打开页面时初始化用户是否已同意dataStorage.get("hasAgree", "false").then((value) => {if (value == "false") {this.imagePath = "/common/images/uncheck.png"}else{this.imagePath = "/common/images/check.png"}})},go(flag) {let url = "https://www.51miz.com/so-wendang/11963302.html?utm_term=12452681&utm_source=baidu3&bd_vid=8250967139616741558"if (flag == "《用户协议》") {url = "https://www.51miz.com/so-wendang/11963302.html?utm_term=12452681&utm_source=baidu3&bd_vid=8250967139616741558"}else {url = "https://www.tukuppt.com/wordmuban/yinsizhengce.html?plan=11177-37593-12085827&bd_vid=8439929694061694080"}Router.push({uri: "pages/detailman/detailman", params: {param: url}}) },agreeCheck(){let dataStorage = storage.getStorageSync(this.filepath);dataStorage.get("hasAgree", "false").then((value) => {if (value == "false") {//处理同意逻辑并保存已同意参数dataStorage.putSync("hasAgree", "true");dataStorage.flushSync();this.imagePath = "/common/images/check.png"}else {//处理不同意逻辑并保存已同意参数dataStorage.putSync("hasAgree", "false");dataStorage.flushSync();this.imagePath = "/common/images/uncheck.png"}})}}

index.css文件:

.container {display: flex;flex-direction: column;justify-content: flex-start;align-items: center;left: 0px;top: 0px;width: 100%;height: 100%;
}
.fontStyle{font-size: 16px
}

协议详情页面detailman.hml,参照方式一实现

【效果展示】

02.gif

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

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

相关文章

【NLP】一项NER实体提取任务

一、说明 从文本中提取实体是一项主要的自然语言处理 (NLP) 任务。由于深度学习(DL)的最新进展使我们能够将它们用于NLP任务,并且与传统方法相比,在准确性上产生了巨大的差异。 我试图使用深度学习和传统方法从文章中提取信息。结果是惊人的,因为DL方法…

tcpdump 使用

Linux tcpdump抓包工具使用 tcpdump官网tcpdump使用tcpdump抓取http请求 tcpdump官网 官网 请参考官网参看具体参数信息 tcpdump使用 tcpdump抓取http请求 http请求抓取参考网址 //抓取HTTP GET (GET 0x47, 0x45, 0x54, 0x20) 请求,以ascii展示 tcpdump -i eth0 -A -s 0 …

C#被指定窗体的MdiParent的窗体不是MdiContainer

工作的时候遇到一个问题&#xff1a; 被指定窗体的MdiParent的窗体不是MdiContainer 这个问题的原因是父窗体的IsMdiContainer 属性设置为false导致的。将此属性设置为true&#xff0c;即可解决此问题。有两种方式设置窗体的IsMdiContainer 属性。 第一种&#xff0c;在父窗口…

Chrome远程调试webview

网址 谷歌远程调试解决方案 https://blog.csdn.net/m0_56516186/article/details/131260563Chrome远程调试webview https://blog.csdn.net/weixin_44801980/article/details/117755550

Editing Large Language Models: Problems, Methods, and Opportunities

本文是LLM相关的系列文章&#xff0c;针对《Editing Large Language Models: Problems, Methods, and Opportunities》的翻译。 编辑大语言模型&#xff1a;问题、方法和机遇 摘要1 引言2 问题定义3 当前方法3.1 保留LLM参数的方法3.2 修改LLM参数的方法 4 初步实验4.1 数据集…

python实现拼多多商品详情接口API

最近工作需要用到拼多多的一些接口&#xff0c;官方竟然没有提供&#xff0c;python的sdk&#xff0c;于是就自己简单的写了一个商品SKU接口的api。 1、代码 #!/usr/bin/python3# -*- coding: utf-8 -*-# Time : 2020/3/29 0021 下午 19:40# Author : xiaozhi&#xff01;…

201. 数字范围按位与 Python

文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 示例 1 输入&#xff1a…

「深度学习之优化算法」(十六)万有引力算法

1. 万有引力算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读) 万有引力算法(Gravitational Search Algorithm)是受物体之间的万有引力启发而提出的算法。算法提出于2008(2009)年,时间不长,不过相关的文章和应用已经相对较多,也有不少的优化改进方案。   万…

apple pencil二代平替笔哪个好用?苹果平板平替笔排行

光是一款Apple Pencil&#xff0c;就卖到了接近一千多块&#xff0c;信息对于很多人来说都觉得太贵了。事实上&#xff0c;由于平替电容笔的性价比也非常高&#xff0c;因此它还是值得一试的。不管是学习&#xff0c;写作&#xff0c;还是绘画&#xff0c;这支平替电容笔&#…

自洽性改善语言模型中的思维链推理7.13、7.14

自洽性改善语言模型中的思维链推理 摘要介绍对多样化路径的自洽实验实验设置主要结果当CoT影响效率时候&#xff0c;SC会有所帮助与现有方法进行比较附加研究 相关工作总结 原文&#xff1a; 摘要 本篇论文提出了一种新的编码策略——自洽性&#xff0c;来替换思维链中使用的…

AI绘画 | 迷人武士美少女战士作品集

今天用Midjourney生成了质量极高的美少女武士后续会作为固定栏目来分享美图接下来请欣赏作品 提示词分享&#xff1a;1.an asian girl dressed in samurai style, in the style of anime aesthetic, trick of the eye paintings, dollcore, light red and black, resin, 8k, ex…

数据结构--图的基本操作

数据结构–图的基本操作 使用的存储模式&#xff1a; 图的基本操作&#xff1a; • Adjacent(G,x,y)&#xff1a;判断图G是否存在边<x, y>或(x, y)。 • Neighbors(G,x)&#xff1a;列出图G中与结点x邻接的边。 • InsertVertex(G,x)&#xff1a;在图G中插入顶点x。 • …

Apache HTTPD 多后缀解析漏洞

Apache HTTPD 多后缀解析漏洞 一、环境搭建二、漏洞原理三、漏洞复现 一、环境搭建 如下介绍kali搭建的教程 cd ~/vulhub/httpd/apache_parsing_vulnerability // 进入指定环境 docker-compose up -d // 启动环境docker-compose ps使用这条命令查看当前正在运行的环境 打开…

Java入门

目录 一、程序 什么是程序 二、计算机编程语言 1.计算机语言是什么 Java历史 特点 执行机制 计算机执行机制 Java的执行机制 三、JDK安装 名词解释 安装与校验 配置环境变量 四、第一个Java程序 编写代码 编译运行 规范 六、Java核心机制&#xff1a;JVM 1.…

【C语言】memcpy,memmove,memcmp,memset函数详解

memcpy,memmove,memcmp,memset函数详解 memcpy函数一、 memcpy函数的定义&#xff1a;二、memcpy函数的功能&#xff1a;三、memcpy函数模拟memcpy注意事项 memmove函数一、memmove函数简介二、memmove函数的模拟1.两种情况2模拟实现 memcmp函数memecmp函数介绍 memset函数mems…

数据结构(王道)——线性表的存储结构之双链表

双链表和单链表的对比 一、从无到有创建一个双链表及其基础操作 带头结点 的双链表 初始化 双链表的后插操作&#xff1a; 从后插可以拓展到按位序插入&#xff0c;和前插操作。 因为双链表的特性&#xff0c;如果按位序插入或者前插操作&#xff0c;只需要找到插入的位置的前…

基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程

首先前端发起HTTP请求之后&#xff0c;后端返回一个Excel输出流&#xff0c;然后前端用Blob类型接收数据&#xff0c;并且解析响应头数据以及提取源文件名&#xff0c;最后用a标签完成下载。 一、后端代码 &#xff08;1&#xff09;导入阿里巴巴的EasyExcel依赖&#xff08;…

不依赖yacc如何实现表达式按优先级解析

总结 无意发现一个非常有意思的简单语法解析器&#xff0c;不依赖lex/yacc&#xff0c;本文对其中比较难理解的表达式解析&#xff08;带优先级&#xff09;部分做一些分析和记录。 &#xff08;理解本文需要调试后面的代码部分&#xff0c;have fun&#xff01;&#xff09;…

219. 存在重复元素 II

给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;num…

React、Vue3中父组件如何调用子组件内部的方法

React 当父组件需要调用子组件的方法时&#xff0c;可以通过useImperativeHandle钩子函数实现。以下例子是ts实现方式。 在子组件中使用 useImperativeHandle 钩子&#xff0c;将指定的方法暴露给父组件&#xff0c;以便父组件可以通过子组件的引用来调用该方法。 在子组件中…