必须用自定义基座真机调试,android需厂商平台注册并配置appid/appkey,ios需有效apns证书,云服务须开通unipush 2.0;manifest中各厂商配置须严格匹配控制台信息,权限声明不可少,服务端推送仅支持unicloud云函数调用getpushmanager,目标用cid最稳。

uni.getPushClientId() 拿不到 cid?先确认这三件事
拿不到 cid 是最常卡住的第一步,不是代码写错了,而是环境没到位。
- 必须用「自定义基座」真机调试——默认基座不带厂商 SDK,
uni.getPushClientId会直接失败或返回空字符串 - Android 端需提前在各厂商平台(华为、小米等)完成应用注册,并把
appid/appkey填进manifest.json的对应位置;iOS 则必须上传有效的开发/生产证书(含 APNs Key 或 P12),否则 iOS 设备连初始化都过不去 - 云服务空间未绑定或未开通 uniPush 2.0 服务:即使客户端代码全对,
cid也只会是"undefined"或报错"push service not enabled"
manifest.json 里 push 配置怎么填才不白配
配置项看着多,但真正影响离线到达率的就几个关键字段,填错一个,华为/小米通知栏就收不到。
-
"huawei": { "appid": "xxx" }—— 华为appid必须和 AGC 控制台「项目设置 → 应用信息」里的完全一致,大小写敏感,漏一个字符都不行 -
"xiaomi": { "appid": "xxx", "appkey": "xxx" }—— 小米的appkey不是控制台首页看到的那个,得去「推送服务 → 应用配置」里单独找 - OPPO/VIVO 需额外开启「通知权限」和「自启动权限」开关,否则系统级通道压根不走;它们的
appKey/appSecret在 manifest 中统一写在"oppo"和"vivo"对象下,别塞错位置 - 千万别漏掉
"permissions":Android 12+ 要求显式声明<uses-permission android:name="android.permission.POST_NOTIFICATIONS"></uses-permission>,否则通知栏权限弹窗都不出来
服务端推送只能走 uniCloud 云函数?没错,而且不能绕
uniPush 2.0 的服务端接口是封闭的,你没法用个推 REST API 或自己调 APNs,硬接只会 401 或静默失败。
- 必须新建云函数(比如叫
push-message),并在依赖中只勾选uni-cloud-push扩展库 - 云函数里调用
uniCloud.getPushManager({ appId: "your-appid" }),这个appId必须和开发者中心「uni-push 2.0 → 应用信息」里显示的一致,不是 manifest 里的 bundleId - 推送目标用
cid最稳,别用 alias 或 tag:alias 在多设备登录场景下极易冲突,tag 同步延迟高,cid是设备唯一且实时可查的“收件地址” - 如果要强制通知栏弹出(哪怕 App 在前台),推送时传
force_notification: true;否则前台收消息只走 socket,不会触发系统通知
真机调试时通知不弹、日志没输出?重点查两个地方
现象是“明明发了,手机没反应”,大概率不是代码问题,而是权限链或通道被掐断了。
- 检查手机系统设置 → 应用通知管理 → 你的 App → 是否允许通知 + 是否允许悬浮通知(尤其小米/OPPO);关闭任意一项,离线推送就失效
- 抓包看请求是否抵达 uniPush 服务:在云函数里加
console.log("push sent to:", res),如果 log 有但手机没收到,说明厂商通道配置或审核没过(华为 AGC 审核常需 1–2 天,别刚填完就测) - iOS 测试务必区分环境:开发证书只支持开发环境推送,打生产包必须换生产证书 + 开通生产 APNs,混用会导致“能连上但收不到”
厂商通道不是“勾上就完事”,每个平台都有自己的审核节奏、签名规则和权限逻辑。最容易被跳过的,是华为 AGC 的「应用关联」和小米开放平台的「包名白名单」——这两步漏了,其他全对也没用。











