用途
该技能用于在 React Native 应用中为 CometChat 添加推送通知能力,覆盖 Android 的 FCM 与 iOS 经 Firebase 转发至 APNs 的链路,以及将设备令牌注册到 CometChatNotifications 的完整流程。它属于文档优先(docs-first)技能:要求先获取当前官方设置步骤,而不是照搬一份固定的 Firebase 教程。
前置条件与安装
推送不是 Web Push,没有 service worker。React Native 使用操作系统传输通道:
- Android:FCM,需要在 android/app/ 放置 google-services.json。
- iOS:FCM(经 Firebase → APNs),需要 GoogleService-Info.plist、在仪表盘上传 APNs 密钥,并在 Xcode 中开启 Push capability。
需先在 CometChat 仪表盘启用 Push Notifications,并为对应平台添加 provider。使用 @react-native-firebase/messaging 时,Android 与 iOS 都使用 FCM provider——Firebase 在 iOS 上转发到 APNs,并交给应用一个 FCM token,因此以 FCM 平台注册。原始 APNs(APNS_REACT_NATIVE_*)provider 仅用于跳过 Firebase、手写 PushKit / 原生 APNs 的场景。
主要能力与使用方式
接线分三步,顺序固定:
- 必须先完成 init() → login()。在登录前注册的令牌不属于任何用户。
- 从消息库(通常是 @react-native-firebase/messaging)获取设备令牌。
- 向 CometChat 注册:
CometChatNotifications.registerPushToken(token, CometChatNotifications.PushPlatforms.FCM_REACT_NATIVE_ANDROID, providerId)
平台常量必须与实际持有的令牌匹配。由于上述 Firebase 库在两个平台都产出 FCM token,Android 使用 PushPlatforms.FCM_REACT_NATIVE_ANDROID,iOS 使用 PushPlatforms.FCM_REACT_NATIVE_IOS(已在 @cometchat/chat-sdk-react-native 的 CometChat.d.ts 中验证)。APNS_REACT_NATIVE_DEVICE / APNS_REACT_NATIVE_VOIP 常量仅用于手写 PushKit 场景下的原始 APNs 设备/VoIP 令牌,不要与 Firebase FCM token 混用。具体参数顺序需查阅对应平台的文档页。CometChatNotifications、registerPushToken、unregisterPushToken 与 PushPlatforms 均已在 catalogs/rn-sdk-v4.json 中确认存在。
登出时注销:调用 unregisterPushToken()。跳过这一步会导致共享或复用设备继续收到上一个用户的通知。
令牌刷新不可省略:设备令牌会轮换。需订阅消息库的令牌刷新事件并重新注册,否则数天后部分用户的推送会静默失效——这是最难诊断的推送问题,因为当时没有任何报错。
VoIP / 通话通知
通话需要仅数据(data-only)推送,并配合原生拨号集成(CallKeep),使应用被杀时设备仍能响铃。这比消息推送的构建量大得多,且涉及 iOS 自身的 entitlements。需查阅 /notifications/react-native-push-notifications-android 与 …-ios 并按其执行,不要自行发挥。
适用场景
适用于需要为 React Native 版 CometChat 增加消息推送、排查“通知收不到”、接入 VoIP 通话推送或注册 FCM token 的场景。配套技能 cometchat-react-native-core(安装、provider 链、init→login→render)被假定已掌握,此处不重复。
限制与常见陷阱
该功能无法做冒烟测试:推送需要真机(或带 Play services 的 FCM 模拟器镜像)、真实凭据,且应用处于后台或被杀状态。它无法在 CI、无头环境或 iOS 模拟器上验证;features.rn-v5.json 已据此标注——没有真机证据的“可用”声明应视为未证实。
常见陷阱:登录前注册(令牌不归属任何用户);登出未注销(下一个用户收到上一个用户的推送);忽略令牌刷新(推送日后静默失效);平台常量错误(注册成功但永不投递);缺少 google-services.json / GoogleService-Info.plist(构建或注册失败);在 iOS 模拟器上测试(APNs 不工作);以为消息推送配置能覆盖通话(VoIP 需要 data-only 推送 + CallKeep)。
验证方式
所有发出的符号均在 catalogs/rn-sdk-v4.json 中;仪表盘已启用推送并为平台添加正确 provider;在真机上验证:应用后台与被杀时通知到达、点击打开正确会话、登出后设备不再收到该用户的通知。