Уведомления об обмене сообщениями в облаке iOS Firebase не принимаются после использования файла .p8 - PullRequest
0 голосов
/ 07 октября 2018

Я выполнил все шаги ниже и добавил соответствующий импорт и код в App Delegate.Я также удостоверился, что разрешил принимать уведомления при запуске приложения.

Следуя приведенным ниже инструкциям, почему я не могу получать уведомления после того, как отправляю их из Firebase Cloud MessagingКонсоль?

  1. В своем аккаунте разработчика я зашёл на Certificates, Identifiers & Profiles

  2. Под Keys, я выбрал All инажал кнопку «Добавить» (+) в правом верхнем углу

  3. В поле Key Description я ввел уникальное имя для ключа подписи

  4. В Key Services я установил флажок APNs, затем нажал Continue, затем нажал Confirm

  5. Я скопировал Key ID (используется на шаге 7) и нажалDownload для генерации и загрузки .p8 ключа

  6. Я пошел на Firebase, нажал Gear Icon> Project Settings> Cloud Messaging not Grow>Облачные сообщения, такие как шаг 10

  7. Под iOS app configuration> APNs Authentication Key Я перешел в первый раздел APNs Authentication Key (НЕ APNs Certificates), выбрал Upload и загрузил.p8 ключ, Key ID и мой Team Id.teamId находится в разделе Membership, а keyId является частью xxxxxxx файла xxxxxxx .p8.

  8. В моем проекте XCode я перешел к Capabilities> Background Modes, повернул On и проверил Remote Notifications

  9. Затем я перешел к> Push Notifications и повернул On, который автоматически сгенерировал Entitlement Certificate для приложения (оно находится в навигаторе проекта)

  10. Чтобы отправить уведомление в Firebase, я пошел по адресу Grow> Cloud Messaging> Send Your First Message> 1. Notification Text ввел несколько случайныхString> 2. Target и выбрал bundleId> 3. Scheduling Now> моего приложения 4. нажал Next> 5. selected sound и badge> Review

  11. InAppDelegate Я добавил import UserNotifications, import FirebaseMessaging, import Firebase, зарегистрировался для UNUserNotificationCenterDelegate и добавил код ниже.

  12. Для настройки reCAPTCHA проверки Я пошел в Blue Project Icon> Info> URL Types, затем в раздел URL Schemes я вошел в REVERSED_CLIENT_ID из моего GoogleService-Info.plist

У меня естьдобавлены точки останова ко всем операторам печати ниже и после того, как язавершение сообщения из Firebase, ни один из них не получил удар.

import UserNotifications
import FirebaseMessaging
import Firebase

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

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

        FirebaseApp.configure()

        UNUserNotificationCenter.current().delegate = self

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().requestAuthorization(options: [.sound,.alert,.badge]) {
            [weak self] (granted, error) in

                if let error = error {
                    print(error.localizedDescription)
                    return
                }

                print("Success")
            }
            application.registerForRemoteNotifications()

        } else {

            let notificationTypes: UIUserNotificationType = [.alert, .sound, .badge]
            let notificationSettings = UIUserNotificationSettings(types: notificationTypes, categories: nil)
            application.registerForRemoteNotifications()
            application.registerUserNotificationSettings(notificationSettings)
        }
    }

    // MARK:- UNUserNotificationCenter Delegates
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

        Messaging.messaging().setAPNSToken(deviceToken, type: MessagingAPNSTokenType.unknown)

        var token = ""
        for i in 0..<deviceToken.count{
            token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
        }
        print("Registration Succeded! Token: \(token)")
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Notifcation Registration Failed: \(error.localizedDescription)")
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

        if let gcm_message_id = userInfo["gcm_message_id"]{
            print("MessageID: \(gcm_message_id)")
        }

        print(userInfo)
    }

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        completionHandler(.alert)

        print("Handle push from foreground \(notification.request.content.userInfo)")

        let dict = notification.request.content.userInfo["aps"] as! NSDictionary
        let d = dict["alert"] as! [String:Any]
        let title = d["title"] as! String
        let body = d["body"] as! String
        print("Title:\(title) + Body:\(body)")
        showFirebaseNotificationAlertFromAppDelegate(title: title, message: body, window: self.window!)
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        print("\(response.notification.request.content.userInfo)")

        if response.actionIdentifier == "yes"{
            print("True")
        }else{
            print("False")
        }
    }

    func showFirebaseNotificationAlertFromAppDelegate(title: String, message: String, window: UIWindow){
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let action = UIAlertAction(title: "OK", style: .default, handler: nil)
        alert.addAction(action)
        window.rootViewController?.present(alert, animated: true, completion: nil)
    }
}

Сообщение отправлено успешно, как вы можете видеть на картинке ниже, но я так и не получил его.

enter image description here

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Я получил ответ отсюда

Я должен был добавить Messaging.messaging().delegate = self ДО FirebaseApp.configure()

Я также должен был добавить делегата сообщений, чтобы получитьТокен регистрации FCM.

Внутри didFinishLaunching add Messaging.messaging().delegate = self

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

    Messaging.messaging().delegate = self // make sure this is added BEFORE FirebaseApp.Configure
    FirebaseApp.configure()

    // all the other code inside didFinishLaunching goes here...
}

   // all the other methods from above goes here...

**** Также в нижней части файла AppDelegate добавьте делегат Messaging и его метод.Вот где FCM Token получено:

extension AppDelegate : MessagingDelegate {

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Your Firebase FCM Registration Token: \(fcmToken)")
    }
}
0 голосов
/ 07 октября 2018

Я думаю, вам также следует добавить это к своему коду, иначе вы не будете получать push-уведомления.Теперь Firebase необходимо, чтобы токен apns отправлял вам сообщения.

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
    }
0 голосов
/ 07 октября 2018

похоже, что вам не хватает некоторых настроек для правильной работы FCM.

Из того, что я вижу, вы не отправляете токен в firebase и не регистрируетесь для FCM.

См. Документацию здесь https://firebase.google.com/docs/cloud-messaging/ios/client для получения более подробной информации.

Чтобы отправить push-сообщение через базу данных огня, вам необходимо иметь токен FCM.Используемый вами токен поступает с серверов APNS, и вам нужно перенаправить его в базу данных Firebase.

...