Измените представление после предоставления разрешения на контакт
На данный момент я могу успешно запросить у пользователя разрешение на доступ к своей контактной информации. Я обрабатываю это с помощью оператора switch следующим образом:
func requestContactPermissions() {
let store = CNContactStore()
var authStatus = CNContactStore.authorizationStatus(for: .contacts)
switch authStatus {
case .restricted:
print("User cannot grant permission, e.g. parental controls in force.")
exit(1)
case .denied:
print("User has explicitly denied permission.")
print("They have to grant it via Preferences app if they change their mind.")
exit(1)
case .notDetermined:
print("You need to request authorization via the API now.")
store.requestAccess(for: .contacts) { success, error in
if let error = error {
print("Not authorized to access contacts. Error = \(String(describing: error))")
exit(1)
}
if success {
print("Access granted")
}
}
case .authorized:
print("You are already authorized.")
@unknown default:
print("unknown case")
}
}
в .notDetermined
случае, это открывает диалоговое окно, в котором я могу либо щелкнуть no
или yes
, предоставление или запрещение доступа к приложению. Это нормально и ожидаемо.
Я хочу изменить представление, если пользователь нажимает yes
. Прямо сейчас у меня естьrequestContactPermissions
функция внутри кнопки, например:
Button(action: {
withAnimation {
// TODO: Screen should not change until access is successfully given.
requestContactPermissions()
// This is where the view change is occurring.
self.loginSignupScreen = .findFriendsResults
}
})
Как я могу добавить в логику изменения представления после того, как пользователь предоставил приложению доступ к своим контактам?
1 ответ
Добавить завершение к requestContactPermissions
функция что-то вроде этого (я обрезал нерелевантные части ответа):
func requestContactPermissions(completion: @escaping (Bool) -> ()) {
let store = CNContactStore()
var authStatus = CNContactStore.authorizationStatus(for: .contacts)
switch authStatus {
case .notDetermined:
print("You need to request authorization via the API now.")
store.requestAccess(for: .contacts) { success, error in
if let error = error {
print("Not authorized to access contacts. Error = \(String(describing: error))")
exit(1)
//call completion for failure
completion(false)
}
if success {
//call completion for success
completion(true)
print("Access granted")
}
}
}
}
а затем вы можете определить внутри закрытия, предоставил ли пользователь разрешение или нет:
Button(action: {
withAnimation {
// TODO: Screen should not change until access is successfully given.
requestContactPermissions { didGrantPermission in
if didGrantPermission {
//this is the part where you know if the user granted permission:
// This is where the view change is occurring.
self.loginSignupScreen = .findFriendsResults
}
}
}
})