應用集成第三方登錄,iOS 13之后必須集成蘋果登錄,否則審核會被拒的。較為常用的第三方登錄是微信和QQ,微信不提供網頁登錄授權,所以用戶手機沒有安裝微信最好是不展示微信登錄入口,QQ是提供網頁授權登錄的,所以提供的第三方登錄入口QQ可以不加判斷直接展示。蘋果登錄只在iOS 13以后才可以使用,所以系統(tǒng)版本小于13的也不能展示蘋果入口。
微信和QQ不多說,直接在開發(fā)平臺注冊應用,拿到APPID和APP secret去調用微信和QQ的SDK,處理對應的回調,在Xcode設置URL Schemes和白名單。
蘋果登錄開發(fā)流程:
一、登錄按鈕
蘋果提供了一個ASAuthorizationAppleIDButton類,使用它來創(chuàng)建蘋果登錄按鈕,這個類就像UIButton一樣使用。
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDButton *appleLoginBtn = [[ASAuthorizationAppleIDButton alloc] initWithAuthorizationButtonType:ASAuthorizationAppleIDButtonTypeSignIn authorizationButtonStyle:ASAuthorizationAppleIDButtonStyleBlack];
appleLoginBtn.frame = CGRectMake(0, 0, 50, 50);
appleLoginBtn.layer.cornerRadius = 5;
appleLoginBtn.layer.masksToBounds = YES;
[appleLoginBtn addTarget:self action:@selector(appleLogin) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:appleLoginBtn];
} else {
// Fallback on earlier versions
}
以上方法繪制出的按鈕是個白蘋果黑背景的圓形logo。
蘋果提供的這個登錄按鈕有三個外觀:白色,帶有黑色輪廓線的白色和黑色。根據自己的需求來定。
二、授權請求
點擊按鈕發(fā)起蘋果登錄請求:
- (void)appleLogin {
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
ASAuthorizationAppleIDRequest *appleIDRequest = [appleIDProvider createRequest];
// 用戶授權請求的聯(lián)系信息
appleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[appleIDRequest]];
// 設置授權控制器通知授權請求的成功與失敗的代理
authorizationController.delegate = self;
// 設置提供 展示上下文的代理,在這個上下文中 系統(tǒng)可以展示授權界面給用戶
authorizationController.presentationContextProvider = self;
// 在控制器初始化期間啟動授權流
[authorizationController performRequests];
} else {
NSLog(@"該系統(tǒng)版本不可用Apple登錄");
}
}
用戶發(fā)起授權請求后,系統(tǒng)就會彈出用戶登錄驗證的頁面。用戶可以選擇共享電子郵箱或者隱藏郵件地址。
三、授權回調處理
接下來處理授權成功和失敗的回調:
授權成功走的代理方法
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)){
if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
// 用戶登錄使用ASAuthorizationAppleIDCredential
ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
NSString *user = appleIDCredential.user;
// 使用過授權的,可能獲取不到以下三個參數
NSString *familyName = appleIDCredential.fullName.familyName;
NSString *givenName = appleIDCredential.fullName.givenName;
NSString *email = appleIDCredential.email;
} else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
// 用戶登錄使用現(xiàn)有的密碼憑證(iCloud記錄的)
ASPasswordCredential *passwordCredential = authorization.credential;
// 密碼憑證對象的用戶標識 用戶的唯一標識
NSString *user = passwordCredential.user;
// 密碼憑證對象的密碼
NSString *password = passwordCredential.password;
} else {
NSLog(@"授權信息均不符");
}
}
授權成功我們可以拿到用戶的 user、email、fullName、authorizationCode、identityToken 以及 realUserStatus 等信息。user是蘋果用戶唯一標識符,該值在同一個開發(fā)者賬號下的所有 App 下是一樣的。在用戶共享郵箱情況下可以拿到email。拿到這些值就可以請求自己的服務器進行登錄。
登錄失敗的代理方法如下:
- (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;
default:
break;
}
NSLog(@"%@", errorMsg);
}