web-dev-qa-db-fra.com

didRegisterForRemoteNotificationsWithDeviceToken non appelé dans ios8, mais didRegister ... Settings is

J'ai suivi ce fil , mais la méthode didRegisterForRemoteNotificationsWithDeviceToken n'est toujours pas appelée:

la documentation dit:

Après avoir appelé la méthode registerForRemoteNotifications du fichier Objet UIApplication, l'application appelle cette méthode lorsque device l'inscription se termine avec succès

didRegisterUser apparaît bien, mais pas did register notif.

Voici mon code dans AppDelegate (la version de l'application est 8.1):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //register notif
    UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert |
                                                    UIUserNotificationTypeBadge |
                                                    UIUserNotificationTypeSound);
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];
    [application registerUserNotificationSettings:settings];


    return YES;
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    //register to receive notifications
    [application registerForRemoteNotifications];
    NSLog(@"didRegisterUser");
}

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"error here : %@", error);//not called
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    /*
    // Store the deviceToken in the current installation and save it to Parse.
    PFInstallation *currentInstallation = [PFInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    currentInstallation.channels = @[ @"global" ];
    [currentInstallation saveInBackground];
     */
    NSLog(@"did register notif");//not called
}

J'ai aussi le mode de fond -> notification à distance dans info.plist.

19
Paul

Votre code semble être correct. Comme amélioration mineure, vous pourriez écrire votre méthode didRegisterUserNotificationSettings de la manière suivante:

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    if (notificationSettings.types != UIUserNotificationTypeNone) {
        NSLog(@"didRegisterUser");
        [application registerForRemoteNotifications];
    }
}

Il peut y avoir un problème de configuration qui entraîne l'échec de l'enregistrement d'un APN.

  1. Assurez-vous que votre profil d'approvisionnement contient l'entrée aps-environment

  2. Assurez-vous que vous avez un identifiant d'application unique (une chaîne sans aucun "*") défini dans votre profil d'approvisionnement. Vous devriez également utiliser cet identifiant exact comme "identifiant de paquet" dans votre Info.plist

  3. Peut-être avez-vous décliné la fonctionnalité Push après l'installation initiale; dans ce cas, vous ne verrez plus jamais l'alerte in-app et vous devrez réactiver l'application Push dans les paramètres.

  4. Essayez un autre appareil.

16
Sven Driemecker

Après une longue fouille, j'ai constaté que le 19 juillet 2016 en raison d'une erreur ou d'une mise à jour de la part d'Apple, la méthode didRegisterForRemoteNotificationsWithDeviceToken ne serait pas appelée, même si toutes les conditions, telles que connexion Internet, Appareil et les méthodes utilisées étaient parfaites.

Veuillez vous référer à ce lien pour confirmation https://forums.developer.Apple.com/thread/52224

Pour vérifier s'il vous plaît jeter un oeil dans vos autres applications aussi . J'avais perdu mon plusieurs heures mais espère que cela aide quelqu'un . Merci.

27
Kunal Gupta

Pour le 19 juillet 2016: - 

Selon Formulaire développeur Apple , il existe un problème concernant Sandbox APNS down ... il peut donc y avoir un problème du côté Apple, c'est pourquoi les délégués comme application:didRegisterForRemoteNotificationsWithDeviceToken: et application:didFailToRegisterForRemoteNotificationsWithError: ne s'appellent pas ..

Pour vérifier l’état actuel de APNS Sandbox ce lien ... A présent, en fonction de son statut, APNS Sandbox fonctionne correctement et reste normal ... c’est peut-être un autre bogue du côté Apple

Alors, ne vous inquiétez pas si vos méthodes sont parfaites et les certificats valides. Ceci est juste un problème du côté Apple .. dès que le problème est résolu, vos méthodes fonctionnent parfaitement (si tout va bien de votre côté).

Notez que la production fonctionne bien .. donc le problème concerne uniquement Sandbox APNS.

24
EI Captain v2.0

J'avais ce problème et j'ai finalement trouvé la note sur le site Web du développeur Apple et résolu ce problème:

