离线推送收不到主因是厂商通道未通,需云打包且配置严格匹配:华为含HUAWEI-前缀、小米须从推送页复制、OPPO需开启自启动等;SHA256指纹不一致、目录结构错误、监听位置不当均会导致失败。

离线推送收不到,90% 是厂商通道没通,不是代码写错了;必须云打包生效,基座调试完全无效。
厂商配置错一个字符,cid 就为空
manifest.json 里的厂商参数必须和后台控制台一模一样,大小写、空格、前缀都不能差:
- 华为:
huawei.appid必须是 AGC 控制台「应用信息」页显示的完整字符串(含HUAWEI-前缀) - 小米:
xiaomi.appid和xiaomi.appkey必须从「推送服务 → 应用配置」页单独复制,首页看到的“AppKey”是错的 - OPPO:
oppo.appKey和oppo.appSecret要严格对应,不能塞进meizu字段;且手机设置里必须打开「自启动」「通知使用权」 - 所有配置修改后必须重新云打包,
plus.push.getClientInfoAsync返回clientid为空,大概率是这里卡住了
SHA256 指纹不一致是最隐蔽的坑
本地调试用 debug.keystore,但云打包用的是 DCloud 后台生成的 release 证书——两者 SHA256 指纹不同,华为/小米等会静默丢弃消息,不报错也不提醒:
- 在 HBuilderX 中点击「发行 → 原生 App-云打包」,勾选「使用自有证书」并上传 release 签名文件
- 用
keytool -list -v -keystore your-release.keystore -alias your-alias提取 release 证书的 SHA256,填入各厂商后台 - 华为还额外要求在 AppGallery Connect 手动开启「应用回执状态」,并填写回调地址
https://thirdrcp-hz.getui.com/hw
nativeResources 目录结构必须严格对齐
配置文件放错位置,编译时根本不会打入 APK,等于白配:
- 手动创建与
uni_modules平级的nativeResources目录 -
nativeResources/android/assets/timpush-configs.json:从腾讯云 Push 控制台「厂商配置」页下载 -
nativeResources/android/google-services.json:仅 FCM 场景需要,放根目录下 - 若项目无该目录,HBuilderX 不会自动补全,必须手建
点击通知跳转只能靠 plus.push.addEventListener('click')
onLaunch 和 onShow 在离线点击场景下基本失效,iOS 热启动、Android 全场景都拿不到 payload:
- 监听必须写在
App.vue的onLaunch里,且用#ifdef APP-PLUS包裹 - 不要直接调用
uni.navigateTo,此时 Vue 实例未就绪,大概率白屏;推荐先uni.setStorageSync('push_payload', payload)缓存,首页onLoad再读取跳转 - payload 解析要兜底:
const payload = msg.payload ? (typeof msg.payload === 'string' ? JSON.parse(msg.payload) : msg.payload) : {} - 跳转路径不能带
.vue后缀,也不能以/开头(如pages/detail正确,/pages/detail.vue错误)
真正离线能力只存在于云打包后的安装包里,真机测试前务必确认 cid 已成功注册、厂商后台能查到 devicetoken,否则所有 JS 层逻辑都是空中楼阁。











