苹果登录集成 Sign in with Apple


苹果登录集成 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);
}