К сожалению, ни одно из этих решений не предоставило действительно , чтобы решить проблему, потому что в конце концов API-интерфейсов серьезно не хватает, когда дело доходит до предоставления соответствующей информации. Вы можете сделать несколько предположений, однако использование currentUserNotificationSettings
(iOS8 +) просто недостаточно в его текущей форме, чтобы действительно ответить на вопрос. Хотя многие из представленных здесь решений, кажется, предполагают, что либо это, либо isRegisteredForRemoteNotifications
является более точным ответом, на самом деле это не так.
Учтите это:
с isRegisteredForRemoteNotifications
состояниями документации:
Возвращает YES, если приложение в настоящее время зарегистрировано для удаленных уведомлений, с учетом любых общесистемных настроек ...
Однако, если вы просто добавите NSLog
в свой делегат приложения, чтобы наблюдать за поведением, становится ясно, что это не будет вести себя так, как мы ожидаем, это будет работать. Это на самом деле относится непосредственно к удаленным уведомлениям, активированным для этого приложения / устройства. После первого включения всегда будет возвращаться YES
. Даже отключение их в настройках (уведомлениях) все равно приведет к возвращению YES
, потому что с iOS8 приложение может регистрироваться для удаленных уведомлений и даже отправлять на устройство, если у пользователя не включены уведомления, они просто не могут делать оповещения, значки и звук без включения пользователя. Беззвучные уведомления являются хорошим примером того, что вы можете продолжать делать, даже если уведомления отключены.
Насколько currentUserNotificationSettings
указывает на одну из четырех вещей:
Оповещения включены
Значки на
Звук включен
Ни один не включен.
Это не дает вам абсолютно никаких указаний относительно других факторов или самого переключателя уведомлений.
Пользователь на самом деле может отключить значки, звук и оповещения, но все равно может отображаться на экране блокировки или в центре уведомлений. Этот пользователь все еще должен получать push-уведомления и иметь возможность видеть их как на экране блокировки, так и в центре уведомлений. У них включено уведомление. НО currentUserNotificationSettings
вернет: UIUserNotificationTypeNone
в этом случае. Это не совсем указывает на фактические настройки пользователей.
Можно сделать несколько предположений:
- если
isRegisteredForRemoteNotifications
равно NO
, то можно предположить, что это устройство никогда не было успешно зарегистрировано для удаленных уведомлений.
- после первой регистрации для удаленных уведомлений осуществляется обратный вызов
application:didRegisterUserNotificationSettings:
, содержащий настройки уведомлений пользователя, поскольку это первый раз, когда пользователь был зарегистрирован, настройки должны указывать, что Пользователь выбран с точки зрения запроса на разрешение. Если настройки равны чему-то другому, кроме: UIUserNotificationTypeNone
, разрешение на передачу было предоставлено, в противном случае оно было отклонено. Причина этого заключается в том, что с момента начала процесса удаленной регистрации пользователь имеет возможность только принять или отклонить его, при этом начальные настройки принятия - это настройки, которые вы установили в процессе регистрации.