iOS上uni.onPush不触发主因是provider误设为'unipush',正确应为'firebase';Android收不到token多因google-services.json位置错误或Firebase插件未启用。
直接说结论:ios 上 uni.onpush 不触发,90% 是因为 provider 写成了 'unipush',而实际该用 'firebase';android 上收不到 token,大概率是 google-services.json 没放对位置,或 nativeplugins 里根本没启用 firebase 插件。
provider 必须设为 'firebase',不是 'unipush'
UniApp 的 uni.onPush 是个统一入口,但底层不认“firebase”这个词——它只认插件注册时声明的 provider 名。DCloud 官方 uni-push-2 插件默认 provider 是 'unipush',而 Firebase 插件(如 firebase-push)必须显式指定 provider: 'firebase',否则 JS 层监听完全失效。
常见错误现象:
-
uni.onPush回调函数从不执行,控制台也无报错 - 调用
uni.getProvider查到push列表里压根没有firebase
实操建议:
- 确认
nativeplugins/firebase-push/目录存在,且含android和ios子目录 - HBuilderX 中打开「原生插件配置」→ 找到该插件 → 勾选 Android + iOS → 点击「保存」
- 代码中必须写成:
uni.onPush({ provider: 'firebase', success() { ... } }) - 不要在
onShow或页面生命周期里调用,必须放在App.vue的onLaunch或onShow(首次启动后)
google-services.json 和 GoogleService-Info.plist 放哪才生效
这两个文件不是“丢进项目根目录就行”。它们必须被原生插件在编译期识别并注入到对应平台工程中,路径和命名都严格限定。
Android:
- 文件必须放在
nativeplugins/firebase-push/android/下(不是nativeplugins/根目录) - 文件名必须一字不差是
google-services.json(大小写敏感) - 检查 manifest.json 中
app-plus → android → permissions是否包含网络权限(android.permission.INTERNET)
iOS:
-
GoogleService-Info.plist必须放在nativeplugins/firebase-push/ios/下 - HBuilderX 导出 IPA 前,需手动打开 Xcode 工程,确认已开启:
Background Modes → Remote notifications和Push Notifications - manifest.json 中必须有:
"app-plus": { "ios": { "uses": { "push": true } } }
FCM 消息类型决定 JS 能否收到回调
很多人以为“推送发出去了,JS 就该能监听到”,其实 FCM 分两类消息,行为完全不同:
-
Notification 消息:由系统托盘自动展示,App 在后台或杀死状态都能收到,但 JS 层 不会触发
uni.onPushMessage -
Data 消息:不展示通知,只在 App 前台运行时 触发
uni.onPushMessage回调
所以如果你测试时把 App 杀掉再点通知,发现 uni.onPushMessage 没执行——这完全正常,不是 bug。
实操建议:
- 调试阶段,后端发消息时务必带
"data": { "key": "value" }字段,强制走 data 消息通道 - 上线后,通知类逻辑应拆开:托盘通知由系统处理;点击跳转逻辑要靠
uni.getPushMessage()在onLaunch和onShow中取参还原 - iOS 上首次启动时,
uni.getPushMessage()可能返回空对象,需加防错判断
iOS 获取 token 失败的三个硬性条件
Android 调 messaging.getToken() 通常能拿到 token,iOS 却常卡在 undefined 或 Promise.reject,根源不在 JS,而在原生配置缺一不可:
- Bundle ID 必须和 Firebase 控制台注册的 iOS 应用完全一致(包括大小写)
- 开发证书(.p12)必须绑定 APNs 推送能力,且导出的 .pem 文件与之配对
- Xcode entitlements 文件里必须有
aps-environment字段,值为development(开发)或production(发布)
如果 Xcode 报错 no valid "aps-environment" entitlement string found,说明证书没开通推送,得回 Firebase 控制台重新下载 GoogleService-Info.plist 并核对 Bundle ID —— 这步漏掉,token 永远拿不到。


















