iOS13 sign in with Apple客戶端接入遇到的一些問題

公司項(xiàng)目需要接入sign in with Apple,花了幾天時(shí)間疮茄,查看各種文檔博客,最終完成接入根暑。
客戶端接入遇到的一些問題
1.首次登錄時(shí)調(diào)用的代碼:

if (@available(iOS 13.0, *)) {
        // 基于用戶的Apple ID授權(quán)用戶力试,生成用戶授權(quán)請(qǐng)求的一種機(jī)制
        ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        // 創(chuàng)建新的AppleID 授權(quán)請(qǐng)求
        ASAuthorizationAppleIDRequest *appleIDRequest = [appleIDProvider createRequest];
        // 在用戶授權(quán)期間請(qǐng)求的聯(lián)系信息
        appleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
        // 由ASAuthorizationAppleIDProvider創(chuàng)建的授權(quán)請(qǐng)求 管理授權(quán)請(qǐng)求的控制器
        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{
        // 處理不支持系統(tǒng)版本
        NSLog(@"該系統(tǒng)版本不可用Apple登錄");
    }

2.已經(jīng)授權(quán)過排嫌,再次登錄的時(shí)候畸裳,如果你已經(jīng)開啟了Touch id或者Face ID,直接使用Touch id或者Face ID登錄淳地,沒有開啟的話怖糊,使用密碼登錄,sign in Apple沒有自動(dòng)登錄接口薇芝,如果自己項(xiàng)目中需要自動(dòng)登錄功能蓬抄,不考慮服務(wù)器驗(yàn)證的情況下,可以使用自己的pid和token登錄夯到,但是這會(huì)有一定的安全性嚷缭,具體代碼如下:

if (@available(iOS 13.0, *)) {
        // 基于用戶的Apple ID授權(quán)用戶,生成用戶授權(quán)請(qǐng)求的一種機(jī)制
        ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        // 授權(quán)請(qǐng)求AppleID
        ASAuthorizationAppleIDRequest *appleIDRequest = [appleIDProvider createRequest];
        // 為了執(zhí)行鑰匙串憑證分享生成請(qǐng)求的一種機(jī)制
        ASAuthorizationPasswordProvider *passwordProvider = [[ASAuthorizationPasswordProvider alloc] init];
        ASAuthorizationPasswordRequest *passwordRequest = [passwordProvider createRequest];
        // 由ASAuthorizationAppleIDProvider創(chuàng)建的授權(quán)請(qǐng)求 管理授權(quán)請(qǐng)求的控制器
        ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[appleIDRequest, passwordRequest]];
        // 設(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{
        // 處理不支持系統(tǒng)版本
        NSLog(@"該系統(tǒng)版本不可用Apple登錄");
    }

3.sign in Apple登錄授權(quán)成功回調(diào)的代碼阅爽,值得注意的是familyName ,givenName 荐开,email 只有第一次登錄的時(shí)候才有值付翁,再次登錄返回都是空值;ASPasswordCredential 回調(diào)我是一直測(cè)試不出來晃听,目前不知道怎樣登錄才能收到ASPasswordCredential 的回調(diào)百侧,具體代碼如下:

- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)){
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
        NSString *user = appleIDCredential.user;
        NSString *state = appleIDCredential.state;
        // 使用過授權(quán)的砰识,可能獲取不到以下三個(gè)參數(shù)
        NSString *familyName = appleIDCredential.fullName.familyName;
        NSString *givenName = appleIDCredential.fullName.givenName;
        NSString *email = appleIDCredential.email;
        ASUserDetectionStatus realUserStatus = appleIDCredential.realUserStatus;
        NSLog(@"familyName=%@", familyName);
        NSLog(@"givenName=%@", givenName);
        NSLog(@"email=%@", email);
        NSLog(@"state=%@", state);
        NSLog(@"user=%@", user);
        if (user) {
            [AppleKeychain save:KEYCHAIN_IDENTIFIER(@"userIdentifier") data:user];
        }
        NSLog(@"realUserStatus=%ld", (long)realUserStatus);
        NSData *identityToken = appleIDCredential.identityToken;
        NSData *authorizationCode = appleIDCredential.authorizationCode;
        
        // 服務(wù)器驗(yàn)證需要使用的參數(shù)
        NSString *identityTokenStr = [[NSString alloc] initWithData:identityToken encoding:NSUTF8StringEncoding];
        NSString *authorizationCodeStr = [[NSString alloc] initWithData:authorizationCode encoding:NSUTF8StringEncoding];
        NSLog(@"%@\n\n%@", identityTokenStr, authorizationCodeStr);
        if (identityTokenStr&&authorizationCodeStr) {
            [self doLoginVerify:identityTokenStr AndCode:authorizationCodeStr];
        }
        
    }else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]){
        // 這個(gè)獲取的是iCloud記錄的賬號(hào)密碼,需要輸入框支持iOS 12 記錄賬號(hào)密碼的新特性
        //這個(gè)回調(diào)我是沒有測(cè)試出來過佣渴,不知道怎么搞
        // Sign in using an existing iCloud Keychain credential.
        // 用戶登錄使用現(xiàn)有的密碼憑證
        NSLog(@"Sign in using an existing iCloud Keychain credential");
        ASPasswordCredential *passwordCredential = authorization.credential;
        // 密碼憑證對(duì)象的用戶標(biāo)識(shí) 用戶的唯一標(biāo)識(shí)
        NSString *user = passwordCredential.user;
        // 密碼憑證對(duì)象的密碼
        NSString *password = passwordCredential.password;
        NSLog(@"user=%@", user);
        NSLog(@"password=%@", password);
    }else{
        NSLog(@"授權(quán)信息均不符");
        
    }
}

