开发一时爽,上架火葬场

写代码的时候,为了赶进度,三方库能装就装,ohpm install 敲得飞起。功能确实跑通了,本地测试也没毛病。

然后你满怀信心地提审应用市场,结果第二天一看:审核被拒。

拒绝理由五花八门:“隐私政策未弹窗”、“申请了不必要的权限”、“集成的三方 SDK 存在后台下载行为”……这时候你再去翻代码,发现有些三方库是老版本,有些 SDK 是别人打包进去的,改起来牵一发而动全身。

这篇就聊聊 HarmonyOS 的三方库接入最佳实践,以及上架审核时那些让你一拒再拒的坑。都是血泪教训,看完能帮你省下几次提审的机票钱。

https://placeholder-01.jpg/

一、ohpm 与三方库的正确姿势

HarmonyOS 的包管理工具是 ohpm。接入三方库的标准流程是配置 oh-package.json5:

json

{
  "dependencies": {
    "@ohos/axios": "^2.2.0",
    "lib_common": "file:../lib_common"
  }
}

配置好后执行 ohpm install。

但这里有两个大坑:

第一,.har 包和源码依赖的混淆。
很多三方库提供的是 .har 包(编译后的二进制),也有一些是源码。.har 包升级方便,但遇到问题不好调试;源码方便改,但容易引入编译问题。建议核心业务用自己的源码库,非核心的工具类用 .har 包。

第二,cjs 和 ets 的兼容性问题。
HarmonyOS 7 主推 .ets,但很多第三方库还是 .js 或者 .cjs。引入时可能会报找不到模块。这时候需要在 build-profile.json5 里做转换配置,或者去找最新的兼容版本。

一个常见报错:
Error: Cannot find module 'xxx' or its corresponding type declarations.
这通常是因为三方库的 package.json 里 main 字段指向了错误的文件,或者没有声明 types。你可以自己在项目根目录建一个 types.d.ts 手动声明:

typescript

declare module 'some-legacy-lib' {
  export function doSomething(): void;
}

二、权限申请:最小化原则是铁律

上架审核被拒,90% 的原因出在权限上。

很多三方 SDK 在初始化时会索要一堆权限,比如通讯录、位置、相机。如果你的应用核心功能用不到这些,就别在 module.json5 里声明。一旦声明了,审核员就会问:“你要这个权限干嘛?”

正确的做法:
只在 module.json5 里声明应用实际需要的权限。比如你的应用只是个记事本,只需要 ohos.permission.INTERNET 和 ohos.permission.READ_MEDIA。别去碰 LOCATION 和 CAMERA。

另外,动态权限的申请时机非常重要。千万别在应用一启动就弹出一连串权限请求,用户会很反感,审核也容易被卡。要遵循“用到时再申请”的原则。

typescript

// 错误做法:onCreate 里申请一堆权限
async onCreate() {
  await requestPermissionsFromUser(['ohos.permission.CAMERA', 'ohos.permission.LOCATION']);
}

// 正确做法:在具体点击事件里申请
Button('扫一扫')
  .onClick(async () => {
    const atManager = abilityAccessCtrl.createAtManager();
    const result = await atManager.requestPermissionsFromUser(this.context, ['ohos.permission.CAMERA']);
    if (result.authResults[0] === 0) {
      // 打开相机
    }
  })

https://placeholder-02.png/

三、隐私政策:别搞“先斩后奏”

这是上架审核中最大的雷区。

很多应用一启动,直接进入主页,然后开始请求数据,过了两秒才弹隐私政策弹窗。这种“先斩后奏”的做法,在 HarmonyOS 应用市场是绝对会被拒绝的。

正确流程:
应用启动 -> 检查是否同意过隐私政策 -> 如果没同意,弹窗(此时不加载任何网络数据、不读取任何本地敏感数据)-> 用户点击“同意” -> 再执行初始化逻辑。

具体实现时,建议在 Ability 的 onWindowStageCreate 里加载一个专门的“隐私政策页面”或者展示一个弹窗,把首屏的加载逻辑推迟到用户同意之后。

typescript

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    const isAgreed = AppStorage.get('privacy_agreed');
    if (isAgreed) {
      windowStage.loadContent('pages/Index');
    } else {
      windowStage.loadContent('pages/PrivacyPage'); // 专门的隐私政策页
    }
  }
}

在 PrivacyPage 里:

typescript

Button('同意并继续')
  .onClick(() => {
    AppStorage.setOrCreate('privacy_agreed', true);
    router.replaceUrl({ url: 'pages/Index' });
  })

这是硬性规定,没有商量的余地。别想着耍小聪明,审核员见得太多了。

四、三方 SDK 的“隐形炸弹”

你用了三方推送 SDK,用了三方统计 SDK,用了三方地图 SDK……这些 SDK 在你的应用里,可能会偷偷干一些事。

常见问题:

  1. 后台静默下载:有些 SDK 会偷偷下载文件,审核发现后直接拒。

  2. 过度收集信息:比如统计 SDK 收集了设备型号之外的敏感信息。

  3. 自启动/关联启动:这也是审核严打的对象。

解决方案:

  1. 在隐私政策里明确列出所有三方 SDK 的名称和收集信息的类型。 少写一个都可能被拒。

  2. 去 SDK 官方找“合规版本”。很多大厂 SDK 都提供了符合 HarmonyOS 上架规范的版本,去官网找最新的。

  3. 如果某些三方库实在没法合规,考虑自己造轮子。 比如一个简单的网络请求库,自己封装一下比用一个不知名三方库安全得多。

https://placeholder-03.png/

五、打包与提审:细节决定成败

终于改完了,打包提审。但别急,还有几个细节要注意:

第一,签名证书。
必须在 AGC(AppGallery Connect)后台申请发布证书,别用调试证书提审。

第二,应用版本号。
每次提审,versionCode 必须比上一次大,versionName 也不能重复。不然系统会拒绝。

第三,测试账号。
如果你的应用需要登录,记得在 AGC 后台给审核员提供测试账号。如果审核员登不进去,直接一票否决。

第四,应用截图和描述。
别敷衍。截图要清晰,描述要准确,别写“最好的应用”这种违规词。

第五,隐私政策链接。
必须是一个真实可访问的网页链接,里面要有详细的隐私条款。

https://placeholder-04.jpg/

六、总结

三方库接入和上架审核,核心是“合规”两个字。记住三点:

  1. 权限能少则少,需要哪个申请哪个,别提前要。

  2. 隐私政策必须先弹窗,用户同意前别碰任何数据。

  3. 三方 SDK 要严查,隐私政策里必须列明,有问题的赶紧替换。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