iOS应用如何接收另一Firebase项目的推送通知?求解决方案
实现iOS应用接收多个Firebase项目的推送通知
嘿,这个需求我之前实操过,完全可以搞定!既然你已经把B项目的实时数据库读写弄好了,扩展到推送通知只需要多几步配置和代码调整就行,具体方案如下:
核心思路
Firebase允许单个iOS应用关联多个Firebase项目,每个项目对应独立的FirebaseApp实例。要接收多个项目的推送,关键是为每个Firebase实例分别注册APNs设备令牌,同时确保两个项目都正确配置了你的App的APNs证书。
具体步骤
1. 初始化第二个Firebase实例(项目B)
你已经有了B项目的FirebaseOptions配置,只需要给它指定一个自定义名称来初始化独立实例,避免和默认的A项目实例冲突:
// 假设你已经构建好B项目的FirebaseOptions let bFirebaseOptions = FirebaseOptions( googleAppID: "B项目的Google App ID", gcmSenderID: "B项目的GCM Sender ID" ) bFirebaseOptions.bundleID = Bundle.main.bundleIdentifier! bFirebaseOptions.apiKey = "B项目的API Key" bFirebaseOptions.databaseURL = "B项目的实时数据库URL" // 初始化命名为"BProject"的Firebase实例 FirebaseApp.configure(name: "BProject", options: bFirebaseOptions)
2. 为两个Firebase实例分别注册FCM令牌
APNs设备令牌是App级别的,同一个App只有一个令牌,但你需要把这个令牌分别注册到A、B两个Firebase项目的FCM服务中,这样两个项目都能通过这个令牌给你发推送:
// 先获取B项目的Messaging实例 guard let bFirebaseApp = FirebaseApp.app(name: "BProject"), let bMessaging = Messaging.messaging(app: bFirebaseApp) else { print("无法获取B项目的Messaging实例") return } // 在APNs令牌注册回调中,同时给两个FCM实例设置令牌 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // 给默认的A项目实例注册令牌 Messaging.messaging().apnsToken = deviceToken // 给B项目实例注册令牌 bMessaging.apnsToken = deviceToken // 获取并保存A项目的FCM令牌(用于A项目服务器发推送) Messaging.messaging().token { token, error in if let token = token { print("A项目FCM令牌: \(token)") // 这里可以把令牌上传到你的后端或者A项目的服务中 } } // 获取并保存B项目的FCM令牌(用于B项目服务器发推送) bMessaging.token { token, error in if let token = token { print("B项目FCM令牌: \(token)") // 同样上传到对应后端或B项目服务中 } } }
3. 配置两个Firebase项目的APNs证书
这一步很关键!你需要在A、B两个Firebase项目的控制台中,上传同一个APNs证书(对应你的App的Bundle ID,开发/生产环境要分别配置)。这样两个项目都拥有向你的App发送APNs通知的权限。
4. 区分处理不同项目的推送
当App收到推送时,可以通过推送消息中的from字段(对应Firebase项目的GCM Sender ID)来判断是来自A还是B项目,然后分别处理:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // 从userInfo中获取发送方的Sender ID if let senderID = userInfo["from"] as? String { if senderID == "A项目的GCM Sender ID" { // 处理A项目的推送逻辑 print("收到A项目的推送: \(userInfo)") } else if senderID == "B项目的GCM Sender ID" { // 处理B项目的推送逻辑 print("收到B项目的推送: \(userInfo)") } } completionHandler(.newData) }
注意事项
- 确保两个Firebase项目的Bundle ID配置和你的App完全一致;
- 发送推送时,A项目要使用A项目的FCM令牌,B项目使用B项目的FCM令牌,不要搞混;
- 如果使用
UNUserNotificationCenter的现代通知框架,在didReceiveNotificationResponse回调中同样可以通过notification.request.content.userInfo获取from字段来区分来源。
这样设置之后,你的App就能同时接收A、B两个Firebase项目的推送通知了,亲测可行!
内容的提问来源于stack exchange,提问作者HunterChen
相关产品推荐
相关产品推荐

