2

Я просмотрел все сообщения, которые я мог найти и прочитать Документацию Firebase снова и снова, но я не могу найти ошибку. Мое приложение получает сообщения данных FCM, если на переднем плане нет проблем. Но когда приложение работает в фоновом режиме, данные не принимаются. Он даже не отображается, когда приложение открыто. Приоритет сообщения установлен на «высокий», а «content-available» установлен на true. Я должен получить кучу идентификаторов. Вот мой AppDelegate код (в основном из примера кода ТСМ):Swift FCM Данные Сообщение не получено, когда приложение находится в фоновом режиме (iOS 10)

// 
// AppDelegate.swift 
// 


import UIKit 
import UserNotifications 

import Firebase 
import FirebaseInstanceID 
import FirebaseMessaging 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    let gcmMessageIDKey = "gcm.message_id" 

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


     if UserDefaults.standard.bool(forKey: "launched_before") == false { 

      self.window = UIWindow(frame: UIScreen.main.bounds) 

      let storyboard = UIStoryboard(name: "Settings", bundle: nil) 

      let initialViewController = storyboard.instantiateViewController(withIdentifier: "welcomeViewController") as! WelcomeViewController 

      self.window?.rootViewController = initialViewController 
      self.window?.makeKeyAndVisible() 

     } else { 

      // Register for remote notifications. This shows a permission dialog on first run, to 
      // show the dialog at a more appropriate time move this registration accordingly. 
      // [START register_for_notifications] 
      if #available(iOS 10.0, *) { 

       // For iOS 10 display notification (sent via APNS) 
       UNUserNotificationCenter.current().delegate = self 
       // For iOS 10 data message (sent via FCM) 
       FIRMessaging.messaging().remoteMessageDelegate = self 

      } else { 
       let settings: UIUserNotificationSettings = 
       UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) 
       application.registerUserNotificationSettings(settings) 
      } 

      application.registerForRemoteNotifications() 

      // [END register_for_notifications] 
      FIRApp.configure() 


      // Add observer for InstanceID token refresh callback. 
      NotificationCenter.default.addObserver(self, 
               selector: #selector(self.tokenRefreshNotification), 
               name: .firInstanceIDTokenRefresh, 
               object: nil) 

     } 

     return true 
    } 

    // [START receive_message] 
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], 
        fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 
     // If you are receiving a notification message while your app is in the background, 
     // this callback will not be fired till the user taps on the notification launching the application. 
     // TODO: Handle data of notification 
     // Print message ID. 
     if let messageID = userInfo[gcmMessageIDKey] { 
      print("Message ID: \(messageID)") 
     } 

     // Print full message. 
     print(userInfo) 

     print("METHOD 2") 

     completionHandler(.newData) 
    } 


    // [END receive_message] 

    // [START refresh_token] 
    func tokenRefreshNotification(_ notification: Notification) { 
     if let refreshedToken = FIRInstanceID.instanceID().token() { 
      print("InstanceID token: \(refreshedToken)") 
     } 

     // Connect to FCM since connection may have failed when attempted before having a token. 
     connectToFcm() 
    } 
    // [END refresh_token] 

    // [START connect_to_fcm] 
    func connectToFcm() { 
     // Won't connect since there is no token 
     guard FIRInstanceID.instanceID().token() != nil else { 
      return; 
     } 

     // Disconnect previous FCM connection if it exists. 
     FIRMessaging.messaging().disconnect() 

     FIRMessaging.messaging().connect { (error) in 
      if error != nil { 
       print("Unable to connect with FCM. \(error)") 
      } else { 
       print("Connected to FCM.") 
      } 
     } 
    } 
    // [END connect_to_fcm] 

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { 
     print("Unable to register for remote notifications: \(error.localizedDescription)") 
    } 

    // This function is added here only for debugging purposes, and can be removed if swizzling is enabled. 
    // If swizzling is disabled then this function must be implemented so that the APNs token can be paired to 
    // the InstanceID token. 
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
     print("APNs token retrieved: \(deviceToken)") 

     // With swizzling disabled you must set the APNs token here. 
     FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.unknown) 

     FIRMessaging.messaging().subscribe(toTopic: "/topics/substitutions") 
     FIRMessaging.messaging().subscribe(toTopic: "/topics/debug") 
    } 

    // [START connect_on_active] 
    func applicationDidBecomeActive(_ application: UIApplication) { 
     connectToFcm() 
    } 
    // [END connect_on_active] 

    // [START disconnect_from_fcm] 
    func applicationDidEnterBackground(_ application: UIApplication) { 
     FIRMessaging.messaging().disconnect() 
     print("Disconnected from FCM.") 
    } 
    // [END disconnect_from_fcm] 

    func evaluateRecievedData (remoteMessage: FIRMessagingRemoteMessage) { 

    // Evaluate the data... 

    } 

} 

