uniapp开发的项目上传到国内主流应用市场(华为、小米、oppo、vivo)
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修改正确后,再次打包就可以了。
提交到应用市场
先提交到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隐私安全检测常见问题:
OPPO 开放平台-OPPO开发者服务中心
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、功能模块只勾必要的,且如果勾了,要在隐私政策中明确说明用途
uni-app官网
15、安卓权限配置参考:
uni-app官网
PS:如果你不确定权限部分的代码都是什么意思,不确定自己用到没,把权限代码全部复制到deepseek中问:含义、用途、必要性
16、manifest配置文档:
manifest.json 应用配置 | uni-app官网
17、隐私检测不通过时,下载报告和堆栈信息,到deepseek中分析一下。
18、隐私检测不通过:用户同意隐私政策后,存在收集软件列表、设备MAC地址的行为。
仔细看,标题说的是mac地址这一项,但改进建议中说明具体是因为传感器信息的收集 。
需要排查uniapp云打包相关的权限移除了没:
如果移除了,需要排查自身有没有用到传感器,很多第三方SDK和库会用到传感器信息,如图表、签字等,需要加到隐私政策中: