iOS - SignInWithApple(蘋果賬號登錄)

在 WWDC 2019 上拉背,蘋果推出了自家的 Sign in with Apple 功能员舵。iOS13之后工扎,App上如果有如”微信授權(quán)登錄”的第三方登錄泪酱,就必須提供“蘋果登錄”選項。(強制性的呦??) 蘋果官網(wǎng)有介紹 自行翻譯

一茴肥、初識SignInWithApple登錄授權(quán)原理
蘋果登錄授權(quán)原理草圖.png

二坚踩、蘋果開發(fā)者后臺配置

1、配置Identifiers

找到項目對應(yīng)的id瓤狐,點擊進入編輯頁面瞬铸,選中此項
Identifiers.png
image.png

2、配置項目

Xcode->TARGETS->Signing&Capabilities中添加Sign In With Apple選項
TARGETS配置.png

三础锐、編輯蘋果按鈕代碼

3.0嗓节、代碼引入 #import "AppDelegate.h"

#import "AppDelegate.h"
#pragma mark - 蘋果賬號登錄
#import <AuthenticationServices/AuthenticationServices.h>

@interface AppDelegate ()

@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
#pragma mark- 蘋果賬號登錄配置
    [self observeAuthticationState];
    
    return YES;
}

#pragma mark - Private functions 用戶注銷 AppleId 或 停止使用 Apple ID 的狀態(tài)處理
// 觀察授權(quán)狀態(tài)
- (void)observeAuthticationState {
    
    if (@available(iOS 13.0, *)) {
        
        // 注意 存儲用戶標(biāo)識信息需要使用鑰匙串來存儲 這里使用NSUserDefaults 做的簡單示例
        NSString *userIdentifier = [[NSUserDefaults standardUserDefaults] valueForKey:@"appleID"];
        
        if (userIdentifier) {
            
            ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
            
            [appleIDProvider getCredentialStateForUserID:userIdentifier
                                              completion:^(ASAuthorizationAppleIDProviderCredentialState credentialState, NSError * _Nullable error) {
                switch (credentialState) {
                    case ASAuthorizationAppleIDProviderCredentialAuthorized:
                        // 授權(quán)狀態(tài)有效
                        break;
                    case ASAuthorizationAppleIDProviderCredentialRevoked:
                        // 蘋果賬號登錄的憑據(jù)已被移除,需解除綁定并重新引導(dǎo)用戶使用蘋果登錄
                        break;
                    case ASAuthorizationAppleIDProviderCredentialNotFound:
                        // 未登錄授權(quán)郁稍,直接彈出登錄頁面赦政,引導(dǎo)用戶登錄
                        break;
                    case ASAuthorizationAppleIDProviderCredentialTransferred:
                        // 授權(quán)AppleID提供者憑據(jù)轉(zhuǎn)移
                        break;
                }
            }];
        }
        
    }
    
}

3.1、創(chuàng)建登錄按鈕(可以自己自定義按鈕耀怜,也可以使用蘋果原生按鈕)
示例以蘋果官方按鈕演示(app登錄頁面創(chuàng)建)

//登錄也引入頭文件
#import <AuthenticationServices/AuthenticationServices.h>
//添加代理
@interface ViewController ()<ASAuthorizationControllerDelegate,ASAuthorizationControllerPresentationContextProviding>

@end

然后在viewDidLoad創(chuàng)建按鈕

#pragma mark -  iOS13 才支持 系統(tǒng)提供的 登錄按鈕 要做下判斷
        if (@available(iOS 13.0, *)){
//             Sign In With Apple 按鈕
            ASAuthorizationAppleIDButton *appleIDBtn3 = [ASAuthorizationAppleIDButton buttonWithType:ASAuthorizationAppleIDButtonTypeDefault style:ASAuthorizationAppleIDButtonStyleWhiteOutline];
            appleIDBtn3.frame = CGRectMake(30, 560, self.view.bounds.size.width - 60, 40);
            
            [appleIDBtn3 addTarget:self action:@selector(didAppleIDBtnClicked) forControlEvents:UIControlEventTouchUpInside];
            [self.view addSubview:appleIDBtn3];
            
        }

運行結(jié)果顯示
蘋果登錄按鈕.png

按鈕的顏色可以自行設(shè)置恢着,黑的白的都有
3.2、點擊事件觸發(fā)的代理