Enregistrement, planification et gestion des notifications utilisateur

note iOS dans la section: "Inscription aux notifications à distance:

iOS Remarque: Si aucune connexion cellulaire ou Wi-Fi n'est disponible, ni la méthode application: didRegisterForRemoteNotificationsWithDeviceToken: ni l'application: didFailToRegisterForRemoteNotificationsWithError: la méthode n'est appelée. Pour les connexions Wi-Fi, cela se produit parfois lorsque l'appareil ne peut pas se connecter avec des APN via le port 5223. Si cela se produit, l'utilisateur peut passer à un autre réseau Wi-Fi qui ne bloque pas ce port ou, sur un iPhone ou un iPad, attendre jusqu'à ce que le service de données cellulaires soit disponible. Dans les deux cas, le périphérique doit pouvoir établir la connexion, puis l'une des méthodes de délégation est appelée.

Mon iPhone connecté uniquement par Wi-Fi, redémarrez l'iPhone et reconnectez-vous au réseau Wi-Fi. Ce problème a été résolu.

13
Homer Wang

XCode 8.3.1 et après

Après avoir essayé toutes les options ci-dessus, si la méthode delegate n’est toujours pas appelée, assurez-vous que, dans le projet,

under 'Capabilities', (next to General), 
 - Push Notifications option is turned ON`
- and under Background Modes, Remote Notifications is turned ON
5
Naishta

Honte sur moi!! O oublié l'étape la plus fondamentale:

 enter image description here

Après avoir suivi toutes les instructions relatives au traitement des certificats à partir d’ici: https://www.pluralsight.com/guides/Swift/creating-ios-rich-Push-notifications

L'outil d'envoi de notifications Push était: https://github.com/noodlewerk/NWPusher

Que la force soit avec toi!

Dans mon cas, après iOS 9.3, je crois. Si j'ai utilisé Localytics, didRegisterForRemoteNotificationsWithDeviceToken ne sera pas appelé. Je dois supprimer cela de mon code (dans ApplicationDidFinishLaunchingWithOption) [Localytics autoIntegrate: @ "xxxxx" launchOptions: launchOptions];

2
Kong Hantrakool

Ok, les gars, je viens de passer 11 heures consécutives à déboguer ce problème, alors espérons-le, cette réponse aidera quelqu'un.

Si tout est dit dans des threads similaires, configurez-le correctement et intégrez les analyses de Google Firebase, et didRegisterForRemoteNotificationsWithDeviceToken N'est pas encore appelé, cela est peut-être dû au fait que Google Firebase l'utilise par défaut. Pour une raison étrange, FIR ne retourne pas à la méthode d'origine après l'envoi de votre jeton à Google. Pour le réparer 

    FirebaseAppDelegateProxyEnabled to NO (BOOL)

dans votre Info.plist.

2
Alexander Atamanov

Dans mon cas, cela se passait parce que je mandatais tout le trafic de périphérique par l'intermédiaire de Charles. Le fait de supprimer cela a résolu le problème et m'a donné le rappel didRegister.

2
rounak

Pour moi, il exécutait l'application sur le simulateur. Le jeton Push n’est pas généré pour les simulateurs et j’ai donc entré didFailToRegisterForRemoteNotificationsWithError au lieu de didRegisterForRemoteNotificationsWithDeviceToken

0
Luda

S'il vous plaît ajouter le code ci-dessous, cela fonctionne pour moi,

 #ifdef __IPHONE_8_0
   - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
   {
   //register to receive notifications
  [application registerForRemoteNotifications];
  }

    - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
  {
  //handle the actions
  if ([identifier isEqualToString:@"declineAction"]){
  }
 else if ([identifier isEqualToString:@"answerAction"]){
  }
 }
 #endif

Vous obtiendrez un jeton d'appareil selon la méthode ci-dessous,

 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 

pour plus de détails s'il vous plaît se référer Détails Réponse

J'espère que c'est une aide pour quelqu'un.

0
Jaywant Khedkar