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

时间:2017-11-12 08:44:15

标签: iphone firebase-cloud-messaging ios11 swift4

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

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

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

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

如果我从firebase控制台上的通知仪表板发送,则显示已成功完成。

我做了以下但没有成功:

  1. 按照FCM Push notifications do not work on iOS 11
  2. 锁定在“FirebaseInstanceID”,“2.0.0”的广告连播中
  3. 在开发者控制台上生成新的APN密钥,并替换Firebase中FCM设置的现有密钥
  4. 下载了一个新的GoogleService-Info.plist并替换了现有的
  5. 检查捆绑包ID等是否匹配
  6. 将firebase pod更新为最新版本:
  7.   

    使用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)

    1. 打开和关闭消息,
    2. 根据Firebase notifications not working in iOS 11
    3. 设置Messaging.messaging().shouldEstablishDirectChannel = true
    4. 从firebase控制台删除此iOS应用程序,并从头开始重做通知设置
    5. 确保功能中的远程通知仍然打开
    6. 重启我的设备
    7. 我的设置: 我在覆盖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")
          }
      }
      

      这里生成的令牌我也用curl测试,如上所述,所有节目都成功。

      我的GoogleService-Info.plist: enter image description here

      我的信息列表: enter image description here

      如果需要任何其他信息,请与我们联系。

      我的Android应用程序仍然像以前一样工作。我很难理解一天内iOS应用程序可能会发生什么变化导致这种情况,或者有一天我可能会破坏的内容:)

      非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

好的,修好了。我将firebase的消息添加到我的Info.plist中禁用了firebase的消息: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客户端的步骤:

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

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

    enter image description here

    1. 通过将此消息添加到Info.plist中来禁用firebase消息:
    2.   

      FirebaseAppDelegateProxyEnabled:否

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

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

        // [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
        

        }

      2. 由于禁用了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消息传递控制台来测试您的令牌是否正常工作。或者通过在终端中使用卷曲请求,如下所示。请注意,您必须将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]
        }'