manifest中的配置
基础配置
AppID: uniapp创建项目后会自动生成,不能随意变更。
应用名称:发行为App时作为应用桌面图标的名称。
应用描述:用于简单介绍应用情况,发行为App时不会使用。可以不填。
应用版本名称:云端打包后设置为原生工程的应用版本名称。如:主版本号.次版本号.编译版本号
应用版本号:应用的内部版本号,必须使用整数,用于记录开发版本的。建议每次发布(云端打包)时更新为比上一次高。云端打包后设置为原生工程的应用版本号。安装时只能高版本的安装包覆盖升级低版本的安装包,提交各应用市场时也要求必须更新为比上次高的版本。
图标配置
在“自动生成图标”部分选择图标(1024*1024),点击“自动生成所有图标并替换”。
启动界面
安卓隐私政策
请在《隐私政策》中必告知用户您的应用基于DCloud uni-app(5+ App/Wap2App)开发,增加如下参考条款
我们的产品基于DCloud uni-app(5+ App/Wap2App)开发,应用运行期间需要收集您的设备唯一识别码(IMEI/android ID/DEVICE_ID/IDFA、SIM 卡 IMSI 信息、OAID)以提供统计分析服务,并通过应用启动数据及异常错误日志分析改进性能和用户体验,为用户提供更好的服务。详情内容请访问《DCloud用户服务条款》。(DCloud用户服务条款超链至:https://ask.dcloud.net.cn/protocol.html)
androidPrivacy.json文件配置隐私政策提示框。注意配置《隐私政策》和《服务协议》的链接地址。
注意!androidPrivacy.json不要添加注释,会影响隐私政策提示框的显示!!!
androidPrivacy.json:
{
"version": "1",
"prompt": "template",
"title": "服务协议和隐私政策",
"message": " 请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/> 你可阅读<a href=\"static\/privacy\/agreement.html\">《服务协议》</a>和<a href=\"static\/privacy\/privacy.html\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept": "同意并接受"
}
配置文档:uni-app官网
ios隐私政策弹窗
// app.vue 的 onLaunch 中添加
// 获取系统类型
const platform = uni.getSystemInfoSync().platform
// iOS隐私控制
if (platform === 'ios' && !uni.getStorageSync('privacyAgreed')) {
// 未同意隐私协议,跳转到隐私协议页
uni.navigateTo({
url: '/pages/ios-privacy/ios-privacy',
success: () => {
plus.navigator.closeSplashscreen()
}
})
} else {
// 已同意隐私协议,跳转到首页
uni.switchTab({
url: '/pages/index/index',
success: () => {
plus.navigator.closeSplashscreen()
}
})
}
//pages.json中添加
{
"path": "pages/ios-privacy/ios-privacy",
"style": {
"navigationStyle": "custom",
"disableSwipeBack": true,
"app-plus": {
"animationType": "none",
"bounce": "none"
}
}
},
//ios-privacy.vue
<template>
<view class="privacy-container">
<!-- 半透明背景层 -->
<view class="mask" :style="{ backgroundColor: maskColor }"></view>
<!-- 弹窗主体 -->
<view class="dialog" :style="dialogStyle">
<view class="title">服务协议和隐私政策</view>
<scroll-view class="content" scroll-y>
请您务必审慎阅读、充分理解<text class="link" @tap="openAgreement(1)">《服务协议》</text>和<text class="link" @tap="openAgreement(2)">《隐私政策》</text>各条款,包括设备标识收集、数据分析等核心内容。
</scroll-view>
<view class="button-group">
<button class="btn refuse" @click="handleDisagree">暂不同意</button>
<button class="btn agree" @click="handleAgree">同意并继续</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
maskColor: 'rgba(0,0,0,0.6)', // 更深的背景遮罩
dialogStyle: {
width: '75%',
borderRadius: '14px',
backgroundColor: '#fff',
boxShadow: '0 4px 12px rgba(0,0,0,0.15)'
}
}
},
methods: {
// 协议跳转(动态获取链接)
openAgreement(type) {
if (type === 1) {
// 服务协议
uni.navigateTo({ url: '/pages/account/docs/user-agreement' })
} else {
// 隐私政策
uni.navigateTo({ url: '/pages/account/docs/pravicy-policy' })
}
},
// 同意处理
handleAgree() {
uni.setStorageSync('privacyAgreed', '1')
uni.reLaunch({ url: '/pages/index/index' })
plus.navigator.closeSplashscreen()
},
// 拒绝处理(iOS退出)
handleDisagree() {
if (plus.os.name.toLowerCase() === 'ios') {
const application = plus.ios.import("UIApplication").sharedApplication()
application.performSelector("exit")
}
}
}
}
</script>
<style lang="scss">
.privacy-container {
position: fixed;
width: 100%;
height: 100%;
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
.mask {
position: absolute;
width: 100%;
height: 100%;
}
.dialog {
position: relative;
padding: 22px 20px;
transform: translateY(-10%); // 稍微上移
.title {
font-size: 17px;
font-weight: 600;
text-align: center;
margin-bottom: 12px;
color: #333;
}
.content {
height: 120px; // 减少高度
font-size: 14px;
line-height: 1.6;
margin-bottom: 16px; // 减少与按钮的间距
color: #666;
padding: 0 4px;
.link {
color: #007AFF;
}
}
.button-group {
display: flex;
border-top: 0.5px solid #e5e5e5;
padding-top: 16px;
.btn {
flex: 1;
margin: 0 6px;
height: 38px;
line-height: 38px;
font-size: 15px;
border-radius: 8px;
font-weight: 500;
border: none; /* 移除默认边框 */
outline: none; /* 移除点击时的轮廓线 */
position: relative; /* 为伪元素定位做准备 */
overflow: hidden; /* 处理可能的边框溢出 */
/* 使用after伪元素改善按钮边缘 */
&:after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 200%;
height: 200%;
transform: scale(0.5);
transform-origin: 0 0;
pointer-events: none;
box-sizing: border-box;
border: 0; /* 完全移除uni-app默认边框 */
border-radius: 16px; /* 因为缩放了0.5,所以这里是8px的2倍 */
}
&.refuse {
background-color: #f2f2f2;
color: #666;
}
&.agree {
background-color: #007AFF;
color: #fff;
}
}
}
}
}
</style>
打包
使用hbuilderx中的云打包功能,提交云打包申请。
云打包失败案例
在经过一系列的manifest修改后,打包出现如下错误:
错误日志中出现这样的信息:
[Error] W: error: invalid manifest package override '~'.
原因:manifest中有错误,IDE中没有提示,将manifest修改正确后,再次打包就可以了。
如果manifest确保没有问题,还是出现这个错误,就清理一下缓存,重新打包
提交到应用市场
先提交到vivo应用市场,会自动同步到:OPPO、荣耀、小米。
vivo地址:vivo开放平台
按照提示填写资料提交审核即可。
常见问题
1、应用名称、开发者名称、隐私政策中的应用名称和开发者、软著上的应用名称和开发者,必须保持一致,一个字都不能错!
2、如果一个软著对应有2个应用,如A-用户端、A-工程师端,需要保持应用名称的主标题与软著上的名字完全相同,不同端用副标题区分,且在审核备注中说明清楚。
3、隐私政策中必须将所有用到的权限都明确说明,隐私政策需要有远程链接地址。
4、应用截图中不能有二维码、手机号等敏感信息。
5、app必须备案,且保证一个应用对应一个备案,应用名称、包名、开发者必须保持一致。
6、提交审核前,先在隐私自检中提交隐私自检,通过后再提交上架审核。
7、一句话简介中出现的名称需要和应用名称或开发者主体保持一致。
8、APP隐私政策中公示的SDK要与全国SDK管理服务平台登记SDK公示信息完全一致,要求一致的公示信息包括:SDK名称,开发者信息,隐私政策链接。
全国SDK管理服务平台:
全国SDK管理服务平台-汇聚全网主流SDK产品,指引正品SDK下载
9、app中SDK隐私安全检测常见问题:
10、UniApp 引擎即使未勾选广告模块,其底层公共类(如 io.dcloud.ad.*)仍可能被隐私检测工具误判为广告 SDK 存在:
检测出数字天堂uni-AD原生广告SDK及相关权限使用:mac 传感器 软件安装列表
问题参考链接:在OPPO应用商店被标记“有广告”,是数字天堂的问题 - DCloud问答
解决办法:
(1)使用最新版本hbuilderx打包做隐私自检
(2)修改隐私政策,把dcluod的隐私协议挂到自己的隐私政策里面去,然后直接提交审核,并在审核备注里面说明:本应用基于 DCloud UniApp 框架开发,检测到的 "uni-ad 原生广告"或“数字天堂uni-AD原生广告” 相关代码和权限使用为框架默认集成的启动逻辑复用代码,并非实际广告功能。已通过 manifest.json 禁用广告模块,并在隐私政策中补充说明。应用内无uni-ad相关行为,敬请审核。
11、外链功能合规要求
- 功能归属声明:需在应用描述页标注"商城功能为第三方网页服务"
- 隐私政策说明:明确外链功能的数据处理方(如"支付由XX平台独立完成")、
***功能为外部网页服务,由***独立运营。在相关功能中,我们不会收集或处理您的个人信息,也不会向第三方应用提供您的个人信息。
12、manifest中多余的权限申请需要删除
13、Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息 - DCloud问答
14、功能模块只勾必要的,且如果勾了,要在隐私政策中明确说明用途
15、安卓权限配置参考:
PS:如果你不确定权限部分的代码都是什么意思,不确定自己用到没,把权限代码全部复制到deepseek中问:含义、用途、必要性
16、manifest配置文档:
manifest.json 应用配置 | uni-app官网
17、隐私检测不通过时,下载报告和堆栈信息,到deepseek中分析一下。
18、隐私检测不通过:用户同意隐私政策后,存在收集软件列表、设备MAC地址的行为。
仔细看,标题说的是mac地址这一项,但改进建议中说明具体是因为传感器信息的收集 。
需要排查uniapp云打包相关的权限移除了没:
如果移除了,需要排查自身有没有用到传感器,很多第三方SDK和库会用到传感器信息,如图表、签字等,需要加到隐私政策中: