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修改正确后,再次打包就可以了。

如果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和库会用到传感器信息,如图表、签字等,需要加到隐私政策中:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

monika_yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值