wake-up-neo.com

Token für FCM korrekt abrufen - iOS 10 Swift 3

ich hatte Firebase mit FirebaseAuth/FCM usw. implementiert und die Benachrichtigung erfolgreich über Firebase Console gesendet. 

Allerdings müsste ich die Benachrichtigung von meinem eigenen App-Server pushen.

ich frage mich, auf welche Weise der richtige Weg ist, um die Registrierungs-ID für das Gerät abzurufen: -

1) Abrufen des Registrierungs-ID-Tokens von didRegisterForRemoteNotificationWithDeviceToken

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    var token = ""

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

    print("Registration succeeded!")
    print("Token: ", token)
    Callquery(token)

}

2) Registrierungstoken von Firebase abrufen (Basierend auf Firebase-Dokument, das das aktuelle Registrierungstoken abruft)

let token = FIRInstanceID.instanceID().token()!

ich habe die erste Möglichkeit verwendet, die Push-Benachrichtigung wird nicht empfangen, obwohl die Registrierungs-ID entsprechend in meiner App-Server-Datenbank gespeichert ist. Ich erhalte das Ergebnis dieser CURL-Sitzung: -

{"multicast_id":6074293608087656831,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

ich hatte auch den zweiten Weg ausprobiert und bekam beim Ausführen der App einen schwerwiegenden Fehler wie folgt: -  enter image description here

wir würden uns freuen, wenn mir jemand den richtigen Weg zeigen könnte, danke!

25
aznelite89

Die Funktion tokenRefreshNotification wird beim Starten der App nicht immer aufgerufen.

Wenn Sie den Code jedoch in die reguläre Delegatenfunktion didRegisterForRemoteNotificationsWithDeviceToken einfügen, kann ich das Token jedes Mal abrufen:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    if let refreshedToken = InstanceID.instanceID().token() {
        print("InstanceID token: \(refreshedToken)")
    }
}

(Swift 3 + Firebase 4.0.4)

44
Sam

Swift 3 + Firebase 4.0.4:

static var FirebaseToken : String? {
    return InstanceID.instanceID().token()
}
22
MBH

Der empfohlene Weg von Firebase:

let token = Messaging.messaging().fcmToken

Referenz: Einrichten einer Firebase Cloud Messaging Client-App unter iOS

17
Musa almatri

Swift 4 + Firebase (5.3.0)

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    InstanceID.instanceID().instanceID(handler: { (result, error) in
        if let error = error {
            print("Error fetching remote instange ID: \(error)")
        } else if let result = result {
            print("Remote instance ID token: \(result.token)")
        }
    })
}
7
Daniyal Raza

Swift 4

Mit freundlicher Genehmigung von: https://stackoverflow.com/a/50945350/1014164

InstanceID.instanceID().instanceID { (result, error) in
    if let error = error {
        print("Error fetching remote instange ID: \(error)")
    } else if let result = result {
        print("Remote instance ID token: \(result.token)")
    }
}
7
cohen72

FCM-Gerätetoken Swift3

    let fcmDeviceToken = FIRInstanceID.instanceID().token()
    print("FCM token: \(fcmDeviceToken ?? "")")
6
jazzbpn

Registrieren Sie sich zuerst für die Benachrichtigung zur Aktualisierung des Firebase-Token:

NotificationCenter.default.addObserver(self, selector: 
     #selector(tokenRefreshNotification), name:     
     NSNotification.Name.InstanceIDTokenRefresh, object: nil)

Dann können Sie das Token im tokenRefreshNotification-Selektor erhalten:

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()
}
5

Gehen Sie mit der zweiten Option, und dies wird wirklich dumm/einfach erscheinen, aber um diesen optionalen, schwerwiegenden Fehler zu beheben, entfernen Sie einfach das Force-Unwrap am Ende

Dein Code:
var token = FIRInstanceID.instanceID().token()!
Mach es:
var token = FIRInstanceID.instanceID().token()

Das wird zumindest diesen fiesen Absturz beheben

5
John Leonardo

Ich hatte das gleiche Problem, konnte aber nicht herausfinden, was los war.

Die von @Sam vorgeschlagene didRegisterForRemoteNotificationsWithDeviceToken wird jedes Mal (fast) aufgerufen, daher ist dies eine gute Lösung. Aber es wird NICHT beim ersten Öffnen der App mit dem aktualisierten Token aufgerufen.