#pragma mark - 蘋果登錄  發(fā)起授權(quán)登錄請求   Begin    ================== http://www.reibang.com/p/483b998f2370
-(void)didAppleIDBtnClicked{
    
    if (@available(iOS 13.0, *)) {
//        Authorization 發(fā)起授權(quán)登錄請求
/*
 ASAuthorizationAppleIDProvider 這個類比較簡單财破,頭文件中可以看出掰派,主要用于創(chuàng)建一個 ASAuthorizationAppleIDRequest 以及獲取對應(yīng) userID 的用戶授權(quán)狀態(tài)。
 */
        ASAuthorizationAppleIDProvider * appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        ASAuthorizationAppleIDRequest * authAppleIDRequest = [appleIDProvider createRequest];
//        ASAuthorizationPasswordRequest * passwordRequest = [[[ASAuthorizationPasswordProvider alloc] init] createRequest];

        NSMutableArray <ASAuthorizationRequest *> * array = [NSMutableArray arrayWithCapacity:2];
        if (authAppleIDRequest) {
            [array addObject:authAppleIDRequest];
        }
        NSArray <ASAuthorizationRequest *> * requests = [array copy];
        
        ASAuthorizationController * authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:requests];
        authorizationController.delegate = self;
        authorizationController.presentationContextProvider = self;
        [authorizationController performRequests];
        
    } else {
        // 處理不支持系統(tǒng)版本
        NSLog(@"系統(tǒng)不支持Apple登錄");
    }
    
}
#pragma mark- ASAuthorizationControllerDelegate
// 授權(quán)成功
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
    
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        
        ASAuthorizationAppleIDCredential * credential = authorization.credential;
        
//         蘋果用戶唯一標(biāo)識符左痢,該值在同一個開發(fā)者賬號下的所有 App 下是一樣的靡羡,開發(fā)者可以用該唯一標(biāo)識符與自己后臺系統(tǒng)的賬號體系綁定起來系洛。
        NSString * userID = credential.user;
//         蘋果用戶信息 如果授權(quán)過,可能無法再次獲取該信息
        NSPersonNameComponents * fullName = credential.fullName;
        NSString * email = credential.email;
        
//         服務(wù)器驗證需要使用的參數(shù)
        NSString * authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding];
        NSString * identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];
        
//         用于判斷當(dāng)前登錄的蘋果賬號是否是一個真實用戶略步,取值有:unsupported描扯、unknown、likelyReal
        ASUserDetectionStatus realUserStatus = credential.realUserStatus;
        
        [[NSUserDefaults standardUserDefaults] setObject:userID forKey:@"appleID"];
        
        NSLog(@"userID: %@", userID);
        NSLog(@"fullName: %@", fullName);
        NSLog(@"email: %@", email);
        NSLog(@"authorizationCode: %@", authorizationCode);
        NSLog(@"identityToken: %@", identityToken);
        NSLog(@"realUserStatus: %@", @(realUserStatus));
        
        NSString * loging = [NSString stringWithFormat:@"參數(shù)1:%@參數(shù)2:%@參數(shù)3:%@",userID,email,identityToken];
        NSLog(@"Sign in with Apple++++++++++%@",loging);
        
        
        
    }
    else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
        
        // 用戶登錄使用現(xiàn)有的密碼憑證
        ASPasswordCredential * passwordCredential = authorization.credential;
        // 密碼憑證對象的用戶標(biāo)識 用戶的唯一標(biāo)識
        NSString * user = passwordCredential.user;
        // 密碼憑證對象的密碼
        NSString * password = passwordCredential.password;
        
        NSLog(@"userID: %@", user);
        NSLog(@"password: %@", password);
        
    } else {
        
    }
}

// 授權(quán)失敗
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)) {
    
    NSString *errorMsg = nil;
    
    switch (error.code) {
        case ASAuthorizationErrorCanceled:
            errorMsg = @"用戶取消了授權(quán)請求";
            break;
        case ASAuthorizationErrorFailed:
            errorMsg = @"授權(quán)請求失敗";
            break;
        case ASAuthorizationErrorInvalidResponse:
            errorMsg = @"授權(quán)請求響應(yīng)無效";
            break;
        case ASAuthorizationErrorNotHandled:
            errorMsg = @"未能處理授權(quán)請求";
            break;
        case ASAuthorizationErrorUnknown:
            errorMsg = @"授權(quán)請求失敗未知原因";
            break;
    }
    NSLog(@"%@", errorMsg);
}

