Как узнать, было ли уже предупреждено уведомление о push-уведомлении
Я хочу реализовать пользовательский экран, который информирует моих пользователей, почему я собираюсь запросить разрешения push-уведомлений. После того, как они нажимают кнопку на этом пользовательском экране, я представляю диалоговое окно разрешения уведомлений iOS push с [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
Я хочу показать этот пользовательский экран один раз, если пользователь еще не видел диалоговое окно разрешения push-уведомлений. Я не могу использовать [[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone
, поскольку это также вернет "none", если пользователь решил не разрешать push-уведомления.
Любые идеи кто-нибудь?
Ответы
Ответ 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");
}