web-dev-qa-db-fra.com

Notification à distance iOS 8

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.

76
quang thang

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

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
180
Madao

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

75
zeiteisen

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];
}
15
Kyle Clegg

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
1
Ilker Baltaci

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();
}
1
Michael Kniskern
UIUserNotificationType types = UIUserNotificationTypeBadge |
    UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

    UIUserNotificationSettings *mySettings =
    [UIUserNotificationSettings settingsForTypes:types categories:nil];

    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

    [application registerForRemoteNotifications];
0
Dev_Tandel

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