Я ищу способ определить, включил ли пользователь через настройки свои push-уведомления для моего приложения.
207
Я ищу способ определить, включил ли пользователь через настройки свои push-уведомления для моего приложения.
Позвони enabledRemoteNotificationsTypes
и проверь маску.
Например:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 и выше:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
и выше является неправильным, потому что оно проверяет, только если пользователь зарегистрирован для удаленного уведомления. Согласно документации:This method reflects only the successful completion of the remote registration process that begins when you call the registerForRemoteNotifications method. This method does not reflect whether remote notifications are actually available due to connectivity issues. The value returned by this method takes into account the user’s preferences for receiving remote notifications.
[[UIApplication sharedApplication] currentUserNotificationSettings];
проблема кванумпумато:
Где
types
даноможно использовать
вместо того
позволит вам проверять только, включены ли уведомления (и не беспокоиться о звуках, значках, центре уведомлений и т. д.). Первая строка кода (
types & UIRemoteNotificationTypeAlert
) вернется,YES
если для «Alert Style» установлено значение «Banners» или «Alerts», а дляNO
«Alert Style» установлено значение «None», независимо от других настроек.источник
grantedSettings.types.contains(notificationType)
В последней версии iOS этот метод устарел. Для поддержки iOS 7 и iOS 8 используйте:
источник
UserNotifications
. У меня нет полного ответа сейчас, к сожалению.Обновлен код для swift4.0, iOS11
Код для swift3.0, iOS10
источник
Ниже вы найдете полный пример, который охватывает как iOS8, так и iOS7 (и более низкие версии). Обратите внимание, что до iOS8 вы не могли различить «удаленные уведомления отключены» и «только просмотр на экране блокировки включен».
источник
Свифт 3+
Наблюдаемая версия RxSwift для iOS10 +:
источник
getNotificationSettings(...)
является асинхронным, поэтому возвращение внутрь будет игнорироватьсяПытаясь поддерживать iOS8 и ниже, мне не очень повезло,
isRegisteredForRemoteNotifications
как и предлагал Кевин. Вместо этого я использовалcurrentUserNotificationSettings
, который отлично работал в моем тестировании.источник
isEnabled = NO;
в вашихif
случаях он не нужен, так как он был инициализирован какNO
К сожалению, ни одно из этих решений не решило проблему, потому что в конце концов API не хватает, когда дело доходит до предоставления соответствующей информации. Вы можете сделать несколько предположений, однако использование
currentUserNotificationSettings
(iOS8 +) просто не достаточно в его текущей форме, чтобы действительно ответить на вопрос. Хотя многие решения здесь, кажется, предполагают, что либо это, либоisRegisteredForRemoteNotifications
скорее окончательный ответ, на самом деле это не так.Учти это:
с
isRegisteredForRemoteNotifications
документацией гласит:Однако, если вы просто
NSLog
добавляете делегата в свое приложение для наблюдения за поведением, становится ясно, что это не так, как мы ожидаем, это будет работать. Это на самом деле относится непосредственно к удаленным уведомлениям, активированным для этого приложения / устройства. После первого включения это всегда будет возвращатьсяYES
. Даже отключение их в настройках (уведомлениях) все равно приведет к этому возвращению,YES
потому что, начиная с iOS8, приложение может регистрироваться для удаленных уведомлений и даже отправлять на устройство, если у пользователя не включены уведомления, они просто могут не делать оповещения, Значки и звук без включения пользователя. Тихие уведомления являются хорошим примером того, что вы можете продолжать делать даже с отключенными уведомлениями.Насколько
currentUserNotificationSettings
это указывает на одну из четырех вещей:Предупреждения включены Значки включены Звук включен Ни один не включен.
Это не дает вам абсолютно никаких указаний относительно других факторов или самого переключателя уведомлений.
Пользователь может на самом деле отключить значки, звук и оповещения, но все равно будет отображаться на экране блокировки или в центре уведомлений. Этот пользователь все еще должен получать push-уведомления и иметь возможность видеть их как на экране блокировки, так и в центре уведомлений. У них включено уведомление. НО
currentUserNotificationSettings
вернется:UIUserNotificationTypeNone
в таком случае. Это не совсем указывает на фактические настройки пользователей.Несколько предположений можно сделать:
isRegisteredForRemoteNotifications
это так,NO
вы можете предположить, что это устройство никогда не было успешно зарегистрировано для удаленных уведомлений.application:didRegisterUserNotificationSettings:
содержащий настройки уведомлений пользователя, поскольку это первый раз, когда пользователь был зарегистрирован, в настройках должно указываться то, что пользователь выбрал с точки зрения запроса на разрешение. Если настройки равны чему-либо кроме:UIUserNotificationTypeNone
тогда разрешение на передачу было предоставлено, в противном случае оно было отклонено. Причина этого заключается в том, что с момента начала процесса удаленной регистрации пользователь имеет возможность только принять или отклонить, при этом начальные настройки принятия - это настройки, которые вы установили в процессе регистрации.источник
Чтобы завершить ответ, это может сработать примерно так ...
редактировать: это не правильно. так как это битовый материал, он не будет работать с переключателем, поэтому я прекратил использовать это:
источник
Для iOS7 и прежде вы должны действительно использовать
enabledRemoteNotificationTypes
и проверить, равно ли оно (или не равно в зависимости от того, что вы хотите)UIRemoteNotificationTypeNone
.Однако для iOS8 не всегда достаточно проверять только
isRegisteredForRemoteNotifications
столько состояний, сколько указано выше. Вы также должны проверить,application.currentUserNotificationSettings.types
равно ли (или не равно в зависимости от того, что вы хотите)UIUserNotificationTypeNone
!isRegisteredForRemoteNotifications
может вернуть true, даже еслиcurrentUserNotificationSettings.types
возвращаетсяUIUserNotificationTypeNone
.источник
источник
Здесь мы получаем UIRemoteNotificationType из UIApplication. Он представляет состояние push-уведомлений этого приложения в настройках, чем вы можете легко проверить его тип
источник
Я пытаюсь поддерживать iOS 10 и выше, используя решение, предоставленное @Shaheen Ghiassy, но нахожу проблему депривации
enabledRemoteNotificationTypes
. Итак, решение, которое я нахожу, используяisRegisteredForRemoteNotifications
вместоenabledRemoteNotificationTypes
которого устарело в iOS 8. Ниже приведено мое обновленное решение, которое отлично сработало для меня:И мы можем легко вызвать эту функцию и получить доступ к ее
Bool
значению и можем преобразовать ее в строковое значение следующим образом:Надеюсь, это поможет и другим :) Счастливого кодирования.
источник
Хотя ответ Zac был совершенно верным до iOS 7, он изменился с тех пор, как появилась iOS 8. Потому что enabledRemoteNotificationTypes устарел с iOS 8 и выше. Для iOS 8 и более поздних версий вам необходимо использовать isRegisteredForRemoteNotifications .
источник
Это Swifty решение работает хорошо для меня ( iOS8 + ),
Метод :
Использование :
ссылка
источник
Re:
это верно
но следующее тоже правильно! (так как UIRemoteNotificationTypeNone равен 0)
см. следующее
источник
Вот как это сделать в Xamarin.ios.
Если вы поддерживаете iOS 10+, используйте метод UNUserNotificationCenter.
источник
В Xamarin все вышеупомянутое решение не работает для меня. Вот что я использую вместо этого:
Он получает живое обновление также после того, как вы изменили статус уведомления в настройках.
источник
Полностью легкое копирование и вставка кода, созданного на основе решения @ ZacBowling ( https://stackoverflow.com/a/1535427/2298002 )
это также приведет пользователя к настройкам вашего приложения и позволит немедленно включить его
Я также добавил в решение для проверки, если службы определения местоположения включены (и приводит к настройкам также)
GLHF!
источник