why do it 如果你的App中包含或涉及到第三方登錄(例如:QQ登陸、微信登陸等),就必須接入蘋果登陸,如果不適配蘋果推出的Sign In With Apple審核將會被拒絕。 what is Sign In With Apple 其實和平時的一些第三方登陸一樣,通過授權,可以拿到用戶名,郵箱 ...
why do it
如果你的App中包含或涉及到第三方登錄(例如:QQ登陸、微信登陸等),就必須接入蘋果登陸,如果不適配蘋果推出的Sign In With Apple審核將會被拒絕。
what is Sign In With Apple
其實和平時的一些第三方登陸一樣,通過授權,可以拿到用戶名,郵箱地址,用戶ID等信息,接入 Sign In With Apple 後, 應用程式或網站中顯示“ 通過Apple登錄”按鈕,意味著可以使用他們已有的Apple ID進行點擊或登錄,而無需填寫表格,驗證電子郵件地址和選擇密碼等操作;提供了一種新的,更私密的方式登陸。
接入 Sign In With Apple
一、首先手機必須是iOS 13(包含iOS 13)以上的iOS系統
二、項目 Bundle ID(Bundle identifier)勾選 Sign In With Apple 功能,然後保存
三、Xcode 配置 Singing & Capabilities
四、添加 AuthenticationServices.framework 庫
五、代碼集成
引入頭文件 #import <AuthenticationServices/AuthenticationServices.h>
添加代理 <ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding>
添加“ 通過Apple登錄”按鈕 ,必須用系統的按鈕樣式,在iOS 13中提供了此按鈕樣式的創建方法,
if (@available(iOS 13.0, *)) { ASAuthorizationAppleIDButton *abtn = [ASAuthorizationAppleIDButton buttonWithType:ASAuthorizationAppleIDButtonTypeSignIn style:ASAuthorizationAppleIDButtonStyleBlack]; [abtn addTarget:self action:@selector(signInWithApple) forControlEvents:UIControlEventTouchUpInside]; // 圓角設置 // abtn.cornerRadius = 0; abtn.frame = CGRectMake((ScreenWidth - 200)/2, (ScreenHeight - 100)/2, 200, 40); [self.view addSubview:abtn]; }
ASAuthorizationAppleIDButtonType
typedef NS_ENUM(NSInteger, ASAuthorizationAppleIDButtonType) { ASAuthorizationAppleIDButtonTypeSignIn, /// 通過Apple登錄 ASAuthorizationAppleIDButtonTypeContinue, /// 通過Apple繼續 ASAuthorizationAppleIDButtonTypeSignUp , /// 通過Apple註冊 ASAuthorizationAppleIDButtonTypeDefault = ASAuthorizationAppleIDButtonTypeSignIn, /// 通過Apple登錄 }
ASAuthorizationAppleIDButtonStyle
typedef NS_ENUM(NSInteger, ASAuthorizationAppleIDButtonStyle) { ASAuthorizationAppleIDButtonStyleWhite, ///白色背景黑色字體樣式,無邊框 ASAuthorizationAppleIDButtonStyleWhiteOutline, ///白色背景黑色字體樣式,有黑邊框 ASAuthorizationAppleIDButtonStyleBlack, ///黑色背景白色字體樣式,無邊框 }
ASAuthorizationAppleIDButtonStyleWhite(深色背景下使用)
ASAuthorizationAppleIDButtonStyleWhiteOutline(淺色背景下使用)
ASAuthorizationAppleIDButtonStyleBlack(淺色背景下使用)
點擊“ 通過Apple登錄”按鈕執行方法
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; }
運行效果