Facebook第三方登錄

1.集成并測(cè)試facebook

1.注冊(cè)開(kāi)發(fā)者賬號(hào)

登陸facebook開(kāi)發(fā)者平臺(tái) (https://developers.facebook.com/), 注冊(cè)facebook開(kāi)發(fā)者賬號(hào)。

2.創(chuàng)建應(yīng)用

  • 2.選擇iOS平臺(tái)
  • 3.輸入APP的名稱,選擇Create New Facebook App ID
  • 4.選擇APP類別,點(diǎn)擊創(chuàng)建應(yīng)用編號(hào)。

3.下載SDK

在該界面中點(diǎn)擊按鈕下載SDK,或者在
https://developers.facebook.com/docs/ios中下載iOS平臺(tái)的SDK。

4.配置APP在facebook中的信息

  • 1.點(diǎn)擊右上角My Apps,進(jìn)入Dashboard界面。
    此時(shí)可以看到AppID和AppSecret,記住這兩個(gè)值,之后要用到。(如果AppSecret是加密的話,點(diǎn)擊旁邊的show即可看到值)
  • 2.點(diǎn)擊Dashboard左邊的Settings選項(xiàng),點(diǎn)擊+ Add Platform



  • 3.選擇iOS平臺(tái)。



  • 4.輸入Bundle ID。
  • 5.設(shè)置Single Sign(單點(diǎn)登錄)為on。
  • 6.選擇是否打開(kāi)自動(dòng)記錄 iOS 應(yīng)用內(nèi)購(gòu)買事件(選填)
  • 7.點(diǎn)擊保存Save Changes



4.集成SDK到XCode中

  • 1.在項(xiàng)目中新建名稱為FrameworksGroup
  • 2.打開(kāi)下載的SDK的目錄 ~/Documents/FacebookSDK
    并拖拽
    Bolts.framework
    FBSDKCoreKit.Framework,
    FBSDKLoginKit.Framework,
    FBSDKShareKit.Framework

    到項(xiàng)目的Frameworks組中。在拖拽選項(xiàng)中選擇Copy items if neededCreate groups

5.配置Xcode工程

右鍵點(diǎn)擊Info.plist文件,選擇Open As Source Code

5.1.設(shè)置URLSchemes
  • 復(fù)制粘貼以下片段到XML的body中<dict>...</dict>
<key>CFBundleURLTypes</key>
<array>
  <dict>
  <key>CFBundleURLSchemes</key>
  <array>
    <string>fb{your-app-id}</string>
  </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>{your-app-id}</string>
<key>FacebookDisplayName</key>
<string>{your-app-name}</string>

將 fb{your-app-id} 替換為 Facebook 應(yīng)用編號(hào),加上前綴 fb。例如,fb123456。您可以通過(guò) Facebook 應(yīng)用面板找到應(yīng)用編號(hào)。

使用應(yīng)用編號(hào)替換 {your-app-id}

使用您在應(yīng)用面板中指定的顯示名稱替換 {your-app-name}

5.2.Facebook加入網(wǎng)絡(luò)白名單
  • iOS9要配置App Transport Security,把Facebook加入白名單,打開(kāi)Info.plist,添加以下片段。
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>facebook.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
        <key>fbcdn.net</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
        <key>akamaihd.net</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
5.3.設(shè)置應(yīng)用跳轉(zhuǎn)白名單
  • 如果使用了facebook的登陸分享功能,需要跳轉(zhuǎn)到facebook的APP,同樣也要在.plist文件中處理一下。
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>fbapi</string>
  <string>fb-messenger-api</string>
  <string>fbauth2</string>
  <string>fbshareextension</string>
</array>

6.添加系統(tǒng)資源庫(kù)

點(diǎn)擊target->General->Linked Frameworks and Libraries,點(diǎn)擊左下角的+號(hào)按鈕,依次添加以下系統(tǒng)資源庫(kù)

Security.framework
libiconv.dylib
SystemConfiguration.framework
CoreGraphics.Framework
libsqlite3.dylib
CoreTelephony.framework
libstdc++.dylib
libz.dylib
Accounts.framework

7.連接Application Delegate

在facebook登錄或者分享過(guò)程中,會(huì)打開(kāi)facebook APP或者跳轉(zhuǎn)到Safari,此時(shí)要要連接AppDelegateFBSDKApplicationDelegate。在AppDelegate.swift中添加以下代碼:

#import <FBSDKCoreKit/FBSDKCoreKit.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [[FBSDKApplicationDelegate sharedInstance] application:application
    didFinishLaunchingWithOptions:launchOptions];
  return YES;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
    openURL:url
    sourceApplication:sourceApplication
    annotation:annotation
  ];
}

swift版本

import FBSDKCoreKit
import FBSDKLoginKit

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}

@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {        
    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)
}
// iOS8
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}

8.打開(kāi)Keychain(很重要)

Xcode8iOS 10 的情況下,還需要做一步操作,那就是打開(kāi)Keychain
在Xcode左側(cè)導(dǎo)航欄最上面,點(diǎn)擊“項(xiàng)目名稱”,在右側(cè)面板中選擇Capabilities,在下面找到Keychain Sharing,點(diǎn)擊ON按鈕。

Keychain.png
9.添加應(yīng)用程序事件(Events)(非必選)

