Уведомление от Firebase перестало появляться на iOS - PullRequest
0 голосов
/ 25 октября 2019

Прошлой ночью я тестировал Push-уведомления из Firebase в своем приложении для iOS, и оно работало, как и ожидалось

Мне удалось отправить уведомление из Cloud Function на определенный токен FCM. Это утреннее уведомление не приходит при использовании того же метода.

Облачная функция

Вот функция, которую я использую для отправки уведомления:

function sendNotification(title: string, body: string, token: string): Promise<void> {
    const message: admin.messaging.Message = {
        apns: {
            headers: {
                'apns-priority': '10'
            },
            payload: {
                aps: {
                    alert: {
                        title: title,
                        body: body,
                    },
                    sound: "default"
                }
            }
        },
        token: token
    }
    return admin.messaging().send(message).then(response => { console.log(`Notification response ${response}`) }).then(justVoid)
}

Здесь token - это токен, полученный от InstanceId в приложении iOS. Когда эта функция запущена, я вижу следующее в журнале облачных функций веб-консоли Firebase:

Проекты с ответами на уведомления / имя-проекта / messages / 0: 1571998931167276% 0f7d46fcf9fd7ecd

Насколько я понимаю, это сообщение об успехе. Поэтому я ожидаю, что уведомление появится на устройстве в этот момент, но ничего.

iOS App

Я следовалэто руководство по устранению неполадок, и я уверен, что установка верна: https://firebase.google.com/docs/cloud-messaging/ios/first-message?authuser=0

Я попытался переустановить приложение на устройстве, на котором я тестирую: я проверил, что приложение выполняет этишаг после переустановки:

  • вызов: UNUserNotificationCenter.current().requestAuthorization(options:, completionHandler:)

  • вызов: UIApplication.shared.registerForRemoteNotifications()

  • прослушайте обновленный токен FCM, выполнив: func messaging(_ messaging:, didReceiveRegistrationToken fcmToken:)

  • вызов: InstanceID.instanceID().instanceID(handler:)

  • дважды проверьте, разрешены ли уведомления для моегоприложение в приложении настроек iOS.

Тестовое уведомление с консоли

Я пытался отправить тестовое уведомление вот Notification Composer , использующий последний токен FCM для тестового устройства, но это уведомление также не отображается, и оно не дает мне никаких отзывов на экране,Уведомление успешно отправлено или нет.

Что я здесь не так делаю?

Есть предложения по устранению этой проблемы?

1 Ответ

0 голосов
/ 25 октября 2019

Когда мы работаем с Push-уведомлениями, тогда debug проблема становится очень трудной.

По моему опыту, в вашем typescript или iOS коде нет ничего плохого, потому что раньше он былработал отлично. Ниже приведена возможная причина, если push-уведомление не работает.

Как правило, проблема, связанная с APNS, возникает из-за сертификата.

  • Убедитесь, что вы загружаете правильноеПрофиль APNS для консоли Firebase для режима разработки и выпуска.

  • Убедитесь, что вы включили уведомление в возможностях.

    Ваш проект -> возможности -> включить Push-уведомления

  • Убедитесь, что вы правильно добавили GoogleService-Info.plist в проект
    .

  • Срок действия сертификата APNS не истек.

  • Убедитесь, что вы используете последнюю версию firebase.

  • Время вашего устройства должно быть автоматическим, а не функциональным.

Если вы все еще думаете, что это проблема, связанная с кодом, и вышеуказанное решение не работает, то вы можете воспользоваться приведенным ниже классом оболочки:Класс HSAPNSHelper, созданный мной и работающий для iOS 10 и более поздних версий.

import Foundation
import UserNotifications
import Firebase

class HSAPNSHelper: NSObject {

    static let shared = HSAPNSHelper()
    let local_fcm_token = "local_fcm_token"

    var notificationID = ""

    func registerForPushNotification(application:UIApplication){

        FirebaseApp.configure()

        self.getFCMToken()
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { (granted, error) in
            DispatchQueue.main.async {
                self.getFCMToken()
            }
        }
        application.registerForRemoteNotifications()
    }
}


extension HSAPNSHelper:UNUserNotificationCenterDelegate {

    fileprivate func getFCMToken() {
        InstanceID.instanceID().instanceID(handler: { (result, error) in
            if error == nil, let fcmToken = result?.token{
                print("FCM Token HS: \(fcmToken)")
                UserDefaults.standard.set(fcmToken, forKey: self.local_fcm_token)
            }
        })
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("didFailToRegisterForRemoteNotificationsWithError : \(error)")
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

        var token = ""
        for i in 0..<deviceToken.count {
            token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
        }
        Messaging.messaging().apnsToken = deviceToken
        getFCMToken()
    }

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

        let userInfo = notification.request.content.userInfo as! [String: Any]
        print(userInfo)
        completionHandler([.alert, .badge, .sound])
    }

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        print(userInfo)
        self.notificationRedirection()
    }

    private func notificationRedirection(){

    }

    func fcmToken() -> String{
        return UserDefaults.standard.string(forKey:local_fcm_token) ?? ""
    }
}

Как использовать?

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        //For Push notification implementation
        HSAPNSHelper.shared.registerForPushNotification(application: application)
        return true
    }

Используйте fcmToken() для получения текущего токена FCM.

...