2016-12-20 6 views
0

Я пытаюсь получить предупреждение «Перейти к настройкам», если пользователь отказывает в доступе к календарю. Он работает, как только пользователь отклонил календарь и снова откроет приложение. Но мне нужно, чтобы предупреждение появилось сразу после того, как пользователь отказал в доступе.Показывать предупреждение, если доступ к календарю запрещен Swift 3

Вот мой календарь код доступа:

/** 
*/ 
func requestDeniedAlert() -> UIAlertController { 
let requestAlertController = UIAlertController(title: "Calendar Access Denied", message: "Please Allow Calendar Access In Settings", preferredStyle: .alert) 
let settingsAction = UIAlertAction(title: "Go To Settings", style: .default){(action) in 
    print("The User Will Be Taken To the Settings") 
    let goToSettings = URL(string: UIApplicationOpenSettingsURLString) 
    UIApplication.shared.open(goToSettings!) 
} 
requestAlertController.addAction(settingsAction) 

return requestAlertController 
} 

/** 
reuestCalendarPermissions: 
@param 
@return 
*/ 
func requestCalendarPermissions() { 
eventInstance.requestAccess(to: .event, completion: {(accessGranted: Bool, error: Error?) in 

    if accessGranted == true { 
     print("Access Has Been Granted") 
     MainScreenTableView.flagVariable.statusFlag = true 
    } 
    else { 
     print("Change Settings to Allow Access") 
     MainScreenTableView.flagVariable.statusFlag = false 
    } 
}) 
} 

/** 
checkStatus: 
Notes: This function checks if the User has given calendar access to app 
If access is restricted or denied, a "Go To Settings" view will appear 
*/ 
func checkStatus() { 
let currentStatus = EKEventStore.authorizationStatus(for: EKEntityType.event) 

if currentStatus == EKAuthorizationStatus.notDetermined { 
    requestCalendarPermissions() 
} 
else if currentStatus == EKAuthorizationStatus.authorized { 
    print("Access Has Been Granted") 
    MainScreenTableView.flagVariable.statusFlag = true 
} 
else if (currentStatus == EKAuthorizationStatus.denied) || (currentStatus == EKAuthorizationStatus.restricted){ 
    print("Access Has Been Denied") 
    MainScreenTableView.flagVariable.statusFlag = false 
} 
} 

Я работаю с UITableViewController, который, казалось бы, что делает эту такую ​​боль. То, как у меня есть это сейчас, я устанавливаю флаг, а затем в tableview я представляю предупреждение. Но я не могу заставить предупреждение всплывать сразу после того, как пользователь отказывает в доступе.

Спасибо за помощь!

+0

Зачем вам показывать предупреждение сразу же после отказа пользователя? Пользователь уже знает, что доступ запрещен, поскольку он просто отрицал это. – rmaddy

+0

Ну, приложение не будет использоваться, если оно не имеет доступа к календарям. Поэтому, если они отказывают в доступе, я хочу всплывать, что позволяет им перейти к настройкам и предоставить доступ к календарям. Как будто некоторые приложения не позволят вам ничего делать, если вы не предоставите им доступ к службам определения местоположения. – rutheferd

+0

Ну, ваше приложение может быть отклонено, если приложение не будет работать, если доступ запрещен. Я считаю, что я где-то читал, что приложение должно работать, даже если некоторые из его функций не могут быть активированы из-за настроек пользователя. – Adamsor

ответ

0

Простым решением является представление вашего предупреждения из обработчика завершения вызова до eventInstance.requestAccess, когда accessGranted == false.

accessGranted будет false запрашивается однократный доступ, и пользователь нажимает кнопку «Отклонить» или в любое время после этого, когда пользователь запускает приложение и доступ по-прежнему запрещен.

+0

Когда мы помещаем настоящее непосредственно в accessGranted == false, я получаю сообщение об ошибке, представление которого отсутствует в иерархии окон. – rutheferd

+0

Вы должны представить предупреждение с уже видимого контроллера. – rmaddy

+0

Как только я это сделаю, хотя он не появляется, когда пользователь отрицает календарь. Может быть, если я проверю статус в поле зрения, он появился? – rutheferd