2
votes

didRegisterForRemoteNotificationsWithDeviceToken ne s'appelle pas Swift 5, Xcode 10.2

didRegisterForRemoteNotificationsWithDeviceToken et didFailToRegisterForRemoteNotificationsWithError ne sont pas appelés sur un appareil réel.

Voici ce que j'ai essayé jusqu'à présent:

Dans didFinishLaunchingWithOptions

private func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    Messaging.messaging().apnsToken = deviceToken as Data
    print("Registered Notification")
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {

        print(error.localizedDescription)
        print("Not registered notification")
}

Puis la méthode register and fail:

    FirebaseApp.configure()

    if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.current()
        center.delegate = self
        center.requestAuthorization(options: [.badge, .alert, .sound]) {
            (granted, error) in
            if granted {
                DispatchQueue.main.async {
                    application.registerForRemoteNotifications()
                    //UIApplication.shared.registerForRemoteNotifications()
                }
            } else {
                //print("APNS Registration failed")
                //print("Error: \(String(describing: error?.localizedDescription))")
            }
        }
    } else {
        let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
        let setting = UIUserNotificationSettings(types: type, categories: nil)
        application.registerUserNotificationSettings(setting)
        application.registerForRemoteNotifications()
        //UIApplication.shared.registerForRemoteNotifications()
    }

Remarque:

  • Je l'ai essayé sur un appareil réel, aucune des méthodes n'est appelée.
  • J'ai essayé sur le simulateur si le code fonctionne ou non, didFailToRegisterForRemoteNotificationsWithError est appelé avec erreur (ce qui signifie que le code est correct)
  • J'ai vérifié les certificats et régénéré le fichier d'approvisionnement après avoir activé les notifications push dans capacités.
  • J'ai également ajouté des modes d'arrière-plan -> notifications à distance activées.
  • J'ai essayé avec l'ancienne version, pas de chance.
  • J'ai essayé de réinstaller des applications plusieurs fois qui ne fonctionnaient pas.
  • FirebaseAppDelegateProxyEnabled est défini sur NO dans plist toujours pas de chance.
  • Également mis à jour les pods toujours pas de chance.


8 commentaires

si vous utilisez FCM, avez-vous vérifié cette méthode appelée func messaging (_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String)


@PrashantTukadiya FCM token que je reçois mais je ne peux pas m'enregistrer tout essayé. Oui, j'ai essayé que cela fonctionne aussi mais que d'autres méthodes ne fonctionnent pas.


Pas sûr, mais à cause de la méthode swizzling stackoverflow.com/questions/38985061/...


Si vous utilisezFCM, vous obtenez un jeton FCM dans la méthode de délégué de messagerie envoyé à votre serveur. De quoi d'autre avez-vous besoin ?


@PrashantTukadiya Comment puis-je activer les notifications push alors que cela ne fonctionne pas non plus?. J'ai essayé avec la console Firebase d'envoyer un service de messagerie pour envoyer une notification avec un jeton FCM, il ne reçoit pas non plus.


Avez-vous téléchargé le fichier p12 sur la console Firebase?, Sinon, il doit


@PrashantTukadiya oui c'est la première chose que j'ai faite quand j'ai commencé à travailler sur les notifications push


continuons cette discussion dans le chat .


4 Réponses :


3
votes

Comme nous en avons discuté sur le chat. Firebase utilise la méthode swizzling afin que vous obteniez un jeton dans la méthode func messaging (_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) au lieu de la méthode didRegisterForRemoteNotificationsWithDeviceToken

Vous devez vous assurer de suivre les choses

1) Certificat correct pour Prod. et Dev.

2) Doit télécharger le certi. vers la console Firebase

3) Doit implémenter la méthode Delegate de UNUserNotificationCenter

4) assurez-vous d'avoir implémenté func userNotificationCenter (_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

5) assurez-vous d'avoir une ligne completionHandler () en bas de la fonction

J'espère que cela vous sera utile


3 commentaires

cela résout le problème pendant un certain temps, mais la notification ne reçoit pas toujours lorsque le jeton Firebase est actualisé.J'ai essayé plusieurs fois d'envoyer une notification toujours le même cas? Je me sens comme un bug Apple?


Je pense que dans le cas réel senario cela n'arrivera pas. Parce que lorsque vous obtenez un nouveau jeton. vous enverrez au serveur afin que le serveur ait le dernier jeton de tous les temps. Apple ne promet pas la livraison instantanée de la notification push car c'est voip push. donc nous ne pouvons pas blâmer Apple sur cela.


en ce moment, je teste les notifications push avec firebase send message cela a commencé à fonctionner lorsque j'ai installé l'application après 1 jour qui est aujourd'hui, je sais que nous ne pouvons pas blâmer Apple dans ce domaine, cela me semble être un bug. J'enverrai au serveur le dernier jeton lorsque ce bogue sera résolu.



2
votes

Je viens de résoudre ce problème !! Je n'ai aucune idée de pourquoi cela fonctionne, mais cela fonctionne, voici mon action:

  1. Ajoutez des impressions dans la méthode didRegisterForRemoteNotificationsWithDeviceToken et gardez les appareils connectés.

  2. Saisissez https://developer.apple.com/ Choisissez Compte -> Certificats, identifiants et profils -> Clés

  3. Sélectionnez la clé de votre projet, cliquez sur "modifier" et fermez (ne pas enregistrer)
  4. Voir le journal de Xcode, je vois beaucoup d'impression de didRegisterForRemoteNotificationsWithDeviceToken

1 commentaires

Salut @codeeer, merci pour la réponse mais je l'ai résolu en laissant la base de feu swizzler ses méthodes en gardant FirebaseAppDelegateProxyEnabled sur YES.



4
votes

Solution étrange mais cela a fonctionné pour moi. Après avoir essayé pendant des heures, je viens d'éteindre et de rallumer le Wi-Fi à partir de l'application de configuration de l'appareil et cela a fonctionné.


1 commentaires

Merci! cela m'aide. Et j'ai remarqué qu'après avoir réactivé le wifi, je vois beaucoup de rappels à didRegisterForRemoteNotificationsWithDeviceToken. Il semble que les demandes se sont bloquées et n'ont fonctionné qu'après avoir éteint et allumé le wifi.



0
votes

J'ai rencontré le même problème et j'ai essayé la même chose après avoir éteint et rallumé le wifi et cela a fonctionné. J'utilisais un vpn pour me connecter à un serveur de développement particulier. Ainsi, lorsque j'éteins et rallume le wifi, le VPN est désactivé et la connexion devient normale.

Je ne sais pas si c'était le problème exact, mais quand j'ai essayé via le VPN, "didRegisterForRemoteNotificationsWithDeviceToken" n'a pas été exécuté et lors de la désactivation de VPN, tout a fonctionné correctement.


0 commentaires