欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
如果你觉得原生的隐私政策弹窗不够好看,想自己做一个漂亮的弹窗,同时又想避开“未经同意就收集 mac 地址、imei”这类审核问题,关键在于用对配置模式,并控制好代码执行时机。
核心思路:用 “none” 模式 + 自己写弹窗
你想要自定义弹窗样式,就不能使用原生 template 模板。正确的做法是,在 androidPrivacy.json 里把模式设为 "none",告诉原生引擎不要自动处理隐私弹窗,然后完全由你自己写一个页面或组件来展示。
但仅仅这样还不够,审核不通过的根本原因是:在用户点击“同意”之前,你的 app 或者内置的 sdk 就偷偷读取了设备信息。 所以,你的自定义弹窗必须做到以下两点:
- 阻断一切提前收集行为:在用户同意前,不要调用任何会触发权限请求或读取设备信息的 api,也不要去初始化那些不听话的第三方 sdk。
- 接管“同意”状态的判断:自己记录用户是否同意,并在后续逻辑中以此为依据。
具体实现步骤
1. 配置 androidPrivacy.json 为 “none” 模式
在你的项目根目录下,找到或新建 androidPrivacy.json 文件,写入以下内容。这是最关键的第一步,它让系统知道你要自己处理隐私弹窗。
{
"version": "1",
"prompt": "none"
}
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
2. 制作你的自定义隐私弹窗页面
创建一个新的页面,比如 pages/privacy/privacy.vue,把它做得要多好看有多好看。这个页面只做两件事:
- 展示你的《服务协议》和《隐私政策》。
- 提供“同意并继续”和“暂不同意”的按钮。
3. 在应用入口控制页面跳转逻辑
在 app.vue 的 onLaunch 生命周期里,你需要判断用户是否已经同意过协议。如果没同意,就跳转到你自己的隐私弹窗页;如果已经同意了,才可以进入主页面。
示例代码:
<script>
export default {
onLaunch: function() {
// 每次启动时,检查是否已同意隐私政策
const hasAgreed = uni.getStorageSync('user_privacy_agreed');
if (!hasAgreed) {
// 没同意过,就跳转到你自己的隐私页面
uni.reLaunch({
url: '/pages/privacy/privacy'
});
} else {
// 已经同意过了,可以安全地进行初始化
this.initApp();
}
},
methods: {
initApp() {
// 在这里执行你原来 onLaunch 里的逻辑
// 比如初始化第三方 sdk、检查更新等
console.log('用户已同意隐私政策,开始正常初始化');
}
}
}
</script>
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
4. 在你的自定义弹窗页面处理用户操作
在你的 privacy.vue 页面中,根据用户点击的不同按钮执行操作。
<template>
<view class="privacy-container">
<!-- 这里是你美美的弹窗内容 -->
<view class="content">
<text>欢迎使用我们的app!</text>
<text>请阅读并同意《服务协议》和《隐私政策》</text>
<!-- 你的协议链接... -->
</view>
<view class="footer">
<button @click="handleDisagree">暂不同意</button>
<button @click="handleAgree">同意并继续</button>
</view>
</view>
</template>
<script>
export default {
methods: {
handleAgree() {
// 1. 记录用户“同意”的状态
uni.setStorageSync('user_privacy_agreed', true);
// 2. 跳转到真正的应用首页
uni.reLaunch({
url: '/pages/index/index'
});
},
handleDisagree() {
// 根据应用市场规定,点击不同意通常需要退出应用
// 在 app 端可以使用 plus.runtime.quit() 退出
if (typeof plus !== 'undefined') {
plus.runtime.quit();
} else {
// 非 app 端的处理,比如提示一下
uni.showToast({
title: '需要同意协议才能使用',
icon: 'none'
});
}
}
}
}
</script>
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
需要特别注意的“坑”
- 三方 sdk 延迟初始化:如果你用了推送、统计、广告等 sdk,务必把它们从
onLaunch 里挪到用户点击“同意”之后(即上面的 initApp 方法里)再初始化。很多审核问题就是这些 sdk 在同意前偷偷启动并读取了信息。
- 原生插件排查:如果你集成了 uni 原生插件,用排除法检查一下,在用户同意前它们有没有静默收集信息。有问题的插件要升级或移除。
- 隐私政策内容要明确:在你美美的弹窗和隐私政策链接里,必须清晰、完整地列出你会收集哪些信息(比如 mac 地址、imei、oaid 等)以及用来干什么。不要用模糊的词语,比如“我们可能收集...”。可以参考 DCloud App引擎隐私政策 来补充。
- 不要用自定义基座提交审核:打包正式版提交市场,自定义基座可能不会触发合规逻辑。
总结
放弃原生模板,用 "prompt": "none" + 自定义页面,是完全可行的,也是很多开发者的选择。只要严格遵守“同意前,不收集;同意后,再初始化”的原则,美美的自定义弹窗也能顺利通过审核。
1 个回复
Ask小助手 - Ask社区AI助手
如果你觉得原生的隐私政策弹窗不够好看,想自己做一个漂亮的弹窗,同时又想避开“未经同意就收集 mac 地址、imei”这类审核问题,关键在于用对配置模式,并控制好代码执行时机。
核心思路:用 “none” 模式 + 自己写弹窗
你想要自定义弹窗样式,就不能使用原生
template模板。正确的做法是,在androidPrivacy.json里把模式设为"none",告诉原生引擎不要自动处理隐私弹窗,然后完全由你自己写一个页面或组件来展示。但仅仅这样还不够,审核不通过的根本原因是:在用户点击“同意”之前,你的 app 或者内置的 sdk 就偷偷读取了设备信息。 所以,你的自定义弹窗必须做到以下两点:
具体实现步骤
1. 配置
androidPrivacy.json为 “none” 模式在你的项目根目录下,找到或新建
androidPrivacy.json文件,写入以下内容。这是最关键的第一步,它让系统知道你要自己处理隐私弹窗。2. 制作你的自定义隐私弹窗页面
创建一个新的页面,比如
pages/privacy/privacy.vue,把它做得要多好看有多好看。这个页面只做两件事:3. 在应用入口控制页面跳转逻辑
在
app.vue的onLaunch生命周期里,你需要判断用户是否已经同意过协议。如果没同意,就跳转到你自己的隐私弹窗页;如果已经同意了,才可以进入主页面。示例代码:
4. 在你的自定义弹窗页面处理用户操作
在你的
privacy.vue页面中,根据用户点击的不同按钮执行操作。需要特别注意的“坑”
onLaunch里挪到用户点击“同意”之后(即上面的initApp方法里)再初始化。很多审核问题就是这些 sdk 在同意前偷偷启动并读取了信息。总结
放弃原生模板,用
"prompt": "none"+ 自定义页面,是完全可行的,也是很多开发者的选择。只要严格遵守“同意前,不收集;同意后,再初始化”的原则,美美的自定义弹窗也能顺利通过审核。要回复问题请先登录或注册
公告
更多>相关问题