當(dāng)用戶安裝或者使用APP的時(shí)候,有些事件數(shù)據(jù)可以被統(tǒng)計(jì),可以在facebook的分析面板中查看 (https://www.facebook.com/analytics?__aref_src=devsite&__aref_id=docs_ios_getting_started).

記錄APP激活,在AppDelegate.m添加以下代碼:

//  AppDelegate.m
#import <FBSDKCoreKit/FBSDKCoreKit.h>
- (void)applicationDidBecomeActive:(UIApplication *)application {
  [FBSDKAppEvents activateApp];
}

swift代碼:

func applicationDidBecomeActive(application: UIApplication) {
    FBSDKAppEvents.activateApp()
}

10.測(cè)試登陸

1.導(dǎo)入頭文件

swift項(xiàng)目中,在橋接文件中添加導(dǎo)入頭文件代碼。如果是objc的話,在你的ViewController.mAppdelegate.m中導(dǎo)入頭文件。

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
2.添加相應(yīng)代碼
  • 1.在ViewController.swift中的viewDidLoad方法中添加以下代碼:
let loginBtn: FBSDKLoginButton = FBSDKLoginButton()
loginBtn.center = self.view.center
view.addSubview(loginBtn)
  • 2.現(xiàn)在編譯并運(yùn)行你的APP,就可以看到facebook的登陸按鈕。
Facebook登錄按鈕
  • 3.點(diǎn)擊登錄按鈕,就會(huì)跳轉(zhuǎn)到登錄界面:
facebook登錄頁(yè)面

10.自定義登錄按鈕

大多數(shù)情況下,我們希望能夠自定義facebook的登陸按鈕,在按鈕的點(diǎn)擊事件方法中,寫入以下代碼:

/// 按鈕監(jiān)聽(tīng)方法
func facebookBtnClick() {
    
    // 打開(kāi) FBSDKProfile 自動(dòng)追蹤 FBSDKAccessToken
    FBSDKProfile.enableUpdates(onAccessTokenChange: true)
    // 清空FBSDKAccessToken
    FBSDKAccessToken.setCurrent(nil)
    
    // 登錄
    let loginManager: FBSDKLoginManager = FBSDKLoginManager()
    loginManager.logOut() // 先退出登錄
    loginManager.loginBehavior = .native // 優(yōu)先客戶端方式
    loginManager.logIn(withReadPermissions: ["public_profile"], from: self) { (result, error) -> Void in
        
        guard let res = result else {
            return
        }
        
        if error != nil {
            print("Process error")
        } else if res.isCancelled {
            print("Cancelled")
        } else {
            // 獲取userID和token
            print("userID: \(res.token.userID), token: \(res.token.tokenString)")
            print("FBSDKProfile.current(): \(FBSDKProfile.current())")
        }
    }
}

如果想要進(jìn)一步獲取用戶信息,比如用戶名和頭像等,需要添加通知,監(jiān)聽(tīng)用戶登錄獲取。

override func viewDidLoad() {
    super.viewDidLoad()
    
    NotificationCenter.default.addObserver(
        forName: NSNotification.Name.FBSDKProfileDidChange,
        object: nil, queue: nil) { (Notification) in
            
            // 進(jìn)一步獲取用戶信息
            if let profile = FBSDKProfile.current() {
                print("profile.userID: \(profile.userID)")
                print("profile.name: \(profile.name)")
                let url = profile.imageURL(for: FBSDKProfilePictureMode.normal, size: CGSize(width: 200, height: 200))
                print("url: \(url)")
            }
    }
}

/// 移除監(jiān)聽(tīng)
deinit {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.FBSDKProfileDidChange, object: nil)
}

11. 登錄評(píng)審

一般情況下,使用第三方登錄,只需要****public_profile, email and user_friends****這三種權(quán)限就可以了,此時(shí)在app的設(shè)置頁(yè)需要填寫聯(lián)系郵箱才能擁有這些權(quán)限。這種情況下,不需要facebook的審核,就可以使用了。

如果你的應(yīng)用需要請(qǐng)求public_profile, email and user_friends之外的額外需求,在你發(fā)布應(yīng)用之前,F(xiàn)acebook需要進(jìn)行評(píng)審。

注意:只能是注冊(cè)應(yīng)用的開(kāi)發(fā)者賬號(hào)才能做分享,如果要所有的賬號(hào)都可以使用的話,需要把注冊(cè)的應(yīng)用提交給facebook審核通過(guò),至于如何審核,請(qǐng)看下面的審核流程!

參考

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

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,151評(píng)論 4 61
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 23,989評(píng)論 8 183
  • 生活不如意之處十之八九,沒(méi)有一帆風(fēng)順的人生,好多的不幸運(yùn)都是我們打腦里臆想出來(lái)的一些困擾自己的情緒。 如果你正在不...
    金丫丫閱讀 98評(píng)論 0 1
  • 剛聽(tīng)聞你去世的消息,已經(jīng)過(guò)去了一個(gè)月,那時(shí)我剛巧在和朋友逛街,開(kāi)心的吃吃喝喝,收到弟弟打來(lái)的電話。開(kāi)始楞著不知如何...
    9807115ff8e3閱讀 284評(píng)論 0 0
  • 1.繪制線稿,先畫一張模糊的吉娃娃的線稿 2.從內(nèi)層葉片開(kāi)始上色,先用玫瑰花色和足量水調(diào)和,從葉尖開(kāi)始上色。然后將...
    桔紗閱讀 1,020評(píng)論 5 15