iOS 接入 Google寞秃、Facebook 登錄(一)

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


前言

筆者最近調(diào)研了一下 iOS 接入Google、Facebook 登錄土陪,會整理2篇文章昼汗。并分享如下內(nèi)容:

  1. 創(chuàng)建 Google、Facebook 應(yīng)用鬼雀;
  2. 接入 Google顷窒、Facebook 登錄的過程;
  3. 接入 Google源哩、Facebook 登錄相關(guān)的 API鞋吉;
  4. 接入 Google、Facebook 登錄可能遇到的問題励烦。

首先谓着,筆者分享的是在Firebase 開放平臺創(chuàng)建Google、Facebook 應(yīng)用的內(nèi)容坛掠。

一赊锚、在Firebase 開放平臺創(chuàng)建Google應(yīng)用

1. Firebase 介紹

Firebase 是Google 的移動平臺,可幫助您快速開發(fā)優(yōu)質(zhì)應(yīng)用并發(fā)展業(yè)務(wù)却音。

1.1 個人理解 Firebase

筆者在使用 Firebase 方面改抡,目前調(diào)研過 Google、Facebook系瓢、Twitter阿纤、Github、匿名登錄夷陋。Firebase 可以幫助開發(fā)者快速集成 Google欠拾、Facebook、Twitter登錄等功能骗绕。

像國內(nèi)的友盟開放平臺可幫助開發(fā)者快速接入國內(nèi)常用的三方登錄分享等藐窄。Firebase 可幫助開發(fā)者快速接入國外常用三方登錄分享等。

另外在授權(quán)登錄方面 酬土,F(xiàn)irebase 對接入的三方做了進一步的封裝荆忍。開發(fā)者(服務(wù)端)在接入三方時,可選擇不直接和三方返回的授權(quán)信息交互,而是通過三方返回的授權(quán)信息刹枉,調(diào)用 Firebase 相關(guān)API 獲取 Firebase 開放平臺返回的token信息(jwt格式)進行交互叽唱。這樣開發(fā)者(服務(wù)端)可只與 Firebase 平臺返回的 token信息進行交互驗證三方用戶授權(quán)信息有效性即可。

注意:因為墻的原因微宝,Google棺亭、Facebook 登錄需要在科學(xué)上網(wǎng)的環(huán)境下才能正常使用。

下邊筆者演示一下使用 Firebase 接入 Google蟋软、Facebook 登錄后镶摘,進行授權(quán)的流程,示意圖如下岳守,點擊 Google 登錄按鈕后凄敢,獲取到了用戶的 Google 信息,然后使用相關(guān)信息進一步獲取到 Firebase 開放平臺對應(yīng)的 Google 信息棺耍。Facebook 登錄流程類似贡未。

1.2 筆者使用 Firebase 接入 Google种樱、Facebook 登錄的效果圖如下蒙袍。
Google、Facebook 登錄效果圖.gif

下一部分嫩挤,筆者會分享下在 Firebase 開放平臺創(chuàng)建應(yīng)用及在 Firebase 開放平臺啟用相應(yīng)登錄的過程害幅。

2.在 Firebase 開放平臺添加項目并創(chuàng)建應(yīng)用

2.1 打開 Firebase 開放平臺,可使用 Google 賬號登錄
2.2 添加項目
2.3 點擊創(chuàng)建好的項目并且選擇添加相應(yīng)的 iOS岂昭、Android 應(yīng)用
2.4 填寫要求的應(yīng)用信息如 BundleID以现、應(yīng)用名、AppStoreID(選填)约啊,最后下載配置文件 GoogleService-Info.plist
2.5 我們后續(xù)的 Google 登錄主要會用到配置文件中的 CLIENT_ID邑遏、REVERSED_CLIENT_ID 的值
2.6 啟用 Google、Facebook 登錄

打開我們創(chuàng)建好的應(yīng)用恰矩,依次查看 Authtication-> 登錄方法 -> 啟用 Google记盒、Facebook 登錄

注意:(1)在使用 Firebase 接入 Facebook 登錄的情況下,復(fù)制出來啟用 Facebook 時顯示的 OAuth 重定向 URI 外傅,這個重定向 URI 我們會粘貼到在Facebook 平臺的創(chuàng)建的應(yīng)用的有效 OAuth 跳轉(zhuǎn) URI 處纪吮。

