Je ne peux pas recevoir de notification push pour mon de Firebase étant donné que j'ai pu recevoir le jeton d'appareil et le jeton Firebase.
Voici mes principaux appels dans mon AppDelegate .swift
UIApplication.shared.registerForRemoteNotifications ()
Cet appel a réussi et je suis en mesure d'établir une connexion à APNS car j'ai été capable d'obtenir mon jeton avec cet appel:
func application (_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
Aussi, je sais que je me connecte à Firebase car je peux obtenir mon jeton Firebase avec cet appel:
func messaging (_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String)
Donc Je suis convaincu que mon code dans AppDelegate.swift
est correct.
Mon AppDelegate.swift:
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var compositionRoot: CompositionRoot? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow() configureCompositionRoot() configureFirebase() configurePushNotification() configureApplicationEntryPoint() configureLogging() return true } func configureCompositionRoot() { guard let window = window else { return } compositionRoot = CompositionRoot(window: window) } func configureApplicationEntryPoint() { guard let compositionRoot = compositionRoot else { return } compositionRoot.getCoordinator().onStart() } func configureLogging() { let console = ConsoleDestination() log.addDestination(console) } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = deviceToken.map {String(format: "%02.2hhx", $0)}.joined() print("Token: \(token)") Messaging.messaging().apnsToken = deviceToken //Messaging.messaging().setAPNSToken(deviceToken, type: MessagingAPNSTokenType.prod) } } extension AppDelegate: UNUserNotificationCenterDelegate { func configureFirebase() { FirebaseApp.configure() } func configurePushNotification() { UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (granted, error) in if granted == true { print("User granted push notification") UNUserNotificationCenter.current().delegate = self Messaging.messaging().delegate = self DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } else { print("User did not grant pn") } } } } extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { } }
Informations supplémentaires: j'ai pu recevoir des notifications de test en utilisant Pusher, je voulais juste le lancer,
Merci
MISE À JOUR: - code de travail:
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() UIApplication.shared.applicationIconBadgeNumber = 0 // Override point for customization after application launch. loggingWithSwitftyBeaverConfiguration() UNUserNotificationCenter.current().delegate = self // requesting user's permission to accpet push notification UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in if granted == true { log.debug("User granted push notification") UNUserNotificationCenter.current().delegate = self Messaging.messaging().delegate = self DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } else { log.debug("User did not grant pn") } } return true } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { log.debug("Device token receiving failed because: \(error.localizedDescription)") } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = deviceToken.map {String(format: "%02.2hhx", $0)}.joined() log.debug("Token: \(token)") } func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) { log.debug("\(remoteMessage.description)") } func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { log.debug("Firebase cloud messaging token: \(fcmToken)") } func applicationDidBecomeActive(_ application: UIApplication) { Messaging.messaging().shouldEstablishDirectChannel = true } func applicationDidEnterBackground(_ application: UIApplication) { Messaging.messaging().shouldEstablishDirectChannel = false } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { UIApplication.shared.applicationIconBadgeNumber += 1 print("push notification received") } }
3 Réponses :
[Suivez le processus étape par étape défini ici ..]
https://firebase.google.com/docs/cloud-messaging / ios / client
Veuillez vérifier votre charge utile. Cela peut être la raison pour laquelle vous ne recevez pas de notifications. Votre charge utile devrait ressembler à:
{ "aps" : { "alert" : { "title" : "Portugal vs. Denmark", "body" : "Portugal vs. Denmark", } }, "Nick" : "Mario", "Room" : "PortugalVSDenmark" }
Le fait d'avoir toutes les données sous les données ne déclenche aucune notification dans iOS, même si Firebase renvoie une requête réussie car la charge utile APNS transférée n'est pas correcte. En outre, la manière appropriée devrait être de suivre les recommandations de charge utile GCM ou FCM, qui consiste à utiliser à la fois la notification pour le message de notification et les données pour les paires clé / valeur personnalisées.
Lorsque FCM envoie des données à APNS, il les convertit dans la charge utile des APN. Il définit les valeurs de notification dans la balise aps, c'est-à-dire
{ "to": "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", "notification": { "body": "great match!", "title": "Portugal vs. Denmark", "icon": "myicon" }, "data": { "Nick": "Mario", "Room": "PortugalVSDenmark" } }
Salut - merci pour cette réponse utile d'il y a 18 mois :) Comment adapteriez-vous les applications Android qui nécessitent que le titre et le corps soient dans les données pour qu'il s'affiche lorsque l'application est en arrière-plan?
Une autre piste possible est de désactiver Firebase Swizzling comme expliqué ici: https://firebase.google.com/docs/cloud-messaging/ios/ client
J'ai lu des articles sur le swizzling de méthode et je n'ai aucune idée de ce qu'il fait et de la façon dont sa désactivation résoudrait le problème, veuillez expliquer, merci
Swizzling est une fonctionnalité du langage ObjectiveC pour remplacer une implémentation d'une méthode par une autre au moment de l'exécution, Firebase l'utilise pour plusieurs raisons et comme nous n'avons pas le code source pour le SDK Firebase, nous ne pouvons pas le dire exactement, espérons qu'ils fournissent une méthode pour le désactiver comme décrit dans la documentation liée.
D'où vous avez essayé d'envoyer une notification push?
Sur la messagerie cloud Firebase
Vous pouvez consulter à nouveau toutes les étapes à partir d'ici appcoda.com/firebase-push-notifications peut-être que vous pouvez trouver ce qui manque
J'ai également essayé cette méthode, ne fonctionnant pas pour moi
Essayez d'ajouter -> func applicationDidBecomeActive (application: UIApplication) {FIRMessaging.messaging (). ConnectWithCompletion {erreur d'impression (erreur)}}
On dirait un code obsolète
Êtes-vous sûr que les capacités de votre profil d'approvisionnement et vos certificats Push sont configurés correctement? Parce que la connexion à Firebase n'est pas la même chose que la connexion à APNS. FCM est juste un service créé au-dessus d'APNS
Vous n'appelez pas non plus
Messaging.messaging (). SetAPNSToken (deviceToken, type: .unknown)
dans votre méthodedidRegisterForRemoteNotificationsWithDeviceToken
Pouvez-vous montrer la charge utile que vous envoyez à FCM ???
Avez-vous trouvé une solution à ce problème?
s'il vous plaît voir la mise à jour pour mon code de mise à jour qui fonctionne