web-dev-qa-db-fra.com

la méthode registerForRemoteNotifications n'est pas appelée correctement

J'utilise actuellement Xcode6 beta (première version). En utilisant parse.com, j'essaie d'implémenter les notifications Push. Dans mon délégué app, j'ai 

  [application registerForRemoteNotifications];

Lorsque je l'exécute sur mon iPhone beta ios8, l'application ne me demande pas si je souhaite activer les notifications Push, et le application:didRegisterForRemoteNotificationsWithDeviceToken: correspondant n'est jamais appelé. Cependant, lorsque j'ai essayé de l'exécuter sur un iPhone ios7, l'application s'est bloquée et j'ai reçu une erreur unrecognized selector pour la méthode registerForRemoteNotifications

Ensuite, j'ai essayé de l'exécuter sur une version précédente de Xcode (version 5.0), mais j'ai reçu l'erreur de compilation no visible @interface declares registerForRemoteNotifications.

Je suppose que cette erreur a à voir avec des bugs liés à la transition vers iOS 8, mais je ne sais pas comment résoudre ce problème.

15
Mahir

Lisez le code dans UIApplication.h.

Vous saurez comment faire cela.

Premier:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

ajouter un code comme celui-ci

#ifdef __IPHONE_8_0
  //Right, that is the point
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#else
    //register to receive notifications
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif

Seconde:

Ajouter cette fonction

#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

Et vous pouvez obtenir le deviceToken dans 

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

si cela ne fonctionne toujours pas, utilisez cette fonction et NSLog leerror

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
29
Madao

Quelques observations:

  • la question utilisait REMOTE, pas locale
  • certaines questions portent sur le local, c'est une chose complètement différente
  • Je conviens que le temps de réponse peut être très long, mais vous devez implémenter des rappels (méthodes des délégués), comme d'autres personnes l'ont souligné
  • ne testez PAS contre le drapeau du compilateur, est conceptuellement et pratiquement faux
  • tester la présence de sélecteurs comme dans ce code:

    func registerForPushForiOS7AndAbove(){
    
    UIApplication.sharedApplication()
    let application = UIApplication.sharedApplication()
    if application.respondsToSelector(Selector("registerUserNotificationSettings:")) {
    
        let notifSettings = UIUserNotificationSettings(forTypes: .Sound | .Alert | .Badge,
            categories: nil)
    
        application.registerUserNotificationSettings(notifSettings)
        application.registerForRemoteNotifications()
    
    }
    else{
        application.registerForRemoteNotificationTypes( .Sound | .Alert | .Badge )
    }
    

    }

(ne manquez pas UIBackgroundModes dans PList .. peut être fait dans Capabilities)

5
ingconti

Utilisez simplement cet extrait de code pour vous inscrire aux notifications dans iOS 8:

UIUserNotificationSettings *settings = 
    [UIUserNotificationSettings 
        settingsForTypes: (UIUserNotificationTypeBadge | 
                           UIUserNotificationTypeSound |                 
                           UIUserNotificationTypeAlert) 
        categories:nil];

[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

Utilisez UIUserNotificationType au lieu de UIRemoteNotificationType!

2
Kai Burghardt

Dans iOS 8, le système ne demandera pas à l'utilisateur d'autoriser votre application à envoyer des notifications Push (à distance). Il est autorisé par défaut.

L'utilisateur peut choisir de ne pas autoriser les notifications de votre application sur Paramètres> Votre application> Notifications> Autoriser les notifications .

2
Lucien

La méthode registerForRemoteNotifications est disponible à partir de iOS8.

La méthode déléguée application:didRegisterForRemoteNotificationsWithDeviceToken: est appelée uniquement lorsque l'enregistrement est réussi. En cas d'échec, elle appelle la méthode application:didFailToRegisterForRemoteNotificationsWithError:.

Pour plus d'informations, consultez: UIApplication Class reference

Vérifiez également que la notification est activée pour l'application Settings -> Notifications -> YourApp -> Enable_Notifications

Selon la documentation, aucun des rappels ne se produira jusqu'à ce que le périphérique ait une connexion persistante avec le serveur Push. Alors S'il n'y a pas de connexion Wi-Fi ou de données disponible, les rappels ne le seront pas arriver - et Apple ne considère pas cela comme une condition d'erreur. seules les erreurs pouvant causer le didFail ... callback est un problème incorrect d'autorisations de certificat/d'application (problème de développement .__) ou d'autorisations refusées par l'utilisateur.

Veuillez passer par Guide de programmation des notifications push

1
Yatheesha B L