iOS 接入 Google、Facebook 登錄(二)

級別:★☆☆☆☆
標簽:「iOS 接入 Google、Facebook 登錄」「iOS Google 登錄」「iOS Facebook 登錄」
作者: WYW
審校: QiShare團隊


前言:
筆者在 iOS 接入 Google、Facebook 登錄(一) 中分享了使用 Firebase 接入 Google、Facebook 登錄相關的內容,在本文中,筆者將分享直接接入 Google、Facebook 登錄SDK的內容。

關于在 Google、Facebook 開放平臺創建應用、項目中需要做的配置,筆者已經在上一篇文章 iOS 接入 Google、Facebook 登錄(一) 中說明。本文中不再說明。

iOS 接入 Google、Facebook 登錄(一) 是使用的Firebase 接入的 Google、Facebook 登錄。上一篇文章中的 Google、Facebook 的登錄按鈕都是使用的 Firebase 封裝好的。如果我們想要自定義 Google、Facebook 按鈕,我們可在點擊自定義按鈕的時候,調用登錄相關 API 即可。

一、接入 Google 登錄SDK

下邊筆者先放置了 Google、Facebook 登錄的效果圖。

1. Google、Facebook 登錄效果圖

GoogleFacebookLoginDemo.gif

下邊筆者分享下集成 Google 登錄 SDK 的方式、過程及部分 API。

2. 集成 Google 登錄 SDK

集成 Google 登錄 SDK,Google 官方提供了2種方式,分別是使用 Cocoapods 和 直接拖拽相應 Framework 和相關資源文件到項目。

2.1 Cocoapods 方式集成 Google 登錄 SDK

Podfile 內容如下:

pod 'GoogleSignIn', '~> 5.0.2'
2.2 直接下載 Google 登錄的 Framework

直接下載 Google 登錄的 Framework 時,我們需要鏈接所需的 Framework,及做相關 Objc 配置等。具體流程及更多可選的 Google 登錄的 Framework 可查看 Get the Google Sign-In SDK for iOS

3. 接入Google 登錄相關操作

3.1 在應用啟動時,初始化 Google SDK
#import <Firebase.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [GIDSignIn sharedInstance].clientID = kGoogleClientID;
    // 其他代碼... 
    return YES;
}
3.2 Google 登錄需要在如下代理方法中做處理
3.2.1 AppDelegate.m 文件中的代理方法
- (BOOL)application:(nonnull UIApplication *)application
            openURL:(nonnull NSURL *)url
            options:(nonnull NSDictionary<NSString *, id> *)options {
    
    return [[GIDSignIn sharedInstance] handleURL:url];
}

