雷敏
雷敏
  • 发布:2026-10-09 00:42
  • 更新:2026-10-09 00:42
  • 阅读:51

uni-push 鸿蒙取号失败

分类:鸿蒙Next

鸿蒙端调用 uni.getPushClientId 完全拿不到回调 —— success / fail / complete 一个都不触发, 重试 6 次(每次等 10 秒)全部超时,最后返回 null。 cs_device 表里永远 0 行,推送完全不可用。

环境
项 值
设备 HarmonyOS NEXT 6.0.2(API 22)
DevEco Studio 26.0.0.851
HBuilderX 5.26.2026091802
uni-app 编译器 5.26 (vue3)(@dcloudio/* 全部 3.0.0-5020620260917001)
项目类型 uni-app Vue3 CLI(vite)
bundleName com.play318.cs
DCloud appid UNI1A64FFB
已确认正确的配置(逐项核对过)
代码块

// 生成工程 entry/src/main/module.json5 中实际写入的内容
"metadata": [
{ "name": "GETUI_APPID", "value": "KFQm3tkeTr5iNsWmDuf9RA" },
{ "name": "client_id", "value": "6917617266493150846" }
],
"requestPermissions": [
{ "name": "ohos.permission.INTERNET" },
{ "name": "ohos.permission.GET_NETWORK_INFO" },
{ "name": "ohos.permission.APP_TRACKING_CONSENT" },
{ "name": "ohos.permission.GET_WIFI_INFO" }
]
manifest.json → app-harmony.distribute.modules 里有 "uni-push": {}
uni_modules/index.generated.ets 里已正确生成: import { getPushClientId } from '@uni_modules/uni-push' 等,initUniModules() 会调用 initUniExtApi()
oh-package.json5 依赖:@uni_modules/uni-push(HAR 1.0.3 → @getui/push 1.0.8 → @getui/gtc 1.0.5)
手机上 通知权限已开启(设置 → 通知 → 该应用 → 允许通知)
AGC 侧:推送服务已开通,agconnect-services.json 已放在 harmony-configs/ 并被复制到生成工程根目录
华为 AGC 里的 Client ID = 6917617266493150846,与写入包里的值一致
hvigor 编译零错误零警告,HAP 已签名并成功安装运行
关键代码
js

uni.getPushClientId({
success: (res) => { console.log('[push] 取号结果 = ' + JSON.stringify(res)) },
fail: (e) => { console.log('[push] 取号失败: ' + JSON.stringify(e)) },
complete: () => { console.log('[push] complete') },
})
控制台输出(真机):只有我自己打的"第 N 次取号…"和超时提示, 上面的 success / fail / complete 三条日志一条都没出现。

真机 hilog 里发现的两条线索
删掉我们自己的一个 JS 异常之前(现已修复,非本问题原因):

代码块

E A00000/com.play318.cs/JS_RUNTIME: [UniAppRuntime] JT:NAPICallback run failed:
OH_JSVM_CallFunction failed ReferenceError: since is not defined
说明原生 API 回调确实尝试执行过(只是被我们的异常打断)。修掉后此报错归零,但取号依然无回调。

修复后仍然存在(每次启动都有,仅一条):

代码块

E C03F00/com.play318.cs/ArkCompiler: [ecmascript] export objects of native so is undefined, so name is @ohos:ArkTS
个推 SDK 自己一条日志都没打 —— hilog 里按 push|getui 过滤,只有微信的 push_manager_service 日志, 我们 App 的进程(pid 已验证)下,个推/GTC 相关日志完全为零。

我们已排除的
❌ 不是通知权限(已开)
❌ 不是权限声明(SDK 要求的 4 个权限都在 HAP 里)
❌ 不是 GETUI_APPID / client_id 缺失或写错(值已核对,且前导空格也清掉了)
❌ 不是模块没链接(index.generated.ets 里确实注册了)
❌ 不是编译器版本(已从 5.24 升到 5.26,现象不变)
❌ 不是我们代码的异常(已修掉唯一的 JS 报错,现象不变)
★★★ 最终诊断(反汇编字节码 + 真机 hilog 双向确认)
我把 HAP 里的 ets/modules.abc 用 ark_disasm 反汇编,读到了 uni-push 鸿蒙实现的完整逻辑:

① getPushClientId 为什么"没有任何回调"

代码块

.function UniPush#getPushClientId(options) {
if (!this.isInitializeComplete) { // 初始化没完成
this.initializeCompleteCallbackList.push(...) // 把回调塞进队列
return // ★ 直接返回,success/fail 都不调!
}
if (this.initializeErrInfo !== null) { // 初始化失败才回调 fail
options.fail({ errSubject:"uni-push-getPushClientId", errCode:1505032 })
}
...
}
这就是"success/fail/complete 全都不触发"的原因 —— 初始化未完成时回调被无限排队,而 initializeErrInfo 又是 null,所以连失败回调都没有。

② 初始化在哪里被触发

代码块

newobjrange ... // 创建 uniPush 单例
ldexternalmodulevar UTSHarmony
ldobjbyname "onAppAbilityCreate" // ★ uniPush.init() 在"Ability 创建"回调里
callthis1 ...
而 onAppAbilityCreate 的实现是:appLifeCycle.on("create", callback)(见 @dcloudio/uni-mp-sdk 反汇编)。 即:uniPush.init() 只在应用 Ability 的 "create" 事件里执行一次。

③ init() 内部做了什么

代码块

UniPush#init() {
notificationManager.requestEnableNotification() // 请求通知授权(Promise)
.then(initializeCompleteCallback) // 成功后标记完成
...
PushManager.initialize({ context, onSuccess, onFailed })
PushManager.setPushCallback({ onReceiveClientId, onReceiveDeviceToken, ... })
}
④ 真机 hilog 证明"初始化跑了、华为 token 拿到了、但 CID 没换回来"

代码块

I C05500/cloudinterfaceauth: GetAppIdentifier Bundle Name: com.play318.cs, appIdentifier: 6917617266493150846
I C05300/com.play318.cs/push: PushManagerProxy GetToken begin
I C05300/com.play318.cs/push: Token cache is invalid, set it
I C05300/com.play318.cs/push: Get token success result is MAMzLgcXZrsDpLI**vZ1hUmVkjmRg5mQ
I C01650/com.play318.cs/Config: Log:Error(283) recovered 9 frames from WAL file .../gtc.db-wal
I C01650/com.play318.cs/ConnectionPool: Create:code:0 ... gtc
:<DB,0x164583,4096,100660>...
I C01650/com.play318.cs/RdbStoreImpl: HandleSchemaDDL:db:gtc exe DDL schema<0->1>
环节 状态
Push Kit 服务权限 ✅ granted capability: com.huawei.service.push.base_service
appIdentifier(系统下发给 SDK) ✅ 6917617266493150846 = AGC Client ID,完全正确
华为 Push Kit 返回 token ✅ Get token success result is MAMzLg…
个推 SDK 初始化被调用 ✅ PushManagerProxy GetToken begin(说明 getToken 已发出)
个推 SDK 本地库建立 ✅ gtc
.db 创建成功、schema 执行成功
拿华为 token 向个推服务器换 CID ❌ 全程静默 —— 无 CID、无 onReceiveClientId、无错误回调、无网络请求日志
结论:不是设备/AGC/应用配置/权限问题,而是个推服务端没有为这个应用签发 CID。 即 @getui/push 1.0.8 的鸿蒙通道(对该 AppID KFQm3tkeTr5iNsWmDuf9RA)在个推侧可能未开通,或该 SDK 版本与 HarmonyOS 6.0.2 / API 22 不兼容。

想问的问题
个推应用 KFQm3tkeTr5iNsWmDuf9RA 是否已在个推后台开通「鸿蒙」通道? 如果没有,需要在哪里开通?(DCloud 后台的「鸿蒙next 厂商推送设置」是否就等于开通?)
个推鸿蒙 SDK 1.0.8(@getui/push)/ 1.0.5(@getui/gtc)是否支持 HarmonyOS 6.0.2 / API 22? 两个 HAR 的 compatibleSdkVersion 都是 12 且是 byteCodeHar,我们工程是 22。
华为 token 已成功返回(见上),但个推侧无任何响应、无错误回调 —— 还有哪些前置条件需要满足?
uniPush.init() 只在 UTSHarmony.onAppAbilityCreate(appLifeCycle.on("create"))里触发一次, 如果该事件已经发过,init 就永远不执行 —— 这个设计是否会导致偶发取不到号? 是否有可以在 JS 侧主动触发初始化的公开 API?
DCloud 后台「uni-push 2.0 → 厂商推送设置 → 鸿蒙next」标签,对本地打包(运行到鸿蒙)是否有影响? (鸿蒙没有云打包,只有本地打包)

2026-10-09 00:42 负责人:无 分享
已邀请:

要回复问题请先登录或注册