Für dieses Szenario benötigen Sie also noch:

func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
    print("Refreshed Token: \(fcmToken)")
}

Wenn Sie also nur das verwenden:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    if let fcmToken = InstanceID.instanceID().token() {
        print("InstanceID token: \(fcmToken)")
    }
}

Sie erhalten das "aktualisierte Token" nur, wenn der Benutzer die App das zweite Mal öffnet.

Es gelang mir, ein Aktualisierungstoken zu erzwingen, indem ich die App deinstallierte und den Build-Ordner (Product> Clean Build Folder) säuberte. Gut zum Testen.

Idealerweise könnte alles mit der messaging:didReceiveRegistrationToken-Delegat-Methode gehandhabt werden, aber ich konnte es nicht zum Laufen bringen. Eine andere Möglichkeit, über Änderungen im FCM-Token benachrichtigt zu werden, besteht darin, NSNotification mit dem Namen kFIRMessagingRegistrationTokenRefreshNotification wie in der Dokumentation vorgeschlagen zu überwachen: https://firebase.google.com/docs/cloud-messaging/ios/client

2
erickva

Importieren Sie zuerst die Bibliotheken wie:

import FirebaseInstanceID
import FirebaseMessaging
import UserNotifications

set Delegate: MessagingDelegate, UNUserNotificationCenterDelegate

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate, UNUserNotificationCenterDelegate {

Schreiben Sie diesen Code auf didFinishLaunching ():

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

    // Override point for customization after application launch.
    FirebaseApp.configure()
    Messaging.messaging().delegate = self

    //remote Notifications
    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (isGranted, err) in
            if err != nil {
                //Something bad happend
            } else {
                UNUserNotificationCenter.current().delegate = self
                Messaging.messaging().delegate = self

                DispatchQueue.main.async {
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        }
    } else {
        // Fallback on earlier versions
    }

    if #available(iOS 10, *) {
        UNUserNotificationCenter.current().requestAuthorization(options: [.badge,.sound,.alert], completionHandler: { (granted, error) in
            application.registerForRemoteNotifications()
        })
    }else{
        let notificationSettings = UIUserNotificationSettings(types: [.badge,.sound,.alert], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(notificationSettings)
        UIApplication.shared.registerForRemoteNotifications()
    }

    return true
}

Schreibe connectFCM-Methode wie folgt:

func ConnectToFCM() {
    Messaging.messaging().shouldEstablishDirectChannel = true

    if let token = InstanceID.instanceID().token() {
        print("\n\n\n\n\n\n\n\n\n\n ====== TOKEN DCS: " + token)
    }

Schreiben Sie auch Delegat-Methoden zum Registrieren und Empfangen von Push-Benachrichtigungen:

func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
    print("\n\n\n\n\n ==== FCM Token:  ",fcmToken)
    HelperFunction.helper.storeInUserDefaultForKey(name: kFCMToken, val: fcmToken)
    ConnectToFCM()
}

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

   // UIApplication.shared.applicationIconBadgeNumber += 1

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "Barker"), object: nil)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {

    print(userInfo)
}

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

    print(userInfo)

    completionHandler(UIBackgroundFetchResult.newData)
}

}

Jetzt können wir es von der Firebase-Konsole aus testen  enter image description here

100% arbeiten, einfach und getestet

Hinweis: 1) Aktivieren Sie die Push-Benachrichtigung aus dem Funktionsbereich von xcode.

2) Überprüfen Sie zweimal Ihre beiden auf Firebase-Projekteinstellungen hochgeladenen p12-Zertifikate.

3) Geräte-Token können nur von echten Geräten und nicht von Simulatoren abgerufen werden.

1

Um das aktuelle FCM-Token zu erhalten

if let token = Messaging.messaging().fcmToken {
    // token is current fcmToken
}

So erneuern Sie das aktuelle FCM-Token

Wenn wir die aktuelle Instanz-ID löschen, wird ein neues Token einen Moment später über MessagingDelegate (Messaging: didReceiveRegistrationToken) empfangen.

InstanceID.instanceID().deleteID { (error) in
    if let er = error {
        print(er.localizedDescription)
    } else {
        print("instanceID().deleteID  success ---------------➤")
    }
}
1
Brownsoo Han