12

iOS13(测试版)苹果登录错误

@available(iOS 13.0, *)
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        // Handle error.
        crprint(error.localizedDescription)
    }

未能完成操作。(com.apple.AuthenticationServices.AuthorizationError 错误 1000。)

4

7 回答 7

8

我昨天遇到了同样的问题,我已经按照以下步骤解决了这个问题:

  1. 转到https://appleid.apple.com/account/manage,在该Devices部分下,您应该找到您使用 Apple ID 登录的设备,
  2. 查找 Apple SSO 无法运行的设备/模拟器,单击它并单击从帐户中删除,
  3. 返回您的设备/模拟器设置,它会要求您再次进行身份验证。当您成功进行身份验证后,Apple SSO 应该会再次工作

我不确定是什么导致了这个问题,可能是模拟器和 Apple ID 之间的一些问题。

于 2020-08-07T08:02:49.423 回答
3

就我而言,启动ASAuthorizationController包括请求ASAuthorizationPasswordProvider会导致错误。

未能完成操作。(com.apple.AuthenticationServices.AuthorizationError 错误 1000。)


ASAuthorizationError.Code文档中;1000是为了unknown

ASAuthorizationError.Code.unknown

授权尝试因未知原因而失败。

宣言

case unknown = 1000

参考:https ://developer.apple.com/documentation/authenticationservices/asauthorizationerror/code/unknown

现在这并不是特别有用,但确实给了我一个线索来检查我ASAuthorizationController试图通过来自ASAuthorizationAppleIDProvider&的 2 个请求启动的设置ASAuthorizationPasswordProvider,如下所示:

func loginWithAppleButtonPressed() {
    let appleSignInRequest = ASAuthorizationAppleIDProvider().createRequest()
    appleSignInRequest.requestedScopes = [.fullName, .email]

    let anySignInRequest = ASAuthorizationPasswordProvider().createRequest()

    let controller = ASAuthorizationController(authorizationRequests: [appleSignInRequest, 
                                                                       anySignInRequest])
    controller.delegate = self
    controller.presentationContextProvider = self

    controller.performRequests()
}

我在一个启用了 2FA 的 Apple ID 的模拟器上以及在另一个没有 2FA 的 Apple ID 的设备上尝试了这个,两次它都会去authorizationController(controller:didCompleteWithError error:),就是这样。


解决方案:

所以为了简单起见,我ASAuthorizationControllerASAuthorizationAppleIDProvider用这样的方式启动:

func loginWithAppleButtonPressed() {
    let appleSignInRequest = ASAuthorizationAppleIDProvider().createRequest()
    appleSignInRequest.requestedScopes = [.fullName, .email]

    let controller = ASAuthorizationController(authorizationRequests: [appleSignInRequest])
    controller.delegate = self
    controller.presentationContextProvider = self

    controller.performRequests()
}

瞧!这次事情按预期工作:

  1. 将 Apple ID 与 2FA 结合使用时
    • 弹出登录请求
  2. 使用没有 2FA 的 Apple ID 时
    • 弹出一个错误,告诉我启用 2FA
    • authorizationController(controller:didCompleteWithError error:)_error 1000

因此,在我的情况下似乎ASAuthorizationPasswordProvider是罪魁祸首,但由于ASAuthorizationError.Code.unknown是一般错误情况,因此此解决方案可能对您不起作用。

此外,在我的情况下,我只ASAuthorizationAppleIDProvider需要 Apple ID 登录,因此放弃了对ASAuthorizationPasswordProvider.

于 2019-09-13T07:11:39.477 回答
3

在我的情况下,我需要先检查ASAuthorizationPasswordProvider,然后,如果没有存储的凭据,请使用ASAuthorizationAppleIDProvider. 对于这种情况,我不得不做一些仰卧起坐。下面的代码:

// Initial point   
public func fire(appleIDCompletion: @escaping AppleIDServiceCompletion) {
    self.completion = appleIDCompletion

    let requestPassword = ASAuthorizationPasswordProvider().createRequest()
    performRequest(requestPassword)
}