OAuth 跳轉(zhuǎn) URL 的復(fù)制如下圖所示

FirebaseFacebookMatchAuth.png

注意:(2)上圖中的 應(yīng)用 ID 和 應(yīng)用密鑰的填寫內(nèi)容要和 Facebook 開放平臺創(chuàng)建的應(yīng)用生成的應(yīng)用編號及應(yīng)用密鑰保持一致,否則當用戶使用 Facebook 授權(quán)登錄后萎胰,使用 Firbase 相關(guān) API 校驗登錄信息的時候會報錯如下碾盟。

Error Domain=FIRAuthErrorDomain Code=17004 "Unsuccessful debug_token response from Facebook: {"error":{"message":"Error validating application. Invalid application ID.","type":"OAuthException","code":190,"fbtrace_id":"A-bczlMKMvzVfRTnOSP21_B"}}" UserInfo={NSLocalizedDescription=Unsuccessful debug_token response from Facebook: {"error":{"message":"Error validating application. Invalid application ID.","type":"OAuthException","code":190,"fbtrace_id":"A-bczlMKMvzVfRTnOSP21_B"}}, FIRAuthErrorUserInfoNameKey=ERROR_INVALID_CREDENTIAL}

下一部分,筆者會介紹下技竟,在 Facebook 開放平臺創(chuàng)建應(yīng)用冰肴、添加測試用戶、應(yīng)用審核相關(guān)的內(nèi)容。

二熙尉、 在 Facebook 開放平臺創(chuàng)建應(yīng)用

1. 在 Facebook 開放平臺創(chuàng)建應(yīng)用

1.1 打開 Facebook 開放平臺估盘,使用 Facebook 賬號密碼登錄
1.2 添加新應(yīng)用,依次填寫信息
1.3 補充新建的應(yīng)用的設(shè)置的基本信息
1.3.1 填寫隱私政策網(wǎng)址骡尽、服務(wù)條款網(wǎng)址遣妥、iOS Bunde ID、Android 包名攀细、包簽名箫踩、類名等信息
1.4 在創(chuàng)建的 Facebook 應(yīng)用的 產(chǎn)品 Facebook 登錄 -> 設(shè)置中 填寫有效的 OAuth 跳轉(zhuǎn) URI,這個 URI 在 本文 第一部分的2.6 中提到過谭贪。

2. 填寫應(yīng)用中的測試用戶

2.1 在新建應(yīng)用的用戶身份的測試用戶部分境钟,添加測試用戶
2.2 點擊測試用戶的右側(cè)的編輯按鈕,可以更改測試用戶的賬號和密碼
2.3 測試用戶的賬號使用默認的郵箱即可俭识,密碼在 1.4.2 中指定

3. 應(yīng)用審核

3.1 應(yīng)用審核申請
3.2 應(yīng)用審核 相關(guān)
3.3 點擊應(yīng)用審核的申請(這里應(yīng)該會先操作應(yīng)用編號后的開發(fā)中改為發(fā)布)
3.4 審核時間為2至3天

下一部分慨削,筆者會分享下,使用 Firebase 接入 Google套媚、Facebook 登錄的過程缚态。

三、 使用 Firebase 接入 Google堤瘤、Facebook 登錄

1. 集成方式

1.1 使用 Cocoapods 的方式接入 Google玫芦、Facebook 登錄

2. Firebase 相關(guān)文檔及集成過程

2.1 使用 FirebaseUI 輕松向 iOS 應(yīng)用添加登錄服務(wù)
2.2 筆者在項目的 Podfile 中填寫的如下內(nèi)容

大家可也以根據(jù)需要指定 Firebase 具體的版本號,筆者在調(diào)研過程中 FirebaseUI 最新可用版本為8.4.1

#   pod 'FirebaseUI/Auth'
    pod 'FirebaseUI/Google'
    pod 'FirebaseUI/Facebook'

也可以使用如下指定具體版本號的方式本辐。

