Вот мой сценарий.
Someone has iPhone and iPad (iOS 13.0 or later), and he signed up with same appleID.
And he `sign in with apple` in his iPhone and try to `sign in with apple` again in his iPad.
Я не хочу, чтобы он дважды "входил в систему с яблоком", редактируя свое имя или проверяя общий доступ или скрывая свою электронную почту дважды, когда он нажимал кнопку входа.
Я обнаружил некоторые коды из примера кода, которые могут помочь моему сценарию выше
func performExistingAccountSetupFlows() {
// Prepare requests for both Apple ID and password providers.
let requests = [ASAuthorizationAppleIDProvider().createRequest(),
ASAuthorizationPasswordProvider().createRequest()]
// Create an authorization controller with the given requests.
let authorizationController = ASAuthorizationController(authorizationRequests: requests)
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()
}
И я обнаружил, ASPasswordCredential
поможет мне определить учетные данные пользователя
- Во-первых, я должен реализовать сохранение userIdentifier в
iCloud Keychain
? Затем мне нужно добавить Keychain group Capability
? - Во-первых, я действительно не знаю, куда поместить эту функцию
performExistingAccountSetupFlows
. Я хотел бы представить AuthorizationController, когда пользователь нажимает кнопку. Поэтому я попробовал этот подход.
@available(iOS 13.0, *)
@objc private func handleAuthorizationAppleIDButtonPress() {
let appleIDProvider = ASAuthorizationAppleIDProvider()
appleIDProvider.getCredentialState(
forUserID: KeychainItem.currentUserIdentifier ?? "") { [weak self] (credentialState, error) in
guard let `self` = self else { return }
log.debugPrint(KeychainItem.currentUserIdentifier ?? "nil")
switch credentialState {
case .authorized:
// The Apple ID credential is valid. Show Home UI Here
// MARK: Existing iCloud keychain
self.performExistingAccountSetupFlows()
break
case .revoked, .notFound:
let request = appleIDProvider.createRequest()
request.requestedScopes = [
.fullName,
.email
]
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.presentationContextProvider = self
controller.performRequests()
break
default:
break
}
}
}
И это не сработало, как я задумал.
Есть ли добрый учитель, который может ответить на мой вопрос?
Спасибо .