在iOS(Swift)应用中,注册第二个Firebase应用无法接收远程通知。

4
我有两个Firebase项目(在同一个帐户上,也可以是两个不同的帐户),每个项目都注册了一个相同Bundle ID的iOS应用程序(因此每个.plist文件都具有不同的Sender ID和Project ID,但Bundle ID相同)。
当我单独为每个应用程序使用FirebaseApp.configure()和该应用程序的firebase配置.plist文件配置Firebase消息时,它可以工作。我可以发送FCM消息并且应用程序接收到通知。(这意味着Firebase控制台上两个应用程序的配置以及苹果APNs密钥、plist文件均有效)。
但是,如果我想要注册两个应用程序以启用多个发送者向我的应用程序发送消息,则只有被注册为__FIRAPP_DEFAULT的应用程序会接收消息。
我的配置代码如下:
// this is configuration for the default "__FIRAPP_DEFAULT" using the base GoogleService-Info.plist file
FirebaseApp.configure()

// This is the second app configuration
let bundle = Bundle(for: type(of: self))
let path = bundle.path(forResource: "GoogleService-Info-second-app", ofType: "plist")
let options = FirebaseOptions.init(contentsOfFile: path!)
if options != nil {
  FirebaseApp.configure(name: "app2", options: options!)
}

我可以确认这两个应用程序都已经配置完好:

let apps = FirebaseApp.allApps
debugPrint(apps!)

输出:

["app2": <FIRApp: 0x1704585a0>, "__FIRAPP_DEFAULT": <FIRApp: 0x17044a9b0>]

然后,当我使用以下函数从我的AppDelegate获取令牌时:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let d = NSData(data: deviceToken)
    print(d)
    Messaging.messaging().retrieveFCMToken(forSenderID: firstAppSenderIdString) { (message, error) in
        print("FCM token for app1: \(message!)")
    }
    Messaging.messaging().retrieveFCMToken(forSenderID: secondAppSenderIdString) { (message, error) in
        print("FCM token for app2: \(message!)")
    }
}

我获得了两个有效的令牌:

FCM token for app1: fwjJVG2-T9Q:APA91bG8xVN9S-F4aERzh0GtcLWAqOy3dBPed0vPUE4AS_Jt4rau1bmmhvGPjfQgwBt9krdI9e91GaA04x4PXm4eW9PsG52P-Vt8yeo2woWGl3CP6zE09cT8ouRmOoWBhFfZkLbzbGul
FCM token for app2: fwjJVG2-T9Q:APA91bGggGD0YBZO5tpDqwdYKEbGX4vTSXnhwFoc_lrHbLIIWg1WE4RjTS8NYZ--TX-GkoypuEM4Plb4h41mVcP0uYjvo2dGDO3SNyuo3GrsBRb4ISzoieC_bcJZs5MibLKrET97f49j

如果我将两个应用程序都配置为自定义应用程序名称,并且没有一个应用程序使用"__FIRAPP_DEFAULT",那么即使是第一个应用程序也不会收到任何消息。

我猜想只有 "__FIRAPP_DEFAULT" 应用程序才能接收 FCM 消息。你能否确认或告诉我我的错误之处? 如果只有默认应用程序可以处理通知,那么在同一 iOS 应用程序中配置多个 Firebase 应用程序有什么用处?


参考文献显示,文档清楚地表明可以这样做:https://firebase.google.com/docs/reference/ios/firebasemessaging/api/reference/Classes/FIRMessaging#/c:objc(cs)FIRMessaging(im)retrieveFCMTokenForSenderID:completion: - Nicolas Massart
我在开源 SDK 版本中找到了这一行代码:https://github.com/firebase/firebase-ios-sdk/blob/6e12c501f8dde3057d26149826e82489e114b2a1/Firebase/Messaging/FIRMessaging%2BFIRApp.m#L45对我来说,这与我之前评论中的文档完全相矛盾。 - Nicolas Massart
我已经在此问题的PR#154上发表了评论(https://github.com/firebase/firebase-ios-sdk/pull/154#issuecomment-323999447)。 - Nicolas Massart
有人能在一个iOS应用程序中从两个Firebase项目接收通知吗? - Augie
@Augie,很抱歉我已经停止在iOS上的工作了,无法回答你的问题。 - Nicolas Massart
1个回答

0
如果两个Firebase应用程序具有相同的包标识符和推送证书,则可以使用推送通知获取FCM令牌。 因为retrieveFCMToken无法工作,我认为在调用retrieveFCMToken之前,您忘记设置FIRMessaging的APNSToken。
[FIRMessaging messaging].APNSToken = deviceToken;
[[FIRMessaging messaging] retrieveFCMTokenForSenderID:self.firstAppSenderIdString completion:^(NSString * _Nullable FCMToken, NSError * _Nullable error) {
    NSLog(@"FCM token for app1: %@ - error: %@", FCMToken, error);
}];

此外,如果默认应用程序未配置,则 FIRMessaging 将为 nil。您可以使用 tokenWithAuthorizedEntity 函数让第二个应用程序工作。
[[FIRInstanceID instanceID] tokenWithAuthorizedEntity:self.secondAppSenderIdString scope:kFIRInstanceIDScopeFirebaseMessaging options:@{@"apns_token": deviceToken} handler:^(NSString * _Nullable token, NSError * _Nullable error) {
    NSLog(@"FCM token for app2: %@ - error: %@", token, error);
}];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接