# pod 'FirebaseUI/Auth', '~> 8.4.1'
pod 'FirebaseUI/Google', '~> 8.4.1'
pod 'FirebaseUI/Facebook', '~> 8.4.1'

后來筆者再次查看文檔桥帆,發(fā)現(xiàn)上述pod 內(nèi)容可更改如下,并且下邊的方式Pods的文件占內(nèi)存最猩髦濉:

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

3. Firebase 接入 Google 登錄具體操作

3.1 項目配置 Google 登錄

為了正常使用Google登錄需要

  1. Firebase 控制臺中老虫,打開 Authentication(身份驗證)部分并啟用 Google 登錄服務(wù)。
  2. 在您的 Xcode 項目中茫多,TARGETS-> Info -> URL Types -> URL Schemes將您的倒序客戶端 ID 添加為網(wǎng)址架構(gòu)祈匙。您可以在 GoogleService-Info.plist 文件中找到REVERSED_CLIENT_ID對應(yīng)的值。
xcode_infotab_url_type_values.png
3.2 把從 Firebase 開放平臺下載的配置文件 GoogleService-Info.plist 拖拽到項目中
3.3 在應(yīng)用啟動時地梨,初始化 Firebase SDK
#import <Firebase.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    

    // Firebase 初始化配置
    [FIRApp configure];
    [GIDSignIn sharedInstance].clientID = [FIRApp defaultApp].options.clientID;
    // 其他代碼... 
    return YES;
}
3.4 Google 登錄需要在如下代理方法中做處理
3.4.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:[FIRApp defaultApp].options.clientID]) {
        return [[GIDSignIn sharedInstance] handleURL:url];
    }
    return NO;
}
3.4.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:[FIRApp defaultApp].options.clientID]) {
        [[GIDSignIn sharedInstance] handleURL:openURLContext.URL];
    }
}
3.5 Google 登錄按鈕相關(guān)代碼及處理 Google 登錄成功失敗結(jié)果相關(guān)代碼
#import <GoogleSignIn/GoogleSignIn.h>

// 遵守代理 <GIDSignInDelegate>

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

// Firebase 封裝的 Google 登錄按鈕
GIDSignInButton *gidSignInBtn = [GIDSignInButton new];
gidSignInBtn.frame = CGRectMake(20.0, 120.0, 100.0, 40.0);
gidSignInBtn.center = self.view.center;
[self.view addSubview:gidSignInBtn];


// 實現(xiàn)代理方法
- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error {
    
    if (!error) {
        NSLog(@"用戶ID:%@", user.userID);
        
        GIDAuthentication *authentication = user.authentication;
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                         accessToken:authentication.accessToken];
        NSLog(@"credential Provider:%@", credential.provider);
        // Firebase 身份驗證
        // Summary
        // Asynchronously signs in to Firebase with the given 3rd-party credentials (e.g. a Facebook login Access Token, a Google ID Token/Access Token pair, etc.) and returns additional identity provider data.
        // 三方異步登錄Firebase
        [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
            if (error) {
                NSLog(@"錯誤信息:%@", error.debugDescription);
            }
            if (!authResult) {
                NSLog(@"授權(quán)結(jié)果為空");
                return;
            }
            NSLog(@"Firebase uid:%@", authResult.user.uid);
            
            // 用于獲取登錄用戶 Firebase token 信息交給服務(wù)端校驗
            [[FIRAuth auth].currentUser getIDTokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
                if (error) {
                    
                    NSLog(@"獲取當前token出現(xiàn)錯誤:%@", error);
                    return;
                }
                // Send token to your backend via HTTPS
                NSLog(@"Firebase當前用戶 token 信息:%@", token);
           }];
            /**
             * 2020-03-06 20:48:46.859887+0800 FirebaseDemo[95438:3699395] credential Provider:google.com
             * 2020-03-06 20:48:47.914463+0800 FirebaseDemo[95438:3699395] Firebase uid:ma4dqHEO7JZm************QVE3
             * 2020-03-06 21:21:22.486530+0800 FirebaseDemo[95931:3798238] Firebase當前用戶 token 信息:eyJhbGciOiJSUzI1NiIsImtpZCI6IjhjZjBjNjQyZDQ.*********4ZTRiZDc5OTkzOTZiNTY3NDAiLCJ0eX*********vbSJ9fQ.pvyaaG2dKKDH4CxO4VGiq_jcwDnmP************gQhHE-j-W
             // 這部分token 信息是 jwt 格式的內(nèi)容
             */
        }];
    } else {
        NSLog(@"%@", error.debugDescription);
        self.userInfoLabel.text = error.debugDescription;
    }
}

