iOS-蘋果登陸授權(AppleID SignIn)

来源:https://www.cnblogs.com/wangkejia/archive/2020/07/29/13398475.html
-Advertisement-
Play Games

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;
}

運行效果

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近有列出區域網中所有主機名的需求(SMB協議里的),但是findsmb命令總是列不全,搜了搜網上也沒什麼現成的解決方案,於是自己寫了個python腳本 腳本會掃描區域網arp表中所有ip,並嘗試解析其主機名,這樣可以較為徹底地列出相關信息。 註意,運行這個腳本需要samba-common-bin和 ...
  • Redis 預設支持持久化,依據自己的方式,將緩存在記憶體中的數據存儲在磁碟上! Redis支持兩種持久化數據的方式。第一種持久化方法為時間點轉儲(point-in-time dump),轉儲操作既可以在“指定時間段內有指定數量的寫操作執行”,這一條件被滿足時執行,又可以通過調用兩條轉儲到硬碟(dum ...
  • redis 為了速度,預設沒有開啟密碼口令驗證,為了安全,可以選擇開啟。 在 redis 的配置文件 redis.conf 的 requirepass 後設置密碼,示例設置為itbsl: 在修改完成後保存並重啟redis即可生效了,如果redis設置了口令,PHP連接redis也得設置auth了 $ ...
  • 本文更新於2020-05-03,使用MySQL 5.7,操作系統為Deepin 15.4。 MySQL的備份分為邏輯備份和物理備份,物理備份分為冷備份和熱備份。恢復分為完全恢復和不完全恢復,不完全恢復又分為基於時間點的恢復和基於位置的恢復。 邏輯備份和恢復 使用mysqldump進行邏輯備份,如my ...
  • 一般這個錯誤是由密碼錯誤引起,解決的辦法自然就是重置密碼。 假設我們使用的是root賬戶。 1.重置密碼的第一步就是跳過MySQL的密碼認證過程,方法如下: root 00:22:26~$ vim /etc/my.cnf (註:windows下修改的是my.ini) 2.在文檔內搜索mysqld定位 ...
  • Windows下mysql忘記密碼怎麼辦? 時隔半個月,我終於又開始操刀mysql,但是不小心砍到了我的腦子,密碼什麼的我全都忘了,結果,你懂的。。。所以,今天我就總結了一下網上的解決方法以及我自己的解決方法的一些心得。 方法一:免密碼進入mysql再修改密碼 步驟一:找到mysql安裝目錄下的配置 ...
  • 提到事務,相信大家都不陌生,事務的ACID四大特性,也是面試時經常問的,不過一般情況下,我們可能想到的是傳統關係型資料庫的事務,其實,Redis也是提供了事務機制的,本篇博客就來講解下Redis的事務機制。 1. 事務演示 Redis的事務提供了一種將多個命令請求打包,然後一次性、按順序性地執行多個 ...
  • 官方文檔https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_eight.htm#i1037226set autotrace off表示關閉,是預設的(set autot off)set autotrace on表示顯示結果、執行計劃、統... ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 準備開個系列來聊一下 PerfView 這款工具,熟悉我的朋友都知道我喜歡用 WinDbg,這東西雖然很牛,但也不是萬能的,也有一些場景他解決不了或者很難解決,這時候藉助一些其他的工具來輔助,是一個很不錯的主意。 很多朋友喜歡在項目中以記錄日誌的方式來監控項目的流轉情況,其實 CoreCL ...
  • 什麼是工業物聯網網關 工業物聯網網關是連接工業場景本地設備(如PLC、掃碼槍、機器人、數控機床等)與遠端業務系統(如SCADA系統、MES系統等)之間的硬體設備或軟體程式。終端設備和遠端業務系統之間的所有數據通信都通過工業物聯網網關來實現。 我們為什麼需要工業物聯網網關 因為從事汽車工業行業,在我們 ...
  • 在.NET Core的依賴註入框架中,服務註冊的信息將會被封裝成ServiceDescriptor對象,而這些對象都會存儲在IServiceCollection介面類型表示的集合中,另外,IServiceCollection介面類型預設使用的實現類型為ServiceCollection。這樣來看,實 ...
  • 如果業務邏輯比較簡單的話,一條主管道就夠了,確實用不到分支管道。不過當業務邏輯比較複雜的時候,有時候我們可能希望根據情況的不同使用特殊的一組中間件來處理 HttpContext。這種情況下如果只用一條管道,處理起來會非常麻煩和混亂。此時就可以使用 Map/MapWhen/UseWhen 建立一個分支 ...
  • .NET nanoFramework 安裝教程 準備材料​ esp32單片機(支持wifi藍牙) 安卓數據線(需要支持傳輸) 註意!請先安裝esp32驅動程式​ ESP32驅動鏈接 安裝 .NET nanoFramework固件快閃記憶體​ 安裝工具 dotnet tool install -g nano ...
  • Redis是大規模互聯網應用常用的記憶體高速緩存資料庫,它的讀寫速度非常快,據官方 Bench-mark的數據,它讀的速度能到11萬次/秒,寫的速度是8.1萬次/秒。 1. 認識Spring Cache 在很多應用場景中通常是獲取前後相同或更新不頻繁的數據,比如訪問產品信息數據、網頁數據。如果沒有使用 ...
  • 1、應用場景 1.1 kafka場景 ​ Kafka最初是由LinkedIn公司採用Scala語言開發,基於ZooKeeper,現在已經捐獻給了Apache基金會。目前Kafka已經定位為一個分散式流式處理平臺,它以 高吞吐、可持久化、可水平擴展、支持流處理等多種特性而被廣泛應用。 ​ Apache ...
  • Python帶我起飛——入門、進階、商業實戰_ 免費下載地址 內容簡介 · · · · · · 《Python帶我起飛——入門、進階、商業實戰》針對Python 3.5 以上版本,採用“理論+實踐”的形式編寫,通過大量的實例(共42 個),全面而深入地講解“Python 基礎語法”和“Python ...
  • 原文連接:https://www.zhoubotong.site/post/67.html Go 標準庫的net/url包提供的兩個函可以直接檢查URL合法性,不需要手動去正則匹配校驗。 下麵可以直接使用ParseRequestURI()函數解析URL,當然這個只會驗證url格式,至於功能變數名稱是否存在或 ...
  • 多商戶商城系統,也稱為B2B2C(BBC)平臺電商模式多商家商城系統。可以快速幫助企業搭建類似拼多多/京東/天貓/淘寶的綜合商城。 多商戶商城系統支持商家入駐加盟,同時滿足平臺自營、旗艦店等多種經營方式。平臺可以通過收取商家入駐費,訂單交易服務費,提現手續費,簡訊通道費等多手段方式,實現整體盈利。 ...