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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...