Подтвердить что ты не робот

Как узнать, было ли уже предупреждено уведомление о push-уведомлении

Я хочу реализовать пользовательский экран, который информирует моих пользователей, почему я собираюсь запросить разрешения push-уведомлений. После того, как они нажимают кнопку на этом пользовательском экране, я представляю диалоговое окно разрешения уведомлений iOS push с [[UIApplication sharedApplication] registerForRemoteNotificationTypes:

Я хочу показать этот пользовательский экран один раз, если пользователь еще не видел диалоговое окно разрешения push-уведомлений. Я не могу использовать [[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone, поскольку это также вернет "none", если пользователь решил не разрешать push-уведомления.

Любые идеи кто-нибудь?

4b9b3361

Ответ 1

Вы можете использовать NSUserDefaults:

#define kPushNotificationRequestAlreadySeen @"PushNotificationRequestAlreadySeen"

if(![[NSUserDefaults standardUserDefaults] boolForKey:kPushNotificationRequestAlreadySeen]) {

    // Notify the user why you want to have push notifications
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:... delegate:self ...];
    [alertView show];

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kPushNotificationRequestAlreadySeen];
}
else {
    // Already allowed -> register without notifying the user
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
}

И

- (void)alertView:(UIAlertView*)alertView didDismissWithButtonIndex:(NSInteger)index {
    // Actually registering to push notifications
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
}

Ответ 2

Это просто работа, но будет работать в большинстве случаев.

Когда iOS предлагает пользователю разрешить push-уведомления, вызывается applicationWillResignActive.

После вызова registerForRemoteNotificationTypes... запустите таймер (или dispatch_after), который покажет новое предупреждение пользователю, объяснив, что им нужно будет использовать приложение "Настройки" для включения уведомлений. Затем в приложенииWillResignActive отмените таймер. Таким образом, пояснение будет показано только если applicationWillResignActive никогда не вызывается.

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

Ответ 3

Решение, которое я нашел, немного взломан, но оно работает. Вам нужно позвонить registerUserNotificationSettings для двух разных настроек уведомлений: один без категории уведомлений и один с уведомлением категории:

        //Request notification permission
    UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

    //Request notification permission again, but with a category with no actions
    UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
    category.identifier = @"com.xyz.markNotificationPopupShownCategoryIdentifier";

    UIUserNotificationSettings *notificationSettingsWithCategory = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:[NSSet setWithObject:category]];
    [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettingsWithCategory];

Метод didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings в делегате приложения будет вызываться два раза, и независимо от ответа пользователя в уведомлении о разрешении после второго вызова текущие настройки уведомлений будут содержать категорию. Пока количество категорий больше 0, вы можете точно знать, что диалог разрешения уведомлений был показан:

if ([UIApplication sharedApplication].currentUserNotificationSettings.categories.count > 0) {
    NSLog(@"Notifications permission has been asked");
} else {
    NSLog(@"Notifications permission hasn't been asked");
}