【OpenHarmony/HarmonyOS】游戏启动与隐私合规设计:本地用户、协议勾选和应用内 WebView
【OpenHarmony/HarmonyOS】游戏启动与隐私合规设计:本地用户、协议勾选和应用内 WebView
启动页不只是 Logo 和“开始”按钮,它同时承担首次使用引导、隐私确认、用户初始化、资源预热和路由切换。本文结合 ArkUI 项目,分析怎样把这条链路做得清晰且不越过数据边界。🔐
一、启动页的真实职责
本项目启动后首先进入StartPage,而不是直接创建游戏引擎。启动页负责:
- 初始化或读取本地用户;
- 判断是否已经存在用户档案;
- 首次进入时要求勾选协议;
- 打开隐私政策和用户协议;
- 播放标题与按钮入场动画;
- 路由到主页;
- 提供设置入口。
这些事情都属于“进入产品前”的应用流程,不应该混入 Canvas 战斗引擎。
二、协议勾选必须在关键动作前校验
asynchandleStartGame(){if(!this.isLoggedIn && !this.isAgreementChecked) { promptAction.showToast({ message:'Please agree to privacy policy'});return; }if(!UserManager.getInstance().isLoggedIn()) {constname = UserManager.getInstance().generateRandomName();constavatar = UserManager.getInstance().generateRandomAvatar();awaitUserManager.getInstance().registerUser(name, avatar); } router.replaceUrl({ url:'pages/Index',params: { isLoggedIn:true} }); }先验证同意状态,再创建用户和进入主页。不能在用户点击之前就默认为同意,也不应把“浏览协议”当作“已经同意”。
当前UserManager.loadUser()在首次初始化时也会自动生成用户,这与启动页“同意后再注册”的语义有潜在冲突。如果生成的档案被视为个人信息处理,应将自动创建移动到用户确认之后;至少要让隐私文案与真实代码路径保持一致。
三、本地用户不等于第三方登录
当前用户系统生成本地昵称、头像和本地 ID,并通过 Preferences 保存。它不是华为账号、QQ 账号或云端账户。
const newUser: UserProfile = { userId: this.generateUUID(), userName, avatar, registerDate: Date.now() };项目中虽然存在QQAuthManager骨架,但真实 SDK 初始化和登录代码仍是 TODO。文章、截图和产品介绍都应该使用“本地游客档案”这一准确表述,避免让用户误以为已完成 OAuth 登录。
四、内置隐私弹窗与在线政策页
项目准备了两条展示路径:
PrivacyDialog:应用内简短条款和确认/取消按钮;WebViewPage:通过 Web 组件加载正式政策 URL。
启动页优先路由到 WebView:
router.pushUrl({url: 'pages/WebViewPage', params: { title: $r('app.string.privacy_title'), url: policyUrl } }).catch(() => { this.dialogController.open(); });路由失败时回退到本地弹窗,提高可用性。但如果网络不可用,WebView 页面本身也应该展示加载失败、重试或离线政策,而不能只显示空白。
五、WebView 页面保持最小能力 🌐
@Statetitle:string='';@Stateurl:string='';controller: web_webview.WebviewController=newweb_webview.WebviewController();aboutToAppear() {constparams = router.getParams()asRecord<string,string>;this.title= params['title'] ||'Details';this.url= params['url'] ||''; }Web({src:this.url,controller:this.controller}).width('100%') .layoutWeight(1);政策页面只需要标题、返回和 Web 内容。正式产品应限制 URL 来源,只允许配置中的 HTTPS 域名;不要把任意路由参数直接当作可信网页地址,否则会把内部 WebView 变成通用浏览器入口。
还应配置导航拦截:外链、下载、非 HTTPS Scheme 和跳转其他应用都要有明确策略。
六、隐私文案必须与代码一致
内置弹窗写着“纯本地单机、不上传数据”,但工程同时包含互联网权限、远程政策页、局域网 UDP 和未来云数据库模型。如果发布版本启用近场连接或云服务,绝对不能继续使用过时的“完全不联网”表述。
隐私审查应建立数据清单:
| 数据/能力 | 当前用途 | 存储/传输 |
|---|---|---|
| 随机昵称、头像 | 本地档案 | Preferences |
| 自选头像 URI | 显示头像 | 本地保存 URI |
| 战绩、晶石、升级 | 游戏进度 | Preferences |
| 局域网 IP、设备名 | 近场发现与邀请 | 局域网 UDP |
| 政策 URL 请求 | 展示在线协议 | HTTPS 网络 |
| 手机号/Token | 当前正式流程未落地 | 不应宣称已使用 |
任何能力上线、下线,都应同步修改政策、权限和数据清单。
七、路由为什么使用 replaceUrl?
开始游戏后使用:
router.replaceUrl({url: 'pages/Index' });replaceUrl替换启动页,用户按返回不会回到一次性引导页。设置和协议详情则使用pushUrl,因为它们需要返回原页面。
路由切换时项目还把页面转场设为 0,并预先放置深色底,减少全屏游戏在页面切换中出现白色闪烁。
八、启动动画的生命周期
标题使用animateTo完成透明度、位移和缩放入场,坦克与按钮使用周期变化:
await animateTo({ duration:1000, curve: Curve.EaseOut }, () => {this.titleOpacity =1;this.titleOffset =0;this.titleScale =1; });但周期动画通过setInterval启动后没有保存 ID,也没有在页面消失时清理。多次进入页面可能产生多个定时器。正确做法是保存句柄,在aboutToDisappear或onPageHide清除,并避免页面不可见时继续更新状态。
九、用户拒绝后应该怎样?
拒绝协议时应允许:
- 继续停留在启动页;
- 查看协议;
- 退出应用或返回系统;
- 在不需要个人数据处理的情况下提供有限离线体验,前提是产品和合规方案允许。
不要通过反复弹窗、默认勾选或模糊按钮诱导同意。设置页中还应提供再次查看政策、撤回授权和清除本地数据的入口。
十、权限申请应晚于解释
module.json5声明振动与网络权限,但敏感权限在需要时还应遵循系统授权流程。最佳体验是:
- 用户触发相关功能;
- 页面说明用途;
- 调用系统授权;
- 拒绝后功能降级并提供设置入口。
网络和振动权限的具体授权级别以目标 SDK 为准,但“最小权限 + 使用时申请”的原则不变。
十一、启动链测试清单 ✅
- 首次安装、已有用户、数据损坏三种启动路径;
- 未勾选协议时是否阻止档案创建和进入主页;
- 打开协议再返回后勾选状态是否正确;
- 无网络时政策页面是否有回退;
- WebView 是否阻止非白名单 URL;
- 快速连点开始按钮是否重复路由;
- 页面多次进入后是否残留定时器;
- 切换语言后协议入口文字是否更新;
- 清除用户数据后是否重新进入首次流程;
- 隐私文案是否覆盖近场 IP、头像 URI 和任何未来云能力。
十二、总结 ✨
一个可靠的 HarmonyOS 启动与隐私流程,需要同时满足体验和边界:
- 启动页承担同意、初始化和导航,不侵入游戏引擎;
- 用户明确同意后再执行需要的数据操作;
- 本地档案与第三方登录准确区分;
- 正式政策用 WebView 展示,并准备离线回退;
- WebView 只允许可信 HTTPS 地址;
- 隐私文案持续与实际数据行为同步;
- 一次性页面使用合适的路由替换;
- 定时动画跟随页面生命周期释放。
合规不是发布前补一段文案,而是数据、权限、交互和生命周期共同形成的产品行为。🔒
推荐标签:HarmonyOSOpenHarmonyArkUI隐私合规WebView用户引导
