You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS端Firebase Cloud Messaging通知消息接收异常求助

兄弟,我之前也踩过iOS FCM通知的大坑,给你捋捋排查方向,再说说能不能提交的事儿:

先排查iOS NOTIFICATION消息不显示的核心原因

你的情况是DATA消息正常、Android完全没问题,说明FCM的基础配置(比如GoogleService-Info.plist、依赖库)是OK的,问题大概率出在APNs转发或者iOS端的通知配置上:

  • 确认APNs生产证书的有效性:FCM的NOTIFICATION消息是靠APNs推送到iOS设备的,TestFlight属于生产环境,你必须用生产环境的APNs推送证书,而且要保证:

    • 证书绑定的Bundle ID和TestFlight版本的完全一致;
    • 证书没有过期,并且已经正确上传到Firebase控制台的「项目设置 > 云消息传递」里;
    • 证书的私钥没有丢失,生成的时候是正确导出的p12文件。
  • 理清楚FirebaseAppDelegateProxyEnabled的逻辑:你提到了这个开关的两种情况,这里要注意:

    • 如果开启(默认YES):Firebase会自动接管APNs的代理回调,这时候你的AppDelegate里不要手动实现didReceiveRemoteNotificationwillPresentNotification这类APNs方法,否则会抢回调导致Firebase收不到通知;如果必须实现,一定要调用Firebase的代理方法传递事件,比如在willPresentNotification里调用Messaging.messaging().appDidReceiveNotification(response.notification.request.content.userInfo)
    • 如果关闭(NO):你必须手动在AppDelegate中完成APNs的权限请求、回调处理,并且把消息手动传给FCM——比如在didReceiveRemoteNotification里调用Messaging.messaging().appDidReceiveMessage(userInfo),同时权限请求必须包含UNAuthorizationOptions.alert,否则通知不会弹窗。
  • 检查设备的通知权限:TestFlight部署的生产环境App,用户首次打开时的权限请求一定要弹出,而且要确保用户授予了「允许通知」(包括弹窗、声音权限)。你可以在App里加个小逻辑,用UNUserNotificationCenter.current().getNotificationSettings { settings in ... }实时查看权限状态,说不定你的测试设备不小心拒绝了权限,自己没注意到。

  • 核对PyFCM的消息配置:发送NOTIFICATION消息时,PyFCM的参数必须符合iOS的要求:

    • 必须包含notification字段(而不是只有data),里面要有titlebody
    • 针对iOS的apns配置里,aps字典必须包含alert(可以是字符串或者包含title/body的字典),不要漏了这个核心字段;
    • 先别加mutable-contentcategory这类进阶配置,先发送最基础的纯文本通知测试。
  • 排除单设备问题:你怀疑是测试设备的孤立问题,这个很有道理——可以找另一台iOS设备(比如iPhone 13/14)用TestFlight安装你的App测试,或者用Ad Hoc包发给其他测试同学试试。另外,检查你的iPhone SE系统版本,如果是iOS 14及以下,建议升级到最新稳定版,旧系统偶尔会有APNs的兼容性问题。

关于是否可以提交应用的建议

如果经过上面的排查,确认NOTIFICATION消息的问题仅在你的这台iPhone SE上出现,其他iOS设备测试正常,并且你已经确保APNs证书、权限、消息配置都没问题,那是可以提交应用的,但要注意:

  1. 尽量多找2-3台不同型号、不同系统版本的iOS设备测试,确保不是普遍问题;
  2. 在App Store Connect的「测试信息」里备注这个情况,说明你已经排查过配置,目前仅个别设备出现异常;
  3. 上线后要监控用户反馈,如果有大量用户反映收不到通知,及时发布修复版本。

内容的提问来源于stack exchange,提问作者poultrynews

火山引擎 最新活动