在上述代碼中菊卷,當我們點擊的 Firebase 為我們提供好的 GIDSignInButton 的時候,便會執(zhí)行 Google 登錄的流程宝剖。Google 登錄成功或失敗的結(jié)果會在 - (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error 的代理方法中回調(diào)洁闰。

4. Firebase 接入 Facebook 登錄具體操作

4.1 項目配置 Facebook 登錄
4.1.1 配置 Facebook 的 AppID 、URL Scheme及 FacebookDisplayName

在 Info.plist 文件中配置如下FacebookAppID(CFBundleURLSchemes)及使用Facebook 授權(quán)的時候万细,顯示的 Facebook 授權(quán)的應(yīng)用名稱(FacebookDisplayName對應(yīng)的值控制)扑眉。

注意:

FacebookAppID 對應(yīng)的值換成我們在 Facebook 平臺創(chuàng)建的應(yīng)用的 應(yīng)用編號 纸泄,如應(yīng)用編號是12345678,那么 FacebookAppID 對應(yīng)的值為12345678腰素。

CFBundleURLSchemes 對應(yīng)的值換成 fb 追加我們在 Facebook 平臺創(chuàng)建的應(yīng)用的 應(yīng)用編號 聘裁,如應(yīng)用編號是12345678,那么 CFBundleURLSchemes 對應(yīng)的值 fb12345678弓千。

<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>fb8554384xxxxxxxx</string> </array> </dict> </array> <key>FacebookAppID</key> <string>8554384xxxxxxxx</string> <key>FacebookDisplayName</key> <string>FirebaseDemo</string>

如果沒有填寫 CFBundleURLSchemes 的值應(yīng)用會 Crash衡便,并報出如下問題。

2020-03-05 13:07:46.219473+0800 FirebaseDemo[11204:2947177] ** Terminating app due to uncaught exception 'InvalidOperationException', reason: 'fb8554384xxxxxxxx is not registered as a URL scheme. Please add it in your Info.plist'*

4.1.2 配置 LSApplicationQueriesSchemes

在 Info.plist 文件中填寫如下 Facebook 白名單洋访,否則不能從應(yīng)用中跳轉(zhuǎn)至 Facebook 應(yīng)用镣陕。不填寫 Facebook 的白名單現(xiàn)象是,即便是手機端安裝了 Facebook 應(yīng)用姻政,依然不會提示跳轉(zhuǎn)至 Facebook 授權(quán)登錄呆抑。而只會彈出網(wǎng)頁授權(quán)登錄。


<key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</string> <string>fbapi20130214</string> <string>fbapi20130410</string> <string>fbapi20130702</string> <string>fbapi20131010</string> <string>fbapi20131219</string> <string>fbapi20140410</string> <string>fbapi20140116</string> <string>fbapi20150313</string> <string>fbapi20150629</string> <string>fbapi20160328</string> <string>fbauth</string> <string>fbauth2</string> <string>fbshareextension</string> </array>

筆者在使用 Facebook時嘗試過使用如下簡短的白名單也是可以的汁展。

<string>fbauth</string> <string>fbauth2</string> 
4.2 在應(yīng)用啟動時鹊碍,調(diào)用準備使用 Facebook SDK 的代碼及初始化Facebook SDK 的代碼
#import <FBSDKLoginKit/FBSDKLoginKit.h>

 // 為了使用 Facebook SDK 應(yīng)該調(diào)用如下方法
[[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
// 注冊 FacebookAppID
[FBSDKSettings setAppID:kFacebookAppID];
4.3 Facebook 登錄需要在如下代理方法中做處理

如下代理方法用于手機端安裝了 Facebook 的情況下,從我們的應(yīng)用跳轉(zhuǎn)到 Facebook 食绿,然后從 Facebook 跳轉(zhuǎn)回我們的應(yīng)用的時候侈咕,移除之前模態(tài)出的授權(quán)視圖。

4.3.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;
}
4.3.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;
        }
    }
}
4.4 Facebook 登錄按鈕相關(guān)代碼及處理 Facebook 登錄成功失敗結(jié)果相關(guān)代碼
#import "FBSDKLoginKit.h"

