Удаленное уведомление iOS 8

Как я могу получить токен устройства для удаленного уведомления в iOS 8? Я использовал метод didRegisterForRemoteNotificationsWithDeviceToken в AppDelegate в iOS < 8, и он вернул токен устройства. Но в iOS 8 это не так.

Ответ 1

Прочтите код в UIApplication.h.

Вы будете знать, как это сделать.

Во-первых:

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

добавить код, подобный этому

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

, если вы не используете как Xcode 5, так и Xcode 6, попробуйте этот код

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

(Спасибо за @zeiteisen @dmur)


Во-вторых:

Добавьте эту функцию

#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

И вы можете получить deviceToken в

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

если он все еще не работает, используйте эту функцию и NSLog ошибка

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

Ответ 2

Способ регистрации для iOS 8 и поддержки старых версий

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

а в делегате приложения добавьте

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

iOS8 может получать тихие уведомления без запроса разрешения. Вызов - (void)registerForRemoteNotifications. После этого application:didRegisterForRemoteNotificationsWithDeviceToken: будет называться

Примечание: обратный вызов с токеном вызывается только в том случае, если приложение успешно зарегистрировалось для уведомлений пользователей с помощью функции ниже или если включена функция обновления фона.

Проверьте настройки для вашего приложения, если включен тип уведомления. Если нет, вы не получите токен устройства.

Теперь вы можете получать тихие уведомления с помощью

aps {
content-available: 1
}

в полезной нагрузке уведомления

Но уведомления, которые появляются, все еще нуждаются в разрешении. Вызов

UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:notificationSettings];

Этот код должен запрашивать разрешение.

Теперь вы должны быть готовы получать push-уведомления

Ответ 3

В моем случае я сделал необходимые обновления для запроса push-уведомления для iOS 7 и iOS 8, однако я не реализовал новый обратный вызов, когда пользователь iOS 8 предоставляет доступ. Мне нужно было добавить этот метод к моему делегату приложения.

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

Ответ 4

Если вы используете Xamarin.iOS для создания своего мобильного приложения, вы можете использовать этот фрагмент кода для запроса регистрации 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);
} 

Также вам нужно переопределить метод DidRegisterUserNotificationSettings, чтобы получить токен устройства, возвращенный с сервера APNS:

public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
{
    application.RegisterForRemoteNotifications();
}

Ответ 5

Ответ Мадао (fooobar.com/questions/68902/...) прав, но....

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge

должен быть более "правильным"

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

Эти флаги имеют одинаковые значения битовой маски, и поэтому оба они будут работать, но UIUserNotificationSettings требует UIUserNotificationType not UIRemoteNotificationType.

Кроме того, я бы назвал

[application registerUserNotificationSettings:settings];

В методе AppDelegate (в зависимости от предоставленных прав)

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings

Ответ 6

Я считаю, что лучший способ сохранить обратную совместимость можно с этим подходом, он работает для моего дела, надеюсь, для вас. Также довольно легко понять.

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

Ответ 7

UIUserNotificationType types = UIUserNotificationTypeBadge |
    UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

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

    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

    [application registerForRemoteNotifications];