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.)
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.
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:
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
.
Ajoutez simplement + "Connectez-vous avec Apple" dans Capability.
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()
}