Как определить «Войти через Apple» у пользователя с несколькими устройствами с одинаковым идентификатором Apple? - PullRequest
2 голосов
/ 23 января 2020

Вот мой сценарий.

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 поможет мне определить учетные данные пользователя

  1. Во-первых, я должен реализовать сохранение userIdentifier в iCloud Keychain? Затем мне нужно добавить Keychain group Capability?
  2. Во-первых, я действительно не знаю, куда поместить эту функцию 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
            }
        }

}

И это не сработало, как я задумал.

Есть ли добрый учитель, который может ответить на мой вопрос?
Спасибо .

1 Ответ

3 голосов
/ 23 января 2020

Вам не нужно ничего делать. Apple обрабатывает все это за вас, связывая ваш пакет приложений с личностью в iCloud пользователя.

Если они запускают ваше приложение на другом устройстве с той же учетной записью iCloud, им не предоставляется возможность создать новую учетную запись, когда они используют «Войти через Apple» - им просто будет предложено войти в систему. с существующей учетной записью.

При желании вы можете использовать код в performExistingAccountSetupFlows(), чтобы предложить пользователю войти в систему, не нажимая кнопку «Войти через Apple»;

Когда этот код запускается, при обнаружении существующей ассоциации учетных записей им будет предложено пройти аутентификацию. Если аккаунт не найден, ничего не происходит.

...