web-dev-qa-db-fra.com

Obtenez le jeton d'appareil dans iOS 8

J'ai besoin d'un jeton d'appareil pour implémenter la notification Push dans mon application.
Comment puis-je obtenir un jeton d'appareil puisque la méthode didRegisterForRemoteNotificationsWithDeviceToken ne fonctionne pas sur iOS 8. J'ai essayé ce code dans déléguée d'application, mais il ne me donne pas de jeton d'appareil.

    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
18
Pankaj

Lisez le code dans UIApplication.h.

Vous saurez comment procéder.

Premier:

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

ajouter du code comme celui-ci

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

si vous n'utilisez pas à la fois Xcode 5 et Xcode 6, essayez ce code

if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
  UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
      |UIRemoteNotificationTypeSound
      |UIRemoteNotificationTypeAlert) categories:nil];
  [application registerUserNotificationSettings:settings];
} else {
  UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
  [application registerForRemoteNotificationTypes:myTypes];
}

(Merci pour le rappel de @zeiteisen @dmur)


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 l'appareil

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

si cela ne fonctionne toujours pas, utilisez cette fonction et NSLog l'erreur

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

Ajout d'une petite validation à la réponse de @ Madao au cas où vous auriez des plantages sur les anciennes versions d'iOS:

#ifdef __IPHONE_8_0
if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
#endif

UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound |     UIRemoteNotificationTypeNewsstandContentAvailability;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];

Qu'est-ce que le __IPHONE_8_0 la macro ne vous permet que de compiler dans les anciennes versions de xCode/iOS, vous n'obtenez pas d'erreurs de compilation ou d'avertissements, mais l'exécution du code sur les appareils avec iOS 7 ou inférieur entraînera un crash.

11
Juan de la Torre

Pour obtenir un jeton d'appareil dans iOS8 +

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//This code will work in iOS 8.0 xcode 6.0 or later
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeNewsstandContentAvailability| UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
return YES;
}

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString* deviceToken = [[[[deviceToken description]
                         stringByReplacingOccurrencesOfString: @"<" withString: @""]
                         stringByReplacingOccurrencesOfString: @">" withString: @""]
                         stringByReplacingOccurrencesOfString: @" " withString: @""] ;
NSLog(@"Device_Token     -----> %@\n",deviceToken);
}
3
ChenSmile

Mis à part le reste des réponses condescendantes à cette question, la raison la plus probable pour laquelle ce problème peut se produire pour un développeur averti qui a implémenté toutes les méthodes déléguées requises est qu'il utilise un profil de provisioning générique (pourquoi pas? Cela facilite la création et le test d'applications de développement!)

Dans ce cas, vous verrez probablement l'erreur Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application"

Pour tester les notifications, vous devez en fait remonter à 2000 et plus tard, vous connecter à developer.Apple.com et configurer votre profil d'approvisionnement spécifique à l'application avec les notifications Push activées.

  1. Créez un ID d'application correspondant à l'identifiant de bundle de votre application. Assurez-vous de cocher "Notifications push" (actuellement 2e option à partir du bas).
  2. Créez un profil d'approvisionnement pour cet ID d'application.
  3. Passez par le reste des horribles étapes d'approvisionnement que nous aimerions tous oublier.
  4. ?
  5. Profit!
0
dave

La réponse de @madoa est absolument correcte. Notez simplement que cela ne fonctionne pas dans le simulateur.

Dans ce cas

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

est appelé avec une erreur REMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORTED_NSERROR

0
CedricSoubrie

Sur votre compte de développeur, assurez-vous que vos notifications Push sont correctement configurées dans votre ID d'application, puis vous devez régénérer et télécharger votre profil d'approvisionnement. Mon problème était que j'avais téléchargé le profil d'approvisionnement mais que xcode exécutait le mauvais. Pour résoudre ce problème, accédez à vos paramètres de génération cible, faites défiler la page jusqu'à Signature du code, sous la section du profil d'approvisionnement, assurez-vous que vous utilisez le profil d'approvisionnement approprié qui correspond au nom de celui que vous avez généré (il devrait y avoir une liste déroulante avec des options si vous en ont installé plusieurs).

0
Trianna Brannon

Voici la solution.

dans applicationDidFinishLaunchingWithOptions:

{

 UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
}


- (void)application:(UIApplication*)application didRegisterUserNotificationSettings:(nonnull UIUserNotificationSettings *)notificationSettings
{
    [application registerForRemoteNotifications];
}


- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(nonnull NSError *)error
{
    NSLog(@" Error while registering for remote notifications: %@", error);
}

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken
{
  NSLog(@"Device Token is : %@", deviceToken);
}
0
YSR fan