// [START ios_10_message_handling] 
@available(iOS 10, *) 
extension AppDelegate : UNUserNotificationCenterDelegate { 

    // Receive displayed notifications for iOS 10 devices. 
    func userNotificationCenter(_ center: UNUserNotificationCenter, 
           willPresent notification: UNNotification, 
           withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 

     let userInfo = notification.request.content.userInfo 
     // Print message ID. 
     if let messageID = userInfo[gcmMessageIDKey] { 
      print("Message ID: \(messageID)") 
     } 

     // Change this to your preferred presentation option 
     completionHandler(.alert) 
    } 


    func userNotificationCenter(_ center: UNUserNotificationCenter, 
           didReceive response: UNNotificationResponse, 
           withCompletionHandler completionHandler: @escaping() -> Void) { 
     let userInfo = response.notification.request.content.userInfo 
     // Print message ID. 
     if let messageID = userInfo[gcmMessageIDKey] { 
      print("Message ID: \(messageID)") 
     } 

     print("USER HAS PRESSED BANNER") 

     // Do some stuff... 

     completionHandler() 
    } 

} 
// [END ios_10_message_handling] 
// [START ios_10_data_message_handling] 
extension AppDelegate : FIRMessagingDelegate { 
    // Receive data message on iOS 10 devices while app is in the foreground. 
    func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { 

     print(remoteMessage.appData) 

     self.evaluateRecievedData(remoteMessage: remoteMessage) 

     print("RECIEVED MESSAGE (FOREGROUND)") 

    } 

} 
// [END ios_10_data_message_handling] 

Я активировал Push-уведомлений и фона Режимы: «Дистанционные уведомлений» в Info.plist. В идеале я хотел бы обработать данные в фоновом режиме и отправить пользователю уведомление, если это касается их.

Данные, посылаемые выглядит следующим образом:

{ 
    "to": "\/topics\/substitutions", 
    "priority": "high", 
    "content_available": true, 
    "data": { 
    "debug": true, 
    "new_ids": [ 
     7914, 
     7915, 
     7916, 
     7917, 
     7918 
    ], 
    "updated_ids": [ 

    ] 
    } 
} 

Я был бы очень признателен, если кто-то знает решение этой проблемы.

+0

Привет. Можете ли вы разместить фактическую полезную нагрузку, которую вы отправляете? –

ответ

1

Для получения уведомления в вашем блоге вы должны добавить почтой notification.

{ 
    "to": "\/topics\/substitutions", 
    "priority": "high", 
    "content_available": true, 
    "data": { 
    "debug": true, 
    "new_ids": [ 
     7914, 
     7915, 
     7916, 
     7917, 
     7918 
    ], 
"notification":{ 
     "title":"Sample Title", 
     "body":"sample body!" 
    } 
    "updated_ids": [ 

    ] 
    } 
} 

Дополнительная информация About FCM Messages

 Смежные вопросы

  • Нет связанных вопросов^_^