2017-01-30 10 views
0

Я хочу разрешить моим пользователям отключать/разрешать локальные уведомления из моего приложения. Я знаю, что когда я вызываю регистр для UILocalNotification, всплывающее окно отображается только один раз, независимо от того, сколько раз регистрируется регистр. Есть ли способ сбросить свой ответ и спросить его снова, если пользователь позже решит включить уведомления из моего приложения?Показать UILocalNotification запрос после нажатия пользователем «не разрешать»

Enable/Disable Notifications Toggle

application.registerUserNotificationSettings(
    UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], 
           categories: nil)) 

Могу ли я сбросить свой ответ на registerUserNotificationSettings()? Что-то вроде

// if user clicked enable notifications 
let grantedSettings = application.currentUserNotificationSettings() 
// reset grantedSettings 
// call registerUserNotificationSettings() again 

PS: Я знаю, что UNNotificationRequest рекомендуется, но я хочу, чтобы поддержать IOS 9.0 и я прочитал UNNotificationRequest для прошивки 10+.

ответ

2

Вы можете направлять пользователей на страницу настроек вашего приложения из настроек устройства приложения пользователя, позволяя им отказаться в в LocalNotification

  • IOS раньше, чем версия 10 дос не предоставляют информацию, если пользователь отказано в разрешении, или нет ,
  • В вашем приложении вам нужно сохранить в NSUserDefaults или где-то еще, что вы уже просили разрешения.
  • Каждый раз, когда вам требуется разрешение, сначала проверьте, доступно ли разрешение или нет.
  • Если разрешение недоступно, и ваше приложение ранее не запрашивало пользователя (на основе сохраненного состояния на предыдущем шаге), вы запрашиваете разрешение.
  • Если вы запросили разрешение пользователя раньше (на основе сохраненного состояния на предыдущем шаге), вы запрашиваете пользователей, если они хотят разрешить разрешение, если они говорят «Да» пересылают их в приложение настройки устройства.

Objective-C для прошивки < = 10 (Устаревший в прошивке 10)

Это код надрез для запрашивая UIUserNotificationSettings

UIUserNotificationSettings *currentSettings = [[UIApplication sharedApplication] currentUserNotificationSettings] 
if (currentSettings.types == UIUserNotificationTypeNone) // Permission does not exist either user denied or never been asked before 

if (!(currentSettings.types & (UIUserNotificationTypeAlert | UIUserNotificationTypeSound))) // This means your app does not have permission alert and to play sounds with notification. 

Этого код надреза показывает, как отправлять пользователь страница настройки устройства.

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; 
       if ([[UIApplication sharedApplication] canOpenURL:url]) { 
        [[UIApplication sharedApplication] openURL:url]; 
       } 

Swift 3 для прошивки < = 10 (Устаревшего в прошивке 10)

Это код надрез для запрашивая UIUserNotificationSettings

let currentSettings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) 
if currentSettings.types.isEmpty { 
     // Here you decide whether to prompt user with new authorization request 
     // or send user to setting app based on your stored variable 
    } 

Этого код надреза показывает, как отправлять пользователь страница настройки устройства.

if let urlStr = URL(string: UIApplicationOpenSettingsURLString) { 
     if UIApplication.shared.canOpenURL(urlStr) { 
      UIApplication.shared.openURL(urlStr) 
     } 
    } 

Для прошивки 10 и выше

вместо сохранения переменных в приложении чек ли когда-либо ваше приложение просило разрешение или нет, проверить значение authorizationStatus из UNNotificationSettings класса

Значение этого свойства не определено, если ваше приложение никогда не запрашивало авторизацию с использованием метода requestAuthorization (options: completeHandler :).

наряду с другими методами UNNotificationSettings аналогичными аналогичными старой версии этого класса (UIUserNotificationSettings) разрешения запроса или проверки на наличие разрешений, доступных как знак, предупреждение или звук.

+0

Одна из основных проблем с этим ответом - это в Objective-C. Несмотря на это, это хороший ответ. Вот ответ, подробно описывающий одно и то же в Swift: http://stackoverflow.com/questions/41303746/swift-3-camera-permission-dialog-priming-prime-permissions-in-ios10 – dfd

+0

Спасибо, это помогает. 'UIApplicationOpenSettingsURLString' возвращает меня прямо в настройки уведомлений моего приложения! Также спасибо @dfd за ссылку, очень хорошо знать об этой идее «Permission Priming». – Coder1224

+1

Я отметил этот вопрос из-за ответа. Когда-нибудь это мне тоже поможет. Рад, что это, возможно, дало вам альтернативу думать. – dfd

1

Нет, вы можете запросить разрешение только один раз, а разрешение управляется ОС. Если они нажмут Don't Allow, пользователь должен будет войти в настройки и изменить разрешение вручную.

Способ, которым многие приложения обходятся, заключается в том, чтобы показать пользовательское «мягкое» предупреждение перед показом диалога iOS. Таким образом, если пользователь нажимает «не сейчас», вы можете показать свое настраиваемое предупреждение в будущем и зарезервировать, показывая диалоговое окно iOS, когда пользователь готов к включению уведомлений (или любых других разрешений).

TLDR; Нет, это зависит от того, как пользователь может управлять настройками уведомлений после начального диалога.

+0

Это очень полезно. Тем не менее, это должно быть так. – Coder1224

 Смежные вопросы

  • Нет связанных вопросов^_^