Firebase FCM 推送通知停止工作 iOS 11.1.1

Posted

技术标签:

【中文标题】Firebase FCM 推送通知停止工作 iOS 11.1.1【英文标题】:Firebase FCM push notifications stopped working iOS 11.1.1 【发布时间】:2018-04-25 02:40:52 【问题描述】:

我正在使用 Firebase FCM 从 ios 设备发送推送通知。推送通知确实有效,直到昨天。

当我现在发送推送通知时,一切都显示成功,但设备上没有收到任何内容。

如果我直接通过 curl 请求发送,这是响应:

"multicast_id":7815294000653973158,"success":1,"failure":0,"canonical_ids":0,"results":["message_id":"0:1510474219556035%ca9ff0f8ca9ff0f8"]

如果我从 Firebase 控制台上的通知仪表板发送,它会显示成功完成。

我做了以下没有成功:

    根据FCM Push notifications do not work on iOS 11 锁定在“FirebaseInstanceID”“2.0.0”的 pod 在开发者控制台上生成了一个新的 APN 密钥,并替换了 Firebase 中 FCM 设置中的现有密钥 下载了新的 GoogleService-Info.plist 并替换了现有的 检查了 bundle id 等是否全部匹配 将 firebase pod 更新为最新:

使用 Firebase (4.5.0) 使用 FirebaseAnalytics (4.0.4) 使用 FirebaseAuth (4.3.1) 使用 FirebaseCore (4.0.10) 使用 FirebaseFirestore (0.9.1) 使用 FirebaseInstanceID (2.0.5) 使用 FirebaseMessaging (2.0.6)

    打开和关闭消息混合 按照Firebase notifications not working in iOS 11设置Messaging.messaging().shouldEstablishDirectChannel = true 从 Firebase 控制台中删除了这个 iOS 应用并从头开始重新设置通知 确保功能中的远程通知仍处于打开状态 重启了我的设备

我的设置: 我在重写 init() 方法中调用 AppDelegate 文件中的 FirebaseApp.configure():

  override init() 
    super.init()
    FirebaseApp.configure()
  

在 AppDelegate 中 didFinishLaunchingWithOptions:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

    // get push notification token id for user
    if #available(iOS 10.0, *) 
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self

        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: _, _ in )
     else 
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    

    application.registerForRemoteNotifications()

    return true

然后我将我的令牌保存在 userdefaults 中并稍后保存到数据库:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
    if let refreshedToken = InstanceID.instanceID().token() 
        defaults.set(refreshedToken, forKey: Constant.UserDefaults.token)
        print("Token generated: ", refreshedToken)
     else 
        print("Could not save token becuase error with instance id token")
    

这里生成的token我也用上面提到的curl测试过,都显示成功了。

我的 GoogleService-Info.plist:

我的信息.plist:

如果需要任何其他信息,请告诉我。

我的 android 应用程序仍然像以前一样工作。我正在努力理解 iOS 应用程序在一天内会发生什么变化,或者我可能在一天内破坏了什么:)

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

好的,解决了。我通过将其添加到我的 Info.plist 中来禁用 Firebase 的消息 swizzling:FirebaseAppDelegateProxyEnabled: NO

我还删除了所有 firebase 消息传递委托方法。并在 didRegisterForRemoteNotificationsWithDeviceToken 中生成了我自己的 APN 令牌,并在生成令牌后在 didRegisterForRemoteNotificationsWithDeviceToken 方法中设置 Messaging.messaging().apnsToken = deviceToken。

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
    if let refreshedToken = InstanceID.instanceID().token() 
        defaults.set(refreshedToken, forKey: Constant.UserDefaults.token)

        Messaging.messaging().apnsToken = deviceToken

        print("Token generated: ", refreshedToken)
     else 
        print("Could not save token becuase error with instance id token")
    

之前我使用了 firebase swizzling,看起来好像由于某种原因停止工作了。

由于这对我来说是一次艰难的经历,我想发布我现在推荐的为 FCM 启用 iOS 客户端的步骤:

    在 Apple Developer 控制台中生成您的 APN,然后选择 APN。选择继续并下载您的 APN 证书。记下您的密钥 ID。

然后在firebase控制台的设置,云消息下,上传你的APN密钥,添加密钥ID和捆绑ID,不要上传任何p12证书。

    通过将其添加到您的 Info.plist 来禁用 Firebase 消息混杂:

FirebaseAppDelegateProxyEnabled:否

    然后在您的 AppDelegate.swift 文件中的 didFinishLaunchingWithOptions 方法中添加以下内容:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

    // [START set_messaging_delegate]
    Messaging.messaging().delegate = self
    // [END set_messaging_delegate]
    
    // get push notification token id for user
    if #available(iOS 10.0, *) 
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self
    
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: _, _ in )
     else 
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    
    
    application.registerForRemoteNotifications()
    
    return true
    

由于 swizzling 已禁用,您需要注意生成 APN 令牌并将其分配给 firebase 消息传递 apnsToken。您可以通过在 AppDelegate.swift 文件中使用以下方法来做到这一点:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
    if let refreshedToken = InstanceID.instanceID().token() 
        defaults.set(refreshedToken, forKey: Constant.UserDefaults.token)

        Messaging.messaging().apnsToken = deviceToken

        print("Token generated: ", refreshedToken)
     else 
        print("Could not save token becuase error with instance id token")
    

然后我将令牌保存在 userdefaults 中,以便以后持久保存到数据库中,见上文:

defaults.set(refreshedToken, forKey: Constant.UserDefaults.token)

您可以通过复制控制台中打印的令牌并使用 FCM 消息传递控制台来测试您的令牌是否正常工作。或者通过在终端中使用 curl 请求,如下所示。请注意,您必须将 YOUR_LEGACY_SERVER_KEY 替换为旧服务器密钥,您可以在 firebase 控制台的设置和云消息传递下找到该密钥,并将 YOUR_TOKEN 替换为控制台中打印的令牌(在上面生成):

curl -X "POST" "https://fcm.googleapis.com/fcm/send" \
 -H "Authorization: key=YOUR_LEGACY_SERVER_KEY” \
 -H "Content-Type: application/json" \
 -d $'
"notification": 
"body": "Testing with direct FCM API",
"title": "Test Message",
"badge": "0",
"sound": "default"
,
"registration_ids": [YOUR_TOKEN]
'

【讨论】:

以上是关于Firebase FCM 推送通知停止工作 iOS 11.1.1的主要内容,如果未能解决你的问题,请参考以下文章

iOS FCM 没有收到推送通知

如何在 Xamarin.iOS 中使用 FCM(Firebase 云消息传递)发送 iOS 推送通知

适用于 iOS 的 Firebase FCM 静默推送通知

添加 FCM 支持后,本地通知在 iOS 上停止工作

FCM 检测 IOS 上的应用程序卸载(firebase 云消息推送通知)

在应用程序被杀死后,使用 HTTP 请求通过 Firebase(FCM)向 iOS 设备发送推送通知 [重复]