【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,一经查实,立即删除!

相关文章

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

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

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;…

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

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;…

Type-C PD显示器方案简介

方案概述 LDR6020 Type-C PD显示器方案可以给显示器提供一个全功能C口&#xff0c;支持手机&#xff0c;电脑&#xff0c;游戏主机等一线投屏功能&#xff0c;同时支持PD快充输出。LDR6020内置了 USB Power Delivery 控制器和 PD BMC PHY 收发器&#xff0c;支持PD2.0/3.0等快充…

Low-Light Image Enhancement via Self-Reinforced Retinex Projection Model 论文阅读笔记

这是马龙博士2022年在TMM期刊发表的基于改进的retinex方法去做暗图增强&#xff08;非深度学习&#xff09;的一篇论文 文章用一张图展示了其动机&#xff0c;第一行是估计的亮度层&#xff0c;第二列是通常的retinex方法会对估计的亮度层进行RTV约束优化&#xff0c;从而产生…

ceph----应用

文章目录 一、创建 CephFS 文件系统 MDS 接口1.1 服务端操作1.2 客户端操作 二、创建 Ceph 块存储系统 RBD 接口三、OSD 故障模拟与恢复四、创建 Ceph 对象存储系统 RGW 接口 一、创建 CephFS 文件系统 MDS 接口 1.1 服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /et…

Unity游戏源码分享-Third Person Controller - Shooter Template v1.3.1

Unity游戏源码分享-Third Person Controller - Shooter Template v1.3.1 功能非常齐全 AI格斗 2.5D 完整工程地址&#xff1a;https://download.csdn.net/download/Highning0007/88057824

node自主学习——fs文件操作模块

目录 读文件 读文件是否成功的判定 写文件 写文件是否成功的判定 备注&#xff1a;VsCode、node v18.17.0 读文件 fs.readFile(文件路径, 编码格式&#xff08;可选&#xff09;, 回调函数)// 回调函数可以打印失败和成功的结果 // 若成功&#xff0c;err的值为null // 若…

Spring【AOP】

AOP-面向切面编程 AOP&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 SpringAop中&#xff0c;通过Advice定义横切逻辑&#xff0c;并支持5种类型的Advice&#xff1a; 导入依赖 <dependency><groupId>…

前端JavaScript入门-day06

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 作用域 局部作用域 全局作用域 作用域链 JS垃圾回收机制 1. 什么是垃圾回收机制 2.内存的生命周…

缕析条分Scroll属性 | 京东云技术团队

最近有项目需要使用js原生开发滑动组件&#xff0c;频繁要用到dom元素的各种属性&#xff0c;其中以各种类型的height和top属性居多&#xff0c;名字相近&#xff0c;含义也很容易搞混。因此特地总结归纳了一下常用的知识点&#xff0c;在文末我们来挑战实现一个简易的移动端Sc…