Измените представление после предоставления разрешения на контакт

На данный момент я могу успешно запросить у пользователя разрешение на доступ к своей контактной информации. Я обрабатываю это с помощью оператора 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
       }
    }

  }
}) 
Другие вопросы по тегам