15

Je développe une application iPhone qui nécessite une notification push. J'ai suivi les instructions pour créer les certifications et modifier l'identifiant de l'application. Je ne suis pas totalement sûr de l'avoir fait correctement, mais j'ai suivi les instructions. Une idée de comment je peux vérifier si c'est OK?iPhone registerForRemoteNotificationTypes ne génère pas d'erreur mais ne déclenche pas le délégué qui donne le jeton de périphérique

Lorsque j'ai couru dans l'émulateur, j'ai reçu un message d'erreur indiquant que l'émulateur ne supportait pas les notifications push. C'était quelque peu attendu.

BTW: J'ai semblé cette question là-bas quelques fois. Il semble toujours être avec un téléphone cassé par la prison. Mon téléphone n'est PAS en prison. Mais lorsque je débogue sur l'iPhone, la méthode didRegisterForRemoteNotificationsWithDeviceToken n'est jamais déclenchée. J'apprécierai vraiment de l'aide. Mon code suit.

-(void)applicationDidFinishLaunching:(UIApplication *)application 
{  
    rootController.delegate = self; 
    [window addSubview:rootController.view]; 
    [window makeKeyAndVisible]; 

    [[UIApplication sharedApplication] 
    registerForRemoteNotificationTypes: 
    (UIRemoteNotificationTypeAlert | 
    UIRemoteNotificationTypeBadge | 
    UIRemoteNotificationTypeSound)]; 
} 

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{ 
    NSString *str = 
    [NSString stringWithFormat:@"%@",deviceToken]; 
    NSLog(str); 
} 

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err 
{ 
    NSString *str = [NSString stringWithFormat: @"Error: %@", err]; 
    NSLog(str);  
} 
+0

Quel certificat utilisez-vous pour exécuter l'application? Je pense que cela peut avoir un impact. – Jonathan

Répondre

2

Découvrez TN2265, qui a des notes pour le débogage des problèmes de notification push. J'ai eu exactement ce problème aujourd'hui et il s'est avéré que le WiFi a été éteint sur iPod Touch. Depuis que vous avez dit que vous travailliez à partir d'un iPhone. ce n'est probablement pas ça, mais ça vaut le coup de vérifier la note technique pour des possibilités supplémentaires.

1

Vérifiez les paramètres de votre pare-feu.

De Scott K's Answer:

If your iOS device is capable of using the cellular data network, check that it has an active cellular data plan. Turn off Wi-Fi in Settings and see if you can still browse the web with Safari, for example. On the other hand, if the push service is using Wi-Fi, any firewalls between your device or computer and the Internet must allow TCP traffic to and from port 5223.

19

Habituellement, si didRegisterForRemoteNotificationsWithDeviceToken est jamais appelé, il est parce que vous utilisez un profil de provisionnement qui n'est pas APS-entitled. Si votre application est une application de production, elle doit être signée avec un profil de distribution pour que les poussées fonctionnent. S'il s'agit d'une application de développement, vous devez la signer avec un profil de développement.

EDIT: Il est également important de noter que le provisioning profile doit utiliser un ID de regroupement explicite. Les poussées envoyées à tout élément signé avec un profil générique ne seront pas envoyées.

+0

Merci, j'ai oublié de remplacer le profil d'approvisionnement par le nouveau – htafoya

+0

Cela est parfaitement logique, sauf pour le fait que 'didFailToRegisterForRemoteNotificationsWithError:' n'est pas appelé dans ce cas? Est-ce vraiment le cas? – WiseOldDuck

+0

Oui, vraiment, pas de rappel du tout si vous n'activez pas cette capacité – Sulfkain

9

J'ai eu le même problème.

Pour moi, c'était le paramètre de notification pour l'application avait tout éteint.

Si dans les paramètres iOS, les notifications de l'application sont désactivées, cette méthode ne sera pas appelée.

Une fois que j'ai activé un type de notification, il a commencé à fonctionner.

Settings App->Notification Settings->[My App]

+0

Où est-ce ?? – hasan83

+0

@hasan, dans l'application iOS Paramètres. Ce n'est pas tellement une solution, mais une explication du problème. Si quelqu'un désactive les notifications pour votre application, vous n'obtenez pas d'erreur ou d'appel de méthode. – Eric

+0

@hasan Vous dites que si un utilisateur désactive les notifications push pour mon application, alors didRegisterForRemoteNotificationsWithDeviceToken et didFailToRegisterForRemoteNotificationsWithError ne seront pas appelés? – PaulG

1

Selon la documentation d'Apple "Dépannage Push Notifications" "Si aucune demande de rappel de délégué: didRegisterForRemoteNotificationsWithDeviceToken: ni application: didFailToRegisterForRemoteNotificationsWithError:. Est appelé, cela signifie que cette connexion est pas encore establihed" ... "Le système peut ne pas avoir de connectivité Internet .. mode avion."

Je vois ce comportement aussi mais PAS à cause du manque de connectivité Internet mais parce que, comme IrFan l'a souligné, les notifications ont été désactivées pour l'application, dès que vous activez les notifications, la méthode se déclenche.

Solution 1) Ne comptez PAS sur l'une ou l'autre de ces méthodes déléguées jamais appelées. 2) Si, et quand, vous recevez un rappel délégué, agissez dessus. 3) Manque de connectivité réseau, les notifications push étant désactivées pour l'application, APS non activé ou? entraînera les délégués à ne pas être appelé.

1

Si vous compilez en utilisant le SDK iOS8 + (par exemple xcode 6+), alors les méthodes obsolètes de l'API iOS7 sont ignorées silencieusement et vous n'obtiendrez aucune erreur.

Vous avez besoin quelque chose comme ça si vous voulez soutenir iOS 7 et 8:

// Have to explicitly use the iOS8 api as the deprecated API is silently ignored on iOS8, surprisingly. 
if ([UIDevice currentDevice].systemVersion.intValue >= 8) { // iOS8+ API. 
    UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge; 
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; 
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; 
    [[UIApplication sharedApplication] registerForRemoteNotifications]; 
} else { // iOS7. 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
     UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound]; 
} 

Si vous rencontrez des problèmes avec aps-environment manquants de votre profil, vous aurez au moins obtenir un rappel d'erreur utile avec didFailToRegisterForRemoteNotificationsWithError

+0

Dans mon cas, il me manquait l'appel à 'registerUserNotificationSettings:' (j'étais sous l'hypothèse que je devrais connecter en chaîne et l'appeler depuis le rappel de succès). L'appel 'registerForRemoteNotifications' ne déclenche pas le processus d'enregistrement. –

Questions connexes