Как проверить, что пользователь включил push-уведомление из настроек?
Этот вопрос относится к изменениям iOS 10 APNS.
Это поток моего приложения:
- Приложение установлено
- Приложение запускается Screen Экран входа в систему
- Успешный вход в систему ➝ Главный экран
- Push-уведомление ➝ Запрос
- Push-уведомление ➝ Не разрешать
- Приложение Закрыть
- Настройки ➝ Пользователь активировал Push-уведомление
- Приложение открыто
- Как проверить, обновлены ли настройки?
- Приложение Закрыть
- Настройки ➝ Пользователь отключен Push-уведомления
- Приложение открыто
- Как проверить, обновлены ли настройки?
Я запрашиваю push-уведомление (шаг 4.) только когда пользователь входит в систему. Поэтому, пока пользователь не выйдет из системы, я не смогу повторно запросить push-уведомление.
Есть ли какое-то аккуратное и ясное решение для этого, чтобы мы могли поддерживать изменения iOS 10, все еще поддерживая iOS 8 или 9?
3 ответа
UIUserNotificationSettings больше не поддерживается в iOS8. Если вы хотите получить доступ к общему состоянию настроек ваших приложений, ознакомьтесь с UNUserNotifications, новой платформой. Насколько я понимаю, он рассматривает толчок и локальность как одну вещь. Когда вы регистрируете уведомления, вы можете позвонить, чтобы зарегистрировать push. Но для локальных разрешений - пропуска и т. Д. Вам все равно нужно запросить разрешение пользователя. То есть ваше устройство может принимать push-уведомления без разрешения пользователя для получения обновлений данных, но вы можете показывать уведомления только через центр с разрешениями. Вот как можно увидеть, какие разрешения были предоставлены.
Импортируйте фреймворк в ваш класс
@import UserNotifications;
Запрос настроек
- (void)_queryNotificationsStatus { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings){ //1. Query the authorization status of the UNNotificationSettings object switch (settings.authorizationStatus) { case UNAuthorizationStatusAuthorized: NSLog(@"Status Authorized"); break; case UNAuthorizationStatusDenied: NSLog(@"Status Denied"); break; case UNAuthorizationStatusNotDetermined: NSLog(@"Undetermined"); break; default: break; } //2. To learn the status of specific settings, query them directly NSLog(@"Checking Badge settings"); if (settings.badgeSetting == UNAuthorizationStatusAuthorized) NSLog(@"Yeah. We can badge this puppy!"); else NSLog(@"Not authorized"); }]; }
Используйте этот код
if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) {
// yes
}else{
// no
}
Вы можете использовать currentUserNotificationSettings всякий раз, когда ваше приложение выходит на передний план.
UIUserNotificationSettings *grantedSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];
if (grantedSettings.types == UIUserNotificationTypeNone) {
NSLog(@"No permiossion granted");
}
else if (grantedSettings.types & UIUserNotificationTypeSound & UIUserNotificationTypeAlert ){
NSLog(@"Sound and alert permissions ");
}
else if (grantedSettings.types & UIUserNotificationTypeAlert){
NSLog(@"Alert Permission Granted");
}
Если вы хотите проверить, изменился ли статус по сравнению с предыдущим, вы можете сохранить предыдущее значение currentUserNotificationSettings
к некоторой переменной и сравнить ее с текущим значением сверхурочных в applicationWillEnterForeground
метод.