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: -
wir würden uns freuen, wenn mir jemand den richtigen Weg zeigen könnte, danke!
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)
static var FirebaseToken : String? {
return InstanceID.instanceID().token()
}
Der empfohlene Weg von Firebase:
let token = Messaging.messaging().fcmToken
Referenz: Einrichten einer Firebase Cloud Messaging Client-App unter iOS
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)")
}
})
}
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)")
}
}
FCM-Gerätetoken Swift3
let fcmDeviceToken = FIRInstanceID.instanceID().token()
print("FCM token: \(fcmDeviceToken ?? "")")
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()
}
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
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
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
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.
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 ---------------➤")
}
}