4.蘋果登錄觀察授權(quán)狀態(tài)監(jiān)聽辫狼,如果你切換一個(gè)新的Apple id或者停止使用Apple id,那么回調(diào)的結(jié)果是不一樣的辛润,根據(jù)自己項(xiàng)目做處理膨处,正常情況,你只要使用sign in Apple登錄過一次砂竖,那么下次再登錄的時(shí)候真椿,回調(diào)都是授權(quán)狀態(tài)良好,具體代碼如下:

 if (@available(iOS 13.0, *)) {
        // A mechanism for generating requests to authenticate users based on their Apple ID.
        // 基于用戶的Apple ID 生成授權(quán)用戶請(qǐng)求的機(jī)制
        ASAuthorizationAppleIDProvider *appleIDProvider = [ASAuthorizationAppleIDProvider new];
        // 注意 存儲(chǔ)用戶標(biāo)識(shí)信息需要使用鑰匙串來存儲(chǔ) 這里筆者簡(jiǎn)單期間 使用NSUserDefaults 做的簡(jiǎn)單示例
        NSString *userIdentifier = [AppleKeychain load:KEYCHAIN_IDENTIFIER(@"userIdentifier")];
        NMGLog(@"observeAuthticationState----:%@",userIdentifier);
        if (userIdentifier) {
            NSString* __block errorMsg = nil;
            //Returns the credential state for the given user in a completion handler.
            // 在回調(diào)中返回用戶的授權(quán)狀態(tài)
            [appleIDProvider getCredentialStateForUserID:userIdentifier completion:^(ASAuthorizationAppleIDProviderCredentialState credentialState, NSError * _Nullable error) {
                switch (credentialState) {
                        // 蘋果證書的授權(quán)狀態(tài)
                    case ASAuthorizationAppleIDProviderCredentialRevoked:
                        // 蘋果授權(quán)憑證失效
                        errorMsg = @"蘋果授權(quán)憑證失效";
                        [self logout];
                        break;
                    case ASAuthorizationAppleIDProviderCredentialAuthorized:
                        // 蘋果授權(quán)憑證狀態(tài)良好
                        errorMsg = @"蘋果授權(quán)憑證狀態(tài)良好";
                        break;
                    case ASAuthorizationAppleIDProviderCredentialNotFound:
                        // 未發(fā)現(xiàn)蘋果授權(quán)憑證
                        errorMsg = @"未發(fā)現(xiàn)蘋果授權(quán)憑證";
                        [self logout];
                        break;
                        // 可以引導(dǎo)用戶重新登錄
                    case ASAuthorizationAppleIDProviderCredentialTransferred:
                        errorMsg = @"蘋果授權(quán)信息變動(dòng)";
                        break;
                }
                dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"SignInWithApple授權(quán)狀態(tài)變化情況");
                    NSLog(@"%@", errorMsg);
                });
            }];
            
        }
    }

5.能不能自定義sign in Apple按鈕這個(gè)問題乎澄,我們也發(fā)郵件去咨詢了蘋果公司突硝,回復(fù)的是:you best to use the familiar buttons that Apple provides for Sign in with Apple,但是最終我們沒有使用系統(tǒng)自帶的ASAuthorizationAppleIDButton 置济,而是按照設(shè)計(jì)規(guī)范自己設(shè)計(jì)按鈕狞换。目前無法確定是否可以提審成功。
一些參考文檔:
https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple/overview/
https://developer.apple.com/documentation/signinwithapplerestapi/authenticating_users_with_sign_in_with_apple#see-also

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舟肉,一起剝皮案震驚了整個(gè)濱河市修噪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌路媚,老刑警劉巖黄琼,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異整慎,居然都是意外死亡脏款,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門裤园,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撤师,“玉大人,你說我怎么就攤上這事拧揽√甓埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵淤袜,是天一觀的道長(zhǎng)痒谴。 經(jīng)常有香客問我,道長(zhǎng)铡羡,這世上最難降的妖魔是什么积蔚? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮烦周,結(jié)果婚禮上尽爆,老公的妹妹穿的比我還像新娘怎顾。我一直安慰自己,他們只是感情好漱贱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布杆勇。 她就那樣靜靜地躺著,像睡著了一般饱亿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闰靴,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天彪笼,我揣著相機(jī)與錄音,去河邊找鬼蚂且。 笑死配猫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杏死。 我是一名探鬼主播泵肄,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼淑翼!你這毒婦竟也來了腐巢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤玄括,失蹤者是張志新(化名)和其女友劉穎冯丙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遭京,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胃惜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哪雕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片船殉。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斯嚎,靈堂內(nèi)的尸體忽然破棺而出利虫,到底是詐尸還是另有隱情,我是刑警寧澤堡僻,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布列吼,位于F島的核電站,受9級(jí)特大地震影響苦始,放射性物質(zhì)發(fā)生泄漏寞钥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一陌选、第九天 我趴在偏房一處隱蔽的房頂上張望理郑。 院中可真熱鬧蹄溉,春花似錦、人聲如沸您炉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赚爵。三九已至棉胀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冀膝,已是汗流浹背唁奢。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窝剖,地道東北人麻掸。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像赐纱,于是被迫代替她去往敵國(guó)和親脊奋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354