// 遵守代理 <FBSDKLoginButtonDelegate>

// Firebase 封裝的Facebook 登錄按鈕
FBSDKLoginButton *fbLoginBtn = [FBSDKLoginButton new];
fbLoginBtn.frame = CGRectMake(20.0, 100.0, 120.0, 40.0);
fbLoginBtn.center = self.view.center;
fbLoginBtn.delegate = self;
[self.view addSubview:fbLoginBtn];

// FBSDKLoginButtonDelegate 代理方法
- (void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error {
    
    if (error) {
        NSLog(@"錯誤信息:%@", error);
    } else {
        FIRAuthCredential *credential =
        [FIRFacebookAuthProvider credentialWithAccessToken:result.token.tokenString];
        NSLog(@"credential Provider:%@", credential.provider);
        // Firebase 身份驗證
        // Summary
        // Asynchronously signs in to Firebase with the given 3rd-party credentials (e.g. a Facebook login Access Token, a Google ID Token/Access Token pair, etc.) and returns additional identity provider data.
        // 三方異步登錄Firebase
        [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
            if (error) {
                NSLog(@"錯誤信息:%@", error.debugDescription);
            }
            if (!authResult) {
                NSLog(@"授權(quán)結(jié)果為空");
                return;
            }
            NSLog(@"Firebase uid:%@", authResult.user.uid);
            
            
            
            /**
             * 2020-03-06 20:35:42.995671+0800 FirebaseDemo[95438:3699395] token信息:<FBSDKAccessToken: 0x600001bf6580>
             * 2020-03-06 20:35:45.301482+0800 FirebaseDemo[95438:3699395] Firebase uid:X8U372A8****************s3s1
             * 2020-03-06 21:22:49.582470+0800 FirebaseDemo[95931:3798238] Firebase當前用戶 token 信息:eyJhbGc*******************************************************AiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoi546L5rC45pe6IiwicGljdHVyZSI6Imh0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tLzEwMTAyNzQ5NDgxOTk4My9wa*******************************************************2tlbi5nb29nbGUuY29tL2Zpci1kZW1vLThkZj*******************************************************DM1MDA5NjgsInVzZXJfaWQiOiJYOFUzNzJBOG*******************************************************nlCdzNnS01nMXZ6czNzMSIsImlhdCI6MTU4MzUwMDk2OCwiZXhwIjoxNTgzNTA0NTY4LCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImZhY2Vib29rLmNvbSI6WyIxMDEwMjc0OTQ4MTk5ODMiXX0sInNpZ25faW5fcHJvdmlkZXIiOiJmYWNlYm9vay5jb20ifX0.VuhMUV_hr9Bc0Alrv2MS1X*******************************************************omeMXd5ebEe_FtKXEvSppDV8TN66p-*******************************************************lZpe-*******************************************************f-fyZ0lEK-p0PWB96WMKKY7jeVvPo_LR89u88kvjf7C-*******************************************************TWJmEYCMLqqtw9A
             */
            // 這部分token 信息是 jwt 格式的內(nèi)容
        }];
        NSLog(@"token信息:%@", result.token);
        self.userInfoLabel.text = [NSString stringWithFormat:@"token信息:%@", result.token.tokenString];
        
    }
}

// 當點擊 Facebook Log out 按鈕的時候會調(diào)用這個代理方法
- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton {
    
    NSLog(@"退出登錄");
}

目前炫欺,我們已經(jīng)在三方登錄授權(quán)成功后乎完,獲取到三方 App 返回 token 信息熏兄,并獲取到了 Firebase token 信息品洛。下邊我們就可以使用相關(guān) Firebase token 信息,到服務(wù)端去驗證相關(guān)信息的有效性了摩桶。

四桥状、程序化身份驗證