//  ios(4.2, 9.0)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation {
    if ([url.absoluteString containsString:kGoogleClientID]) {
        return [[GIDSignIn sharedInstance] handleURL:url];
    }
    return NO;
}
3.2.2 SceneDelegate.m 中的代理方法
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts  API_AVAILABLE(ios(13.0)){
    
    UIOpenURLContext *openURLContext = URLContexts.allObjects.firstObject;
    if ([openURLContext.URL.absoluteString containsString:kGoogleClientID) {
        [[GIDSignIn sharedInstance] handleURL:openURLContext.URL];
    }
}
3.3 Google 登錄按鈕相關代碼及處理 Google 登錄成功失敗結果相關代碼
#import <GoogleSignIn/GoogleSignIn.h>

// 遵守代理 <GIDSignInDelegate>

// 設置代理
[GIDSignIn sharedInstance].delegate = self;
// 必須設置 否則會Crash
[GIDSignIn sharedInstance].presentingViewController = self;

// 點擊自定義的 Google 登錄按鈕 可以調用如下API
[[GIDSignIn sharedInstance] signIn];



// 實現代理方法
- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error {
    if (!error) {
        NSLog(@"用戶ID:%@", user.userID);
    } else {
        NSLog(@"%@", error.debugDescription);
    }
}

在上述代碼中,當我們點擊的自定義的 Button 調用 [[GIDSignIn sharedInstance] signIn]; ,便會執行 Google 登錄的流程。Google 登錄成功或失敗的結果會在 - (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error 的代理方法中回調。

3.5 Google 退出 API
[[GIDSignIn sharedInstance] signOut];

下邊筆者分享下接入 Facebook 登錄 SDK 的方式、過程、部分 API 及遇到的切換 Facebook 賬號問題。

二、 接入 Facebook 登錄SDK

1. 集成 Facebook 登錄 SDK

Facebook 開放平臺提供了4種方式,Swift Package Manager、Cocoapods、Carthage、直接下載 Facebook 登錄 SDK。下邊筆者簡單說明下 Cocoapods 集成方式及 直接下載 Facebook 登錄SDK

如需使用其他集成方式可查看 iOS 版 Facebook 登錄 — 快速入門

在第2部分設置開發環境的位置,在使用 iOS 版 Facebook 登錄之前,請先設置您的開發環境的下方可以選擇集成方式,Facebook 官方文檔就會顯示相應的集成說明。

1.1 Cocoapods 方式集成 Facebook 登錄 SDK

Podfile 內容如下:

pod 'FBSDKLoginKit', '~>6.0.0'
1.2 直接下載 Facebook 登錄 SDK

下載地址:Facebook 登錄 SDK

2. 接入 Facebook 登錄相關操作

2.1 在應用啟動時,調用準備使用 Facebook SDK 的代碼及初始化 Facebook SDK 的代碼
 // 為了使用 Facebook SDK 應該調用如下方法
[[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
// 注冊 FacebookAppID
[FBSDKSettings setAppID:kFacebookAppID];
2.2 Facebook 登錄需要在如下代理方法中做處理

如下代理方法用于手機端安裝了 Facebook 的情況下,從我們的應用跳轉到 Facebook ,然后從 Facebook 跳轉回我們的應用的時候,移除之前模態出的授權視圖。

2.2.1 AppDelegate.m 文件中的代理方法
- (BOOL)application:(nonnull UIApplication *)application
            openURL:(nonnull NSURL *)url
            options:(nonnull NSDictionary<NSString *, id> *)options {
    
    if (@available(iOS 9.0, *)) {
        return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    } else {
        // Fallback on earlier versions
    }
}

//  ios(4.2, 9.0)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation {
    if ([url.absoluteString containsString:kFacebookAppID]) {
        return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
    }
    return NO;
}
2.2.2 SceneDelegate.m 中的代理方法
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts  API_AVAILABLE(ios(13.0)){
    
    UIOpenURLContext *openURLContext = URLContexts.allObjects.firstObject;
    if (openURLContext) {
        if ([openURLContext.URL.absoluteString containsString:kFacebookAppID]) {
             [[FBSDKApplicationDelegate sharedInstance] application:UIApplication.sharedApplication openURL:openURLContext.URL sourceApplication:openURLContext.options.sourceApplication annotation:openURLContext.options.annotation];
            return;
        }
    }
}
2.3 Facebook 登錄按鈕相關代碼及處理 Facebook 登錄成功失敗結果相關代碼
#import "FBSDKLoginKit.h"

// 點擊 Facebook 登錄按鈕的時候調用如下代碼即可調用 Facebook 登錄功能
FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];

[loginManager logInWithPermissions:@[@"public_profile"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult * _Nullable result, NSError * _Nullable error) {
    if (error) {
        NSLog(@"Process error");
    } else if (result.isCancelled) {
        NSLog(@"Cancelled");
    } else {
        NSLog(@"token信息:%@", result.token);
    }
}];

Facebook 退出登錄可以調用如下代碼。遇到 Process Error 的時候,也可以試試調用如下退出登錄的 API。

FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
[loginManager logOut];
2.4 Facebook 切換登錄的賬號問題

我的同事 SH 在調研過程中,發現了 Facebook授權登錄 切換賬號不友好的問題。確實如果安裝了 Facebook 的情況下,用戶切換 Facebook 賬號可以通過在 Facebook 客戶端去修改登錄的賬號。但是如果沒有安裝 Facebook 客戶端,用戶就無法切換Facebook賬號了。因為仔細看看本文第一部分的呈現的效果圖的時候,可以發現,Facebook 登錄 沒有像 Google 登錄那樣提供一個切換賬號的方式(使用賬號)。

針對 Facebook切換賬號的問題,筆者后來也嘗試過Facebook 的 logOut([[[FBSDKLoginManager alloc] init] logOut];)、Facebook SDK 的 Revoke Permissions 不過都沒有解決切換賬號的問題,在 Facebook 登錄 SDK 的 issues 中發現,相關功能在Facebook SDK 的roadmap 中,及目前Facebook 登錄SDK 并不支持切換賬號。 相關網址:Can't login with another account after logout

目前可考慮的解決切換 Facebook 賬號的方式

針對切換賬號問題,筆者后來發現,如果用戶沒有安裝Facebook 的客戶端。又想切換 Facebook 賬號進行授權登錄的時候,可以通過 “設置” -> “Safari 瀏覽器” -> ”高級“ -> ”網站數據“ -> 右上角”編輯“ -> 刪除facebook.com 的數據。

經過上述操作,用戶就可以在使用 Facebook 登錄授權的時候,FacebookSDK 會要求再次輸入賬號密碼。

在此過程中如果遇到 FacebookSDK 報出的 Process Error的問題。可以調用 FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; [loginManager logOut]; 調用退出 Facebook 賬號來解決問題。

下邊筆者分享下使用 Firebase 接入 Google、Facebook 登錄和直接接入 Google、Facebook 登錄SDK 在包體積、編譯時間、現有項目考慮的比較。

三、 對比Firebase 接入Google、Facebook 登錄和直接接入 Google、Facebook 登錄

下邊筆者對使用 Firebase 接入 Google(方便起見記作方式1)、Facebook 登錄和直接接入 Google、Facebook 登錄(方便起見記作方式2)做了個個人理解的對比。

1. 打出來的安裝包體積方面

方式1的Podfile 內容:

pod 'Firebase/Auth', '~> 6.16.0'
pod 'GoogleSignIn', '~> 5.0.2'
pod 'FBSDKLoginKit', '~>6.0.0'

方式2的 Podfile 內容:

pod 'FBSDKLoginKit', '~>6.0.0'
pod 'GoogleSignIn', '~> 5.0.2'

方式1 和 方式2 的 pod 的內容會多一個 Firebase/Auth

方式1 和 方式2 的pods 項目圖比較

方式1相比較方式2來說。方式1需要 pod Firebase 封裝的 Google、Facebook 的部分代碼、圖片及本地化字符串等資源文件。所以筆者當前調研的情況方式1會比方式2的 Pods 大4MB左右。筆者打出來相應的開發的 ipa 包比較了一下,方式1 會比方式2的 ipa 包大 1.1MB 左右。

ipaBigSmall.png

注意:最開始筆者調研的時候,寫方式1的 Podfile 內容的時候,pod 的內容比較多,最終方式1相比較方式2來說,打出來的 ipa 包要大 7MB 多。所以如果使用 Firebase 接入 Google、Facebook 登錄的話,一定要仔細看文檔,看清楚需要 pod 的內容。

編譯時間相比之下,方式1也會比方式2長。

2. 編譯時間方面對比

因為筆者尚不了解編譯時間的衡量,只在終端輸入過如下命令

defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES

并在 Xcode 的頂部看見過項目編譯時間。

下圖是筆者在對比的項目非首次編譯的情況下,方式1和方式2編譯時間長短情況。

CompileTime.png

筆者嘗試了多次,發現方式1總會比方式2的編譯時間長一些,所以如果考慮減少編譯時間的話,可以考慮直接使用 Google、Facebook 登錄 SDK。

3. 現有項目考慮

3.1 使用 Firebase 接入Google、Facebook 登錄SDK

使用 Firebase 接入的 Google、Facebook 登錄 SDK,需要使用 Cocoapods 的方式集成 。

3.2 直接接入Google、Facebook 登錄SDK

直接接入 Google、Facebook 登錄 SDK 的集成方式上更具多樣性。 直接接入 Google、Facebook 登錄 SDK 時,Google 官方提供了 Cocoapods 及直接下載Framework 的集成方式,Facebook 提供了 Cocoapods、下載 Framework、Swift Package Manager 、Carthage 的集成方式。

四、參考學習網址


推薦文章:
iOS 接入 Google、Facebook 登錄(一)
Nginx 入門實戰
iOS中的3D變換(二)
iOS中的3D變換(一)
WebSocket 雙端實踐(iOS/ Golang)

今天我們來聊一聊WebSocket(iOS/Golang)
用 Swift 進行貝塞爾曲線繪制
Swift 5.1 (11) - 方法
Swift 5.1 (10) - 屬性

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374