苹果登录集成 Sign in with Apple
- Xcode 里面 Signing & Capabilities 开启 Sign in with Apple 功能
https://blog.csdn.net/n603482184/article/details/101444924
https://www.jianshu.com/p/15cf5c39e9d4
1 2 3 4
| #import <AuthenticationServices/AuthenticationServices.h>
@interface AppController ()<ASAuthorizationControllerDelegate,ASAuthorizationControllerPresentationContextProviding> @end
|
1 2 3 4 5
| if (@available(iOS 13.0, *)) { [self click]; } else {
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| -(void)click API_AVAILABLE(ios(13.0)){ // ASAuthorizationAppleIDProvider *appleIDProvider = [ASAuthorizationAppleIDProvider new]; // ASAuthorizationAppleIDRequest *authAppleIDRequest = [appleIDProvider createRequest]; // ASAuthorizationPasswordRequest *passwordRequest = [[ASAuthorizationPasswordProvider new] createRequest]; // // NSMutableArray <ASAuthorizationRequest *>* array = [NSMutableArray arrayWithCapacity:2]; // if (authAppleIDRequest) { // [array addObject:authAppleIDRequest]; // } // if (passwordRequest) { // [array addObject:passwordRequest]; // } // NSArray <ASAuthorizationRequest *>* requests = [array copy]; // // ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:requests]; // authorizationController.delegate = self; // authorizationController.presentationContextProvider = self; // [authorizationController performRequests];
ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc]init]; KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Login" accessGroup:nil];// 通过同样的标志创建keychain NSString *userIdentifier = [keychain objectForKey:(__bridge id)(kSecAttrAccount)]; [appleIDProvider getCredentialStateForUserID:userIdentifier completion:^(ASAuthorizationAppleIDProviderCredentialState credentialState, NSError * _Nullable error) { switch (credentialState) { case ASAuthorizationAppleIDProviderCredentialAuthorized: // The Apple ID credential is valid //[[MyAlertCenter defaultCenter:window] postAlertWithMessage:@"登陆成功"]; break; case ASAuthorizationAppleIDProviderCredentialRevoked: // Apple ID Credential revoked, handle unlink case ASAuthorizationAppleIDProviderCredentialNotFound: // Credential not found, show login UI ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest]; request.requestedScopes = @[ASAuthorizationScopeFullName,ASAuthorizationScopeEmail]; ASAuthorizationController *auth = [[ASAuthorizationController alloc]initWithAuthorizationRequests:@[request]]; auth.delegate = self; auth.presentationContextProvider = self; [auth performRequests]; break; } }];
}
-(ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller API_AVAILABLE(ios(13.0)){ return window; }
-(void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)){
if([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]){ ASAuthorizationAppleIDCredential *apple = authorization.credential; ///将返回得到的user 存储起来 KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Login" accessGroup:nil];// 1 NSString *userIdentifier = apple.user; [keychain setObject:userIdentifier forKey:(__bridge id)(kSecAttrAccount)]; NSPersonNameComponents *fullName = apple.fullName; [keychain setObject:fullName forKey:(__bridge id)(kSecValueData)]; NSString *email = apple.email; //用于后台像苹果服务器验证身份信息 NSData *identityToken = apple.identityToken; NSLog(@"%@%@%@%@",userIdentifier,fullName,email,identityToken); } else if( [authorization.credential isKindOfClass:[ASPasswordCredential class]]){ /// Signinusing an existing iCloud Keychain credential. ASPasswordCredential *pass = authorization.credential; NSString *username = pass.user; NSString *passw = pass.password; int a = 0; } }
///回调失败 -(void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)){ NSLog(@"%@",error); }
|