Уведомление о сообщениях Firebase Cloud получено в консоли, но не отображается на телефоне - приложение Swift - PullRequest
0 голосов
/ 06 августа 2020

Итак, я пытаюсь реализовать облачный обмен сообщениями с функциями Firebase для центра сообщений в моем приложении. Моя функция firebase сообщает, что она уже работает, и я получаю сообщение в моем журнале консоли, однако уведомление не развертывается на моем телефоне в фоновом режиме.

Я реализовал разрешение на получение уведомлений один раз мой пользователь вошел в систему в домашнем представлении. Это мой код:

 func askNotificationPermission() {
        
        //Firebase Push Notifications
          UNUserNotificationCenter.current().delegate = self

          let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
          UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {_, _ in
                print("HOLA TE DIERON PERMISO")
          })
        
            Messaging.messaging().shouldEstablishDirectChannel = true
        
          UIApplication.shared.registerForRemoteNotifications()
          Messaging.messaging().delegate = self
  
    }

Я реализовал необходимые функции Firebase в didFinishLaunchingApplication:

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    //MARK: Firebase
    FirebaseApp.configure()
    
    //Firebase Cloud Messaging
      Messaging.messaging().delegate = self
    
    
    //MARK: Others
    //KeyboardManager
    IQKeyboardManager.shared.enable = true
    
    //navbar
    let navControl = UINavigationBar.appearance()
    let myColor : UIColor = UIColor(red: 0, green: 0.1333, blue: 0.3176, alpha: 1)
    navControl.tintColor = myColor

    return true
}

И это мое расширение для уведомлений в App Delegate:

    extension AppDelegate: UNUserNotificationCenterDelegate, MessagingDelegate {
    
    func applicationDidEnterBackground(_ application: UIApplication) {
        Messaging.messaging().shouldEstablishDirectChannel = true
    }
    
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
           
           let dataDict: [String: String] = ["token": fcmToken]
           NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
           
           //TODO: If necessary send token to application server
           //Note: This callback is fired at each app startup and whenever a new token is generated
       }
    
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
        
        Messaging.messaging().appDidReceiveMessage(userInfo)
        
        if let messageID = userInfo[gcmMessageIDKey] {
           print("Message ID: \(messageID)")
         }

         // Print full message.
         print("USER INFO: ",userInfo)
    }
    
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print(userInfo)
        completionHandler(UIBackgroundFetchResult.newData)
        print("USER INFO IN DID RECEIVE REMOTE NOTIFICAITON:", userInfo, UIBackgroundFetchResult.newData)
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        
        let userInfo = notification.request.content.userInfo as! [String:Any]

        completionHandler([.alert, .badge, .sound])
        print("HOLI")

    }
}

Я не знаю, в чем может быть проблема и почему я получаю информацию в консоли, но она не передается в приложение. Я просмотрел несколько вопросов о переполнении стека, но ни один из них не помог.

Это то, что записывает моя консоль:

2020-08-06 11: 06: 06.804344-0500 FleaMarket_UserSide [13985 : 4429211] [] nw_read_request_report [C2] Получение завершилось ошибкой «Программное обеспечение вызвало прерывание соединения» [AnyHashable («title»): Jay Shetty Meditations, AnyHashable («aps»): {«content-available» = 1; }, AnyHashable ("gcm.message_id"): 1596729966264394, AnyHashable ("сообщение"): вы его получили ?, AnyHashable ("google. c .sender.id"): 520471783461] ИНФОРМАЦИЯ О ПОЛЬЗОВАТЕЛЕ В ДИСТАНЦИОННОМ УВЕДОМЛЕНИИ : [AnyHashable ("заголовок"): Медитации Джея Шетти, AnyHashable ("aps"): {"content-available" = 1; }, AnyHashable ("gcm.message_id"): 1596729966264394, AnyHashable ("message"): вы его получили ?, AnyHashable ("google. c .sender.id"): 520471783461] UIBackgroundFetchResult 2020-08-06 11 : 06: 06.835793-0500 FleaMarket_UserSide [13985: 4429216] 6.27.0 - [Firebase / Firestore] [I-FST000001] WatchStream (282c75618) Ошибка потока: «Недоступно: сокет не подключен»

1 Ответ

1 голос
/ 12 августа 2020

Я нашел свою ошибку. Это было в моей функции firebase. Я неправильно написал свою полезную нагрузку. Я написал:

var newmessage = {data: {title: groupName, body: message}, topi c: offerTopi c,};

Правильная полезная нагрузка согласно Firebase документация - это УВЕДОМЛЕНИЕ:

var newmessage = {
      notification: {
        title: groupName,
        body: message
      },
      topic: offerTopic,
    };

Убедитесь, что вы придерживаетесь документации по облачным сообщениям firebase, найденной здесь, иначе она не будет восприниматься как уведомление и не будет sh его.

https://firebase.google.com/docs/cloud-messaging/ios/topic-messaging

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...