筆者對服務(wù)端的開發(fā)不大了解,筆者看到了這個網(wǎng)址

驗證 ID 令牌硝清,可能是可以用于服務(wù)端校驗客戶端授權(quán)信息(客戶端 點擊 Google辅斟、Facebook 登錄獲取到的授權(quán)信息)有效性的文檔。

五芦拿、小結(jié)

筆者在本文中記錄了使用 Firebase 集成 Google士飒、Facebook 登錄的開放平臺項目創(chuàng)建、項目相關(guān)配置過程及 Firebase 提供的 Google蔗崎、Facebook 登錄相關(guān)代碼酵幕;不過可能我們考慮到不想增添無關(guān)代碼及資源文件及因此帶來的部分包體積的增加,或許考慮到想把 Google缓苛、Facebook的登錄單獨接入來稍微減少編譯時間芳撒,此時我們也可以選擇直接接入 Google、Facebook 提供的 SDK 。在下一篇文章中笔刹,筆者會分享直接接入 Google芥备、Facebook 登錄的 SDK 及相關(guān)代碼。

參考學(xué)習(xí)網(wǎng)址


推薦文章:
Nginx 入門實戰(zhàn)
iOS中的3D變換(二)
iOS中的3D變換(一)
WebSocket 雙端實踐(iOS/ Golang)
今天我們來聊一聊WebSocket(iOS/Golang)
用 Swift 進行貝塞爾曲線繪制
Swift 5.1 (11) - 方法
Swift 5.1 (10) - 屬性
iOS App后臺鄙嗖耍活

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萌壳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子日月,更是在濱河造成了極大的恐慌讶凉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件山孔,死亡現(xiàn)場離奇詭異懂讯,居然都是意外死亡,警方通過查閱死者的電腦和手機台颠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門褐望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人串前,你說我怎么就攤上這事瘫里。” “怎么了荡碾?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵谨读,是天一觀的道長。 經(jīng)常有香客問我坛吁,道長劳殖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任拨脉,我火速辦了婚禮哆姻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玫膀。我一直安慰自己矛缨,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布帖旨。 她就那樣靜靜地躺著箕昭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪解阅。 梳的紋絲不亂的頭發(fā)上落竹,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音瓮钥,去河邊找鬼筋量。 笑死烹吵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的桨武。 我是一名探鬼主播肋拔,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呀酸!你這毒婦竟也來了凉蜂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤性誉,失蹤者是張志新(化名)和其女友劉穎窿吩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體错览,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡纫雁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倾哺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧邪。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖羞海,靈堂內(nèi)的尸體忽然破棺而出忌愚,到底是詐尸還是另有隱情,我是刑警寧澤却邓,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布硕糊,位于F島的核電站,受9級特大地震影響腊徙,放射性物質(zhì)發(fā)生泄漏简十。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一昧穿、第九天 我趴在偏房一處隱蔽的房頂上張望勺远。 院中可真熱鬧,春花似錦时鸵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至和簸,卻和暖如春彭雾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锁保。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工薯酝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留半沽,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓吴菠,卻偏偏與公主長得像者填,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子做葵,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • 九月的第一天占哟,吃罷晚飯。抬眼間酿矢,我看見外面的天已全黑了榨乎。再抬眼看看墻上的掛鐘,七點瘫筐。我對媽說:現(xiàn)在天是黑得早了蜜暑,早...
    小確幸讀書閱讀 342評論 0 2
  • 唐詩的偉大也正是由于它代表著一種情緒,以及一種深刻的人生哲理策肝,很多的作品看上去寫得平淡無奇史煎,可是當我們細細品來,則...
    不較勁的智慧閱讀 322評論 2 11
  • 今天驳糯,2019年7月15日筆墨時光連續(xù)寫文第271天簡書日更第232天筆墨寫字畫畫第30天遇見高級營第23期第10...
    騎著蝸牛闖天下閱讀 288評論 1 3
  • 經(jīng)過3個月的工作“修行”篇梭,放棄了!但,與艷子的偶遇酝枢,也許是必然恬偷,結(jié)識讀書會,收獲頗多:思維帘睦,感知袍患,隨性……雖然見面...
    海寶樂樂君閱讀 261評論 0 0