Sign In with Apple是iOS 13的新增功能,跨平台的,支持iOS、macOS、watchOS、tvOS、JS。需要用: MacOS 10.14.4及以上的系统的和Xcode 11及以上开发,所有已接入其它第三方登录的 App,必须支持Apple登录,否则审核将会被拒绝。(可能有人要问了iOS13之前怎么办?放个Apple图标,点击时给个提示即可)

准备工作
-
登录开发者账号,Bundle ID 勾选 Sign In With Apple ,开启登录功能(勾选或取消服务,会导致之前的 profile 描述文件失效,不需要新建,只要点击 Edit 重新编辑对应的 profile文件,然后保存下载使用新的profile文件即可)
开通登录功能 -
在Xcode Signing & Capabilities中添加Sign In With Apple
Xcode配置该功能
代码集成
- 导入头文件
// OC
#import <AuthenticationServices/AuthenticationServices.h>
// Swift
import AuthenticationServices
- 添加代理
ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding
-
设置UI按钮(可以用系统提供的,也可以用自定义样式),只讲系统按钮的样式,自行百度
White,白色样式
WhiteOutline,带边框样式
Black,黑色样式 点击按钮的响应方法
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDProvider *provider = [[ASAuthorizationAppleIDProvider alloc] init];
ASAuthorizationAppleIDRequest *request = [provider createRequest];
request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
ASAuthorizationController *vc = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
vc.delegate = self;
vc.presentationContextProvider = self;
[vc performRequests];
}
- 代理回调方法
#pragma mark - ASAuthorizationControllerDelegate
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)) {
NSString *errorMsg = nil;
switch (error.code) {
case ASAuthorizationErrorCanceled:
errorMsg = @"用户取消了授权请求";
break;
case ASAuthorizationErrorFailed:
errorMsg = @"授权请求失败";
break;
case ASAuthorizationErrorInvalidResponse:
errorMsg = @"授权请求响应无效";
break;
case ASAuthorizationErrorNotHandled:
errorMsg = @"未能处理授权请求";
break;
case ASAuthorizationErrorUnknown:
errorMsg = @"授权请求失败未知原因";
break;
}
NSLog(@"%@", errorMsg);
}
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
ASAuthorizationAppleIDCredential *credential = (ASAuthorizationAppleIDCredential *)authorization.credential;
NSString *state = credential.state;
NSString *userID = credential.user;
NSPersonNameComponents *fullName = credential.fullName;
NSString *email = credential.email;
// 服务器验证需要使用的参数
NSString *authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding];
NSString *identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];
ASUserDetectionStatus realUserStatus = credential.realUserStatus;
NSArray *authorizedScopes = credential.authorizedScopes;
NSLog(@"state: %@", state);
NSLog(@"userID: %@", userID);
NSLog(@"fullName: %@", fullName);
NSLog(@"email: %@", email);
NSLog(@"authorizationCode: %@", authorizationCode);
NSLog(@"identityToken: %@", identityToken);
NSLog(@"realUserStatus: %@", @(realUserStatus));
NSLog(@"authorizedScopes: %@", authorizedScopes);
}
}
#pragma mark - ASAuthorizationControllerPresentationContextProviding
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller API_AVAILABLE(ios(13.0)) {
return [UIApplication sharedApplication].keyWindow;
}
- (NSString *)documentPath{
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
return documentPath;
}
苹果登录返回信息
识别用户
identityToken:JSON Web令牌(JWT),可将有关用户的信息安全地传递到您的应用程序。
authorizationCode:与应用程序的服务器副本交互时,应用程序使用的短暂令牌来作为授权证明。
state:您的应用程序提供给生成凭据的请求的任意字符串。
user:与已认证用户关联的标识符。(苹果用户唯一标识符)
获取用户信息
authorizedScopes:用户授权您的应用访问的联系信息。
fullName:名称对象
email:用户邮箱地址(真实或者隐藏)
检测用户特征
realUserStatus:指示用户是否看起来是真实人物的值。
ASUserDetectionStatus:实际用户指标的可能值
一、共享我的邮箱
state: (null)
userID: 001324.bd4cdc4453964f23859a106528dc7b00.0257
fullName: <NSPersonNameComponents: 0x60000046dc10> {givenName = 名, familyName = 姓, middleName = (null), namePrefix = (null), nameSuffix = (null), nickname = (null) phoneticRepresentation = (null) }
email: 000000@qq.com
authorizationCode: c7539fdca92bb4b78b4b8e54a128b34d9.0.nrtsu.fOYwoxw-PWeSfXyWnXseCg
identityToken: eyJraWQiOiJBSURPUEsxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLmd1bGkuemVuYm9ybiIsImV4cCI6MTU3MzAwOTg5OCwiaWF0IjoxNTczMDA5Mjk4LCJzdWIiOiIwMDEzMjQuYmQ0Y2RjNDQ1Mzk2NGYyMzg1OWExMDY1MjhkYzdiMDAuMDI1NyIsImNfaGFzaCI6ImF5aWhyR0RaNndRZkdra3NFM3hhOGciLCJlbWFpbCI6IjE1OTU1NDYyMTRAcXEuY29tIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiYXV0aF90aW1lIjoxNTczMDA5Mjk4fQ.DS41gpURwyowq9bXCmYni_p6KQq7NmBn_uLKA_Kymz8AS3V4rxcgKk8NoVuqPIIbW-GkUQjhzF1tWICNhqTnAoJgSIuDxDYO0xubPg4jwgr1ZgqtDUix-l6evBfuR-7DSbL2E3Rl7T1VFxX-MWL_nJDcfuh3wlOUbTE_RfbgPMwv4V4HPTskFa9kWS9-NMUvs9PUGiAkMSUx6AnqCZ65nbLqq13h0pMSaX8NFgUvZrLyonbgDU8cMkVwz_X3CMQGF1UHSkRiMlCeoYU0Z-2w6RGAhMPHCGZZWx48aefO8obn_NugfXbtWFsKBKTaJ09M0CBQP6679_NRb2n-0mXEXw
realUserStatus: 1
二、隐藏我的邮箱
state: (null)
userID: 001324.bd4cdc4453964f23859a106528dc7b00.0257
fullName: <NSPersonNameComponents: 0x600000465cd0> {givenName = Lau, familyName = Winson, middleName = (null), namePrefix = (null), nameSuffix = (null), nickname = (null) phoneticRepresentation = (null) }
email: 6ydppeishc@privaterelay.appleid.com
authorizationCode: cb7a915f207d9462886eea8711c87cb96.0.nrtsu.JHIFsv-gkeb3MkEdRQwmNA
identityToken: eyJraWQiOiJBSURPUEsxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLmd1bGkuemVuYm9ybiIsImV4cCI6MTU3MzAxMDMxOCwiaWF0IjoxNTczMDA5NzE4LCJzdWIiOiIwMDEzMjQuYmQ0Y2RjNDQ1Mzk2NGYyMzg1OWExMDY1MjhkYzdiMDAuMDI1NyIsImNfaGFzaCI6IjdQYkF5N3VVMk5XS2VoNFVzV3lfQkEiLCJlbWFpbCI6IjZ5ZHBwZWlzaGNAcHJpdmF0ZXJlbGF5LmFwcGxlaWQuY29tIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiaXNfcHJpdmF0ZV9lbWFpbCI6InRydWUiLCJhdXRoX3RpbWUiOjE1NzMwMDk3MTh9.J67iq7rjgqJZBxkryzGcZnIK2-Zsyab85QrhlhPDjfY2N9cZN0zlNWkiNlZB6oDbGYOU9Gjh20phh3SSBrHNfixNpRD-kypSqPPu9E84qdnUjX6EypKX27vx0a2fM11jByEV05A_KU7fKaKz0F5TZZ40wk6MibaKHuj4e5r2mQOA7Bgkr_uiygeigqWYACE0wo1Did2rOY40M6mWYOYvg0ALWifzXe1c0V_rKHQFpfLpgX1lty4GnsWtyglLESCNeIoWhRnhxK_5BESGKrSUbzIROTx3kd9dGT1OWcAu2HyyU-xsELPS1iPqdZix18CzY-4QwkB7Uhyo6jbBP9mlpA
realUserStatus: 1
参考资料
如何通过 ASWebAuthenticationSession 获取身份验证 code 码