// help function
private func performRequest(_ request: ASAuthorizationRequest) {
    let controller = ASAuthorizationController(authorizationRequests: [request])
    controller.delegate = self
    controller.presentationContextProvider = self
    controller.performRequests()
} 

// delegate
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    if let e = error as? ASAuthorizationError {
        switch e.code {
        case .canceled:
            trace("User did cancel authorization.")
            return
        case .failed:
            trace("Authorization failed.")
        case .invalidResponse:
            trace("Authorization returned invalid response.")
        case .notHandled:
            trace("Authorization not handled.")
        case .unknown:
            if controller.authorizationRequests.contains(where: { $0 is ASAuthorizationPasswordRequest }) {
                trace("Unknown error with password auth, trying to request for appleID auth..")

                let requestAppleID = ASAuthorizationAppleIDProvider().createRequest()
                requestAppleID.requestedScopes = [.email, .fullName]
                requestAppleID.requestedOperation = .operationImplicit
                performRequest(requestAppleID)
                return
            } else {
                trace("Unknown error for appleID auth.")
            }
        default:
            trace("Unsupported error code.")
        }
    }

    completion?(.rejected(error))
}

奇迹般有效

于 2020-05-19T14:04:24.580 回答
2

只需从 Capability 添加 +“使用 Apple 登录”。

于 2020-02-19T09:54:44.437 回答
1

以苹果为例,

performExistingAccountSetupFlows,仅在 viewDidAppear 上调用一次此方法。如果用户信息已经存在,那么 Apple 将显示它以进行登录。如果没有,那么它将抛出错误。

handleAuthorizationAppleIDButtonPress,每当用户点击Sign in with Apple按钮时,请注意,如果一个帐户已经存在,它将已经向用户显示。我相信它仍在进行中,并且并未涵盖所有用例,例如,如果用户最初从 ViewDidAppear 调用中看到登录信息并取消它,那么用户必须在点击此方法时创建一个新帐户,因为它缺少ASAuthorizationPasswordProvider请求。如果用户有一些登录信息,那么在这种情况下,此调用(带有ASAuthorizationPasswordProvider)将成功,但如果没有可用数据,则用户在点击此按钮时将看不到任何操作,因为它会引发错误。

我还在想办法,如果我还有什么要补充的,我会更新答案。所以,现在我们只能有一个用例来使用这个Sign in with Apple选项。

更新: 一旦我创建了一个新帐户,同样的流程为我提供了使用现有帐户登录的机会。所以,我可以说没有必要在方法中包含对ASAuthorizationPasswordProvider请求的调用handleAuthorizationAppleIDButtonPress。我正在设备上进行所有测试。

Settings -> AppleId -> Password & Security -> Apple ID Logins如果您需要测试各种场景,您可以随时去检查和删除帐户。

更新 2: 如果您已经保存了密码或创建了 App Id 帐户,那么在其他情况下一切似乎也可以正常工作,因此即使我在handleAuthorizationAppleIDButtonPress调用中传递了 ASAuthorizationPasswordProvider,它也可以正常工作。我建议不要传递ASAuthorizationPasswordProvider下一个呼叫并保持上述流程,这样如果没有保存的密码或创建 Apple Id,那么它将为用户提供创建新 id 的选项,如果已经有一个 id那存在那么它将显示该ID。

 override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        performExistingAccountSetupFlows()
    }

    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()
    }

    @objc
    func handleAuthorizationAppleIDButtonPress() {
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        let request = appleIDProvider.createRequest()
        request.requestedScopes = [.fullName, .email]

        let authorizationController = ASAuthorizationController(authorizationRequests: [request])
        authorizationController.delegate = self
        authorizationController.presentationContextProvider = self
        authorizationController.performRequests()
    }
于 2020-02-27T06:10:04.350 回答
1

我已经通过sign in with apple as在 entitlements plist 中添加密钥来解决它。

在此处输入图像描述

于 2020-01-20T06:15:17.643 回答
0

我通过在指纹扫描仪上按住手指直到完成来解决了这个问题。我不是iphone用户,所以我不习惯指纹扫描仪。如果您过早地松开手指,则会出现此错误。

于 2020-09-11T19:22:27.727 回答