應(yīng)用集成第三方登錄悬赏,iOS 13之后必須集成蘋果登錄,否則審核會(huì)被拒的娄徊。較為常用的第三方登錄是微信和QQ舷嗡,微信不提供網(wǎng)頁登錄授權(quán),所以用戶手機(jī)沒有安裝微信最好是不展示微信登錄入口嵌莉,QQ是提供網(wǎng)頁授權(quán)登錄的进萄,所以提供的第三方登錄入口QQ可以不加判斷直接展示。蘋果登錄只在iOS 13以后才可以使用,所以系統(tǒng)版本小于13的也不能展示蘋果入口中鼠。
微信和QQ不多說可婶,直接在開發(fā)平臺(tái)注冊(cè)應(yīng)用,拿到APPID和APP secret去調(diào)用微信和QQ的SDK援雇,處理對(duì)應(yīng)的回調(diào)矛渴,在Xcode設(shè)置URL Schemes和白名單。
蘋果登錄開發(fā)流程:
一惫搏、登錄按鈕
蘋果提供了一個(gè)ASAuthorizationAppleIDButton類具温,使用它來創(chuàng)建蘋果登錄按鈕,這個(gè)類就像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
}
以上方法繪制出的按鈕是個(gè)白蘋果黑背景的圓形logo铣猩。
蘋果提供的這個(gè)登錄按鈕有三個(gè)外觀:白色,帶有黑色輪廓線的白色和黑色茴丰。根據(jù)自己的需求來定达皿。
二、授權(quán)請(qǐng)求
點(diǎn)擊按鈕發(fā)起蘋果登錄請(qǐng)求:
- (void)appleLogin {
if (@available(iOS 13.0, *)) {
ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
ASAuthorizationAppleIDRequest *appleIDRequest = [appleIDProvider createRequest];
// 用戶授權(quán)請(qǐng)求的聯(lián)系信息
appleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[appleIDRequest]];
// 設(shè)置授權(quán)控制器通知授權(quán)請(qǐng)求的成功與失敗的代理
authorizationController.delegate = self;
// 設(shè)置提供 展示上下文的代理贿肩,在這個(gè)上下文中 系統(tǒng)可以展示授權(quán)界面給用戶
authorizationController.presentationContextProvider = self;
// 在控制器初始化期間啟動(dòng)授權(quán)流
[authorizationController performRequests];
} else {
NSLog(@"該系統(tǒng)版本不可用Apple登錄");
}
}
用戶發(fā)起授權(quán)請(qǐng)求后峦椰,系統(tǒng)就會(huì)彈出用戶登錄驗(yàn)證的頁面。用戶可以選擇共享電子郵箱或者隱藏郵件地址汰规。
三汤功、授權(quán)回調(diào)處理
接下來處理授權(quán)成功和失敗的回調(diào):
授權(quán)成功走的代理方法
- (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;
// 使用過授權(quán)的,可能獲取不到以下三個(gè)參數(shù)
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;
// 密碼憑證對(duì)象的用戶標(biāo)識(shí) 用戶的唯一標(biāo)識(shí)
NSString *user = passwordCredential.user;
// 密碼憑證對(duì)象的密碼
NSString *password = passwordCredential.password;
} else {
NSLog(@"授權(quán)信息均不符");
}
}
授權(quán)成功我們可以拿到用戶的 user溜哮、email冤竹、fullName、authorizationCode茬射、identityToken 以及 realUserStatus 等信息。user是蘋果用戶唯一標(biāo)識(shí)符冒签,該值在同一個(gè)開發(fā)者賬號(hào)下的所有 App 下是一樣的在抛。在用戶共享郵箱情況下可以拿到email。拿到這些值就可以請(qǐng)求自己的服務(wù)器進(jìn)行登錄萧恕。
登錄失敗的代理方法如下:
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)) {
NSString *errorMsg = nil;
switch (error.code) {
case ASAuthorizationErrorCanceled:
errorMsg = @"用戶取消了授權(quán)請(qǐng)求";
break;
case ASAuthorizationErrorFailed:
errorMsg = @"授權(quán)請(qǐng)求失敗";
break;
case ASAuthorizationErrorInvalidResponse:
errorMsg = @"授權(quán)請(qǐng)求響應(yīng)無效";
break;
case ASAuthorizationErrorNotHandled:
errorMsg = @"未能處理授權(quán)請(qǐng)求";
break;
case ASAuthorizationErrorUnknown:
errorMsg = @"授權(quán)請(qǐng)求失敗未知原因";
break;
default:
break;
}
NSLog(@"%@", errorMsg);
}