web-dev-qa-db-fra.com

Lorsque j'utilise le Apple pour me connecter, la boîte de sélection apparaîtra. J'ai choisi d'utiliser le mot de passe pour continuer et l'invite n'est pas terminée

iOS13 (beta) Apple Erreur de connexion

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

Impossible de terminer l'opération. (erreur com.Apple.AuthenticationServices.AuthorizationError 1000.)

6
yiruchuxia

Dans mon cas, le lancement de ASAuthorizationController incluant une demande de ASAuthorizationPasswordProvider était à l'origine de l'erreur.

Impossible de terminer l'opération. (erreur com.Apple.AuthenticationServices.AuthorizationError 1000.)


Depuis la documentation ASAuthorizationError.Code ; 1000 Est pour unknown

ASAuthorizationError.Code.unknown

La tentative d'autorisation a échoué pour une raison inconnue.

Déclaration

case unknown = 1000

Réf: https://developer.Apple.com/documentation/authenticationservices/asauthorizationerror/code/unknown

Maintenant, ce n'est pas particulièrement utile, mais cela m'a donné un indice pour vérifier ma configuration de ASAuthorizationController que j'essayais de lancer avec 2 demandes de ASAuthorizationAppleIDProvider & ASAuthorizationPasswordProvider, comme ceci:

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

J'ai essayé cela sur un simulateur qui avait un Apple ID avec 2FA activé et également sur un appareil avec un autre Apple ID sans 2FA, et les deux fois, cela allez dans authorizationController(controller:didCompleteWithError error:) et c'est tout.


Solution:

Donc, pour rester simple, j'ai lancé ASAuthorizationController avec seulement ASAuthorizationAppleIDProvider comme ceci:

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

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

    controller.performRequests()
}

Et voilà! Cette fois, les choses ont fonctionné comme prévu:

  1. Lorsque vous utilisez un Apple ID avec 2FA
    • surgi avec la demande de connexion
  2. Lorsque vous utilisez un Apple ID sans 2FA
    • une erreur est survenue me disant d'activer 2FA
    • appelé authorizationController(controller:didCompleteWithError error:) avec error 1000

Il semble donc que dans mon cas, ASAuthorizationPasswordProvider était le coupable mais puisque ASAuthorizationError.Code.unknown Est un cas d'erreur générique, cette solution peut ne pas fonctionner pour vous.

De plus, dans mon cas, je n'ai besoin que de ASAuthorizationAppleIDProvider pour Apple Identifiant se connecte donc abandonné le support de ASAuthorizationPasswordProvider.

2
staticVoidMan

Ajoutez simplement + "Connectez-vous avec Apple" dans Capability.

1
Parth Patoliya

Je l'ai résolu en ajoutant sign in with Apple as entrez la liste des droits.

enter image description here

1
Vasucd

D'après l'exemple d'Apple,

performExistingAccountSetupFlows, n'appelez cette méthode qu'une seule fois sur viewDidAppear. Si les informations utilisateur existent déjà, alors Apple les affichera pour se connecter. Sinon, cela générera une erreur.

handleAuthorizationAppleIDButtonPress, chaque fois que l'utilisateur appuie sur Sign in with Apple, notez que si un compte avait déjà existé, il l'aurait déjà montré à l'utilisateur. Je pense que son processus est toujours en cours et que tous les cas d'utilisation ne sont pas couverts, par exemple si l'utilisateur voit les informations de connexion initialement à partir de l'appel de ViewDidAppear et les annule, alors l'utilisateur doit créer un nouveau compte lors de l'utilisation de cette méthode car il manque ASAuthorizationPasswordProvider demande. Si l'utilisateur avait des informations de connexion, dans ce cas, cet appel (avec ASAuthorizationPasswordProvider) réussira, mais si aucune donnée n'est disponible, l'utilisateur ne verra aucune action en appuyant sur ce bouton car il générera une erreur.

Je suis toujours en train de comprendre cela, si j'ai quelque chose à ajouter, je mettrai à jour la réponse. Donc, pour l'instant, nous ne pouvons avoir que ce cas d'utilisation pour utiliser ce Sign in with Apple option.

pdate: Une fois que j'ai créé un nouveau compte, ce même flux m'a proposé de me connecter avec le compte déjà existant. Donc, je peux dire qu'il n'est pas nécessaire d'inclure l'appel à la requête ASAuthorizationPasswordProvider dans la méthode handleAuthorizationAppleIDButtonPress. Je fais tous les tests sur l'appareil.

Vous pouvez toujours aller à Settings -> AppleId -> Password & Security -> Apple ID Logins pour vérifier et supprimer le compte si vous devez tester différents scénarios.

pdate 2: Tout semble bien fonctionner dans d'autres scénarios aussi si vous avez déjà un mot de passe enregistré ou un compte d'identification d'application créé, donc même si je passe ASAuthorizationPasswordProvider dans l'appel handleAuthorizationAppleIDButtonPress, c'est fonctionne bien. Je suggérerais de ne pas passer ASAuthorizationPasswordProvider lors du prochain appel et de conserver le flux comme décrit ci-dessus, de cette façon si aucun mot de passe enregistré n'est présent ou Apple Id créé alors il fournira une option à l'utilisateur de créer un nouvel identifiant, s'il existe déjà un identifiant qui existe, il affichera cet identifiant.

 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()
    }
0
Kamran Khan