#pragma mark- ASAuthorizationControllerPresentationContextProviding
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller  API_AVAILABLE(ios(13.0)){
    
    return self.view.window;
}

#pragma mark- apple授權(quán)狀態(tài) 更改通知
- (void)handleSignInWithAppleStateChanged:(NSNotification *)notification
{
    NSLog(@"%@", notification.userInfo);
}
#pragma mark - 蘋果授權(quán)    End    ========================

四趟薄、返回結(jié)果(上面已經(jīng)向Apple id發(fā)起了請求绽诚,該返回給我們參數(shù)了,對吧杭煎!哈哈??)

2021-07-10 11:46:57.941899+0800 SignInWithAppleZA[5704:1240072] Sign in with Apple++++++++++userID參數(shù)為:001921.36778e4680b8499bb1f87637ca300daa.0111email參數(shù)為:(null)identityToken參數(shù)為:eyJraWQiOiJZdXlYb1kiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiWm9uZ0FuZy5TaWduSW5XaXRoQXBwbGVaQSIsImV4cCI6MTYyNTk3NTIxNywiaWF0IjoxNjI1ODg4ODE3LCJzdWIiOiIwMDE5MjEuMzY3NzhlNDY4MGI4NDk5YmIxZjg3NjM3Y2EzMDBkYWEuMDExMSIsImNfaGFzaCI6IlByNllJbDRVbDd3OUJXVjdIVFlZV1EiLCJhdXRoX3RpbWUiOjE2MjU4ODg4MTcsIm5vbmNlX3N1cHBvcnRlZCI6dHJ1ZX0.eqjsrrybCHwxunceE7keAI0xju1Z0wxph3fJrBrPLNfxda1QR1jYTTto_0t4K2UZ1FzWVVhaHsP3z3hdUjZDugGxEfkyb1E2sZsqPYh2a7IfkBEq4hKhWDxqpQ_uPr133fBbuPnRbllRcUoE2I6p7n7HPu3u425RY97KIomyTI-94GzoQ04y6fx6cS9WEJQtjOnF2Y7tfMDiPIaXzrK5f5lcVAvhxEkwcCPoLM8qsne8zJENcM_a_2VcsyFG3262hz9uIFBupL_IYZcXjsfZXtlXYVCqH2NLVpN4JAzewmD5Pg9KRRAkFEjB_zWhvdymffe1Xpc8GCAN2Q8FpbambA

4.0恩够、控制臺打印結(jié)果
控制臺打印結(jié)果.png

總結(jié):基本上就是這樣的流程操作

有文化的程序員.png

五、本篇代碼地址已上傳git

帥氣十足的小伙子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羡铲,一起剝皮案震驚了整個濱河市蜂桶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌也切,老刑警劉巖扑媚,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贾费,居然都是意外死亡钦购,警方通過查閱死者的電腦和手機檐盟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門褂萧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葵萎,你說我怎么就攤上這事导犹。” “怎么了羡忘?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵谎痢,是天一觀的道長。 經(jīng)常有香客問我卷雕,道長节猿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任漫雕,我火速辦了婚禮滨嘱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浸间。我一直安慰自己太雨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布魁蒜。 她就那樣靜靜地躺著囊扳,像睡著了一般吩翻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锥咸,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天狭瞎,我揣著相機與錄音,去河邊找鬼搏予。 笑死脚作,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缔刹。 我是一名探鬼主播球涛,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼校镐!你這毒婦竟也來了亿扁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鸟廓,失蹤者是張志新(化名)和其女友劉穎从祝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體引谜,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡牍陌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了员咽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毒涧。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贝室,靈堂內(nèi)的尸體忽然破棺而出契讲,到底是詐尸還是另有隱情,我是刑警寧澤滑频,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布捡偏,位于F島的核電站,受9級特大地震影響峡迷,放射性物質(zhì)發(fā)生泄漏银伟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一绘搞、第九天 我趴在偏房一處隱蔽的房頂上張望彤避。 院中可真熱鬧,春花似錦看杭、人聲如沸忠藤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽模孩。三九已至尖阔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榨咐,已是汗流浹背介却。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留块茁,地道東北人齿坷。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓祈匙,卻偏偏與公主長得像芦昔,于是被迫代替她去往敵國和親坦康。 傳聞我的和親對象是個殘疾皇子绳姨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容