2
votes

La notification push iOS Firebase ne fonctionne pas mais fonctionne sur le poussoir

Problème:

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.

Voici mes étapes pour configurer la notification push Firebase:

  1. J'ai téléchargé mon fichier google-service.plist et je l'ai fait glisser dans mon projet
  2. Je me suis connecté à mon compte de développeur Apple (payant) et j'ai créé ma clé avec une notification push (copiée sur le KeyID et avec mon teamID ou le préfixe d'application).
  3. Je suis allé dans mon compte Firebase et a téléversé ma clé avec mon KeyID et mon TeamID
  4. Je me suis assuré que les fonctionnalités de mon application activaient le commutateur de notification push
  5. J'ai essayé d'envoyer un message de test et l'application n'en reçoit jamais

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")

    }
    
}

11 commentaires

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éthode didRegisterForRemoteNotificationsWithDeviceToken


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


3 Réponses :


0
votes

[Suivez le processus étape par étape défini ici ..]

https://firebase.google.com/docs/cloud-messaging / ios / client


0 commentaires

0
votes

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"
    }
}


1 commentaires

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?



0
votes

Une autre piste possible est de désactiver Firebase Swizzling comme expliqué ici: https://firebase.google.com/docs/cloud-messaging/ios/ client


2 commentaires

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.