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



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

561   7  

7 ответов:

прочитайте код в UIApplication.з.

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

первый:

- (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 's remind)


второй:

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

#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

и вы можете получите завершен в

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

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

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

способ зарегистрироваться для 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-уведомлению для iOS 7 и iOS 8, однако я не реализовал новый обратный вызов, когда пользователь iOS 8 предоставляет доступ. Мне нужно было добавить этот метод в делегат приложения.

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

Если вы используете 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();
}

ответ Мадао (https://stackoverflow.com/a/24488562/859742) правильно, но....

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge

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

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

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

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

[application registerUserNotificationSettings:settings];

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

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

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

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)];
    }
UIUserNotificationType types = UIUserNotificationTypeBadge |
    UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

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

    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

    [application registerForRemoteNotifications];

Comments

    Ничего не найдено.