Как я могу обновить токен пользователя FCM, если его текущий больше не работает? - PullRequest
0 голосов
/ 26 января 2020

Я обнаружил проблему с моим приложением, некоторые пользователи перестали получать уведомления pu sh на некоторое время. Похоже, что их токен FCM, связанный с их учетной записью, истек или им нужен новый. Я протестировал, удалив приложение на моем устройстве, и мне был выдан новый токен fcm в Xcode.

Я скопировал этот токен FCM из консоли XCode и вручную заменил его на тот, который был у меня в базе данных Firebase, после чего я смог успешно получать уведомления pu sh.

Мой вопрос, возможно ли обновить токен FCM текущих пользователей, когда они снова войдут в / или откроют приложение, чтобы они могли успешно получать уведомления pu sh?

Вот мой делегат приложения



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

     attemptRegisterForNotifications(application: application)
        Messaging.messaging().delegate = self

        return true
    }

   func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print("Registered for notifications", deviceToken)
        Messaging.messaging().apnsToken = deviceToken

    }



    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Registered with FCM with token:", fcmToken)
    }

    // Listen for user notifcations
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler(.alert)
    }


    private func attemptRegisterForNotifications(application: UIApplication) {
        print("Attempting to register APNS...")

        UNUserNotificationCenter.current().delegate = self


        let options: UNAuthorizationOptions = [.alert, . badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(options: options) { (granted, error) in
            if let error = error {
                print("Failed to request auth:", error)
                return
            }

            if granted {
                print("Auth granted.")
            } else {
                print("Auth denied")
            }

        }

        application.registerForRemoteNotifications()


    }


Ответы [ 3 ]

1 голос
/ 28 января 2020

Вы хотите использовать делегата Firebase Messaging FIRMessagingDelegate для обработки обновлений токена FCM. В идеале вы хотите справиться с этим при запуске приложения, поэтому подумайте об этом в App Delegate:

class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {

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

        Messaging.messaging().delegate = self
        return true

    }

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {

        if let userId = Auth.auth().currentUser?.uid { // user is signed in

            Firestore.firestore().collection("userProfiles").document(userId).updateData(["fcmToken": fcmToken]) { (error) in

                if let error = error {
                    print(error)
                }

            }

        }

    }

}
0 голосов
/ 26 января 2020

Вам не нужно вручную «обновлять» токен устройства (на самом деле, нет способа форсировать это). Вместо этого следует ожидать, что токен устройства может измениться в любое время. Поскольку ваше приложение может неожиданно получить новый токен, вы должны записывать этот токен для пользователя каждый раз, когда ваше приложение запускается. Старый токен больше не будет работать, и код вашего сервера должен проверить на наличие сбоев, чтобы узнать, когда пора его удалять.

0 голосов
/ 26 января 2020

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

...