iOS后台中cordova-plugin-fcm的FCMPlugin.onNotification函数未触发如何解决
这个问题我之前帮不少开发者排查过,iOS平台上FCMPlugin.onNotification在后台不触发,核心原因是iOS的推送机制和Android有本质区别,咱们一步步来解决:
1. 先搞懂iOS推送的两种触发逻辑
iOS对推送的处理分两种场景,直接决定onNotification是否会触发:
- 普通通知(无
content-available字段):应用后台时,系统会直接把消息展示在通知栏,只有用户点击通知进入应用时,才会调用onNotification。 - 后台可回调的通知:如果需要后台也触发
onNotification,必须在推送的payload里添加content-available: 1(注意是数字1,不是字符串),同时建议加上mutable-content: 1(如果需要动态修改通知内容的话)。
举个符合要求的payload示例:
{ "to": "你的设备TOKEN", "content_available": true, "mutable_content": true, "notification": { "title": "后台测试通知", "body": "这条消息能触发后台回调" }, "data": { "customKey": "customValue" } }
2. 开启iOS的后台推送权限
这是容易遗漏的关键步骤:
- 打开Cordova项目的iOS工程(路径:
platforms/ios/你的项目名.xcworkspace) - 切换到
Signing & Capabilities标签页 - 点击
+ Capability,搜索并添加Background Modes - 勾选
Remote notifications选项
3. 检查插件版本与配置
- 确保你用的是适配iOS13+的插件版本,旧版本可能存在API兼容问题。可以尝试重新安装插件:
cordova plugin remove cordova-plugin-fcm cordova plugin add cordova-plugin-fcm
- 确认
config.xml里已经正确引入了GoogleService-Info.plist:
<platform name="ios"> <resource-file src="GoogleService-Info.plist" /> </platform>
4. 确认
onNotification的注册时机 必须在deviceready事件触发后再注册监听,而且代码要放在全局不会被销毁的上下文里,比如:
document.addEventListener('deviceready', function() { // 注册通知监听 FCMPlugin.onNotification(function(notificationData) { console.log('收到通知:', notificationData); // 这里写你的通知处理逻辑 }, function(error) { console.error('通知监听失败:', error); }); }, false);
5. 验证用户通知权限
确保用户已经给应用授予了通知权限,包括允许后台通知展示。可以在启动时主动请求权限:
FCMPlugin.requestPermissions({ ios: { alert: true, badge: true, sound: true } }, function(permissionStatus) { console.log('当前权限状态:', permissionStatus); });
最后补充个小提示:iOS的后台推送不是100%稳定的,系统会根据应用活跃度、设备电量等因素限制回调频率,测试时尽量用真实设备,模拟器对后台推送的支持很有限。
内容的提问来源于stack exchange,提问作者sagarpdesai
相关产品推荐
相关产品推荐

