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];
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
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.
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);
}
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.
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
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).
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);
}