Comment obtenir le jeton de périphérique pour la notification à distance dans iOS 8? J'ai utilisé la méthode didRegisterForRemoteNotificationsWithDeviceToken
dans AppDelegate
dans iOS <8 et le jeton de périphérique a été renvoyé. Mais dans iOS 8, ce n'est pas le cas.
Vous saurez comment faire cela.
Premier:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
ajouter un code comme celui-ci
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert
| UIUserNotificationTypeBadge
| UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:settings];
#endif
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
Si vous n'utilisez pas 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 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
La façon de s'inscrire pour iOS 8 et de continuer à supporter les versions antérieures
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
|UIUserNotificationTypeSound
|UIUserNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
et dans le délégué de l'application ajouter
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
iOS8 peut recevoir des notifications silencieuses sans demander la permission. Appelez - (void)registerForRemoteNotifications
. Après ce application:didRegisterForRemoteNotificationsWithDeviceToken:
sera appelé
Remarque: le rappel avec le jeton n'est appelé que si l'application a été enregistrée avec succès pour les notifications utilisateur avec la fonction ci-dessous ou si l'actualisation en arrière-plan est activée.
Vérifiez les paramètres de votre application si un type de notification est activé. Sinon, vous ne recevrez pas de jeton de périphérique.
Vous pouvez maintenant obtenir des notifications silencieuses avec
aps {
content-available: 1
}
dans la charge de notification
Mais les notifications qui apparaissent nécessitent toujours une autorisation. Appel
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:notificationSettings];
Ce code devrait demander la permission.
Vous devriez maintenant être prêt à recevoir les notifications Push
Dans mon cas, j'avais effectué les mises à jour nécessaires pour demander l'accès aux notifications Push pour iOS 7 et iOS 8, mais je n'avais pas implémenté le nouveau rappel pour lorsqu'un utilisateur iOS 8 accordait l'accès. J'avais besoin d'ajouter cette méthode à mon délégué d'application.
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
La réponse de Madao ( https://stackoverflow.com/a/24488562/859742 ) est juste mais ....
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
devrait être plus "correct"
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
Ces drapeaux ont les mêmes valeurs de masque de bits et c'est pourquoi les deux fonctionnent, mais UIUserNotificationSettings
requiert UIUserNotificationType
et non pas UIRemoteNotificationType
.
En dehors de cela, j'appellerais
[application registerUserNotificationSettings:settings];
Dans la méthode AppDelegate
(selon les droits accordés),
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
Si vous utilisez Xamarin.iOS pour créer votre application mobile, vous pouvez utiliser cet extrait de code pour demander l'enregistrement d'une notification Push.
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
{
UIUserNotificationType userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
else
{
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
}
De plus, vous devrez remplacer la méthode DidRegisterUserNotificationSettings
pour obtenir le jeton de périphérique renvoyé par le serveur APNS:
public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
{
application.RegisterForRemoteNotifications();
}
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings =
[UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];
Je pense que la meilleure façon de garder la compatibilité ascendante que nous pouvons utiliser avec cette approche, cela fonctionne pour mon cas, espérons que cela fonctionne pour vous. Aussi assez facile à comprendre.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}