本文章包含
 加入 facebook sdk(cocoapad)
 swift串接 facebook sdk
 常見問題
 範例專案

如果iOS需要接入FB登入功能,有2個步驟

  1. 在FB Developer中建立「應用程式」,取得「應用程式編號」
  2. 在Project中進行設定,並接入SDK,並撰寫程式

 

 

建立FB應用程式

  1. 登入FB開發者後台
  2. 點選「我的應用程式」->「新增應用程式」,輸入「顯示名稱」(顯示名稱會在使用者登入時顯示)

    點擊顯示示意圖-新增應用程式

  3. 點選「Facebook登入」

    點擊顯示示意圖-新增Facebook登入功能

  4. 選擇iOS(選擇後會出現Facebook的完整教學,您也可以跟著做。)

    點擊顯示示意圖-選擇平台-iOS

  5. 在「設定」->「基本資料」中點擊「新增平台」,選擇iOS

    點擊顯示示意圖-新增平台

  6. 輸入「套件組合編號」(您的Bundle ID,下個步驟會建立)

    點擊顯示示意圖-輸入套件組合編號

如此一來就完成了「FB應用程式」的建立

 

建立專案並接入SDK

  1. 將專案的套件組合編號(BundleID)填寫至FB開發者後台(建立FB應用程式 步驟6)

    點擊顯示示意圖-查看專案的套件組合編號(BundleID)

  2. 在plist中輸入資料,包含FacebookAppID、FacebookDisplayName與URL Schemes

    點擊顯示示意圖-填寫plist資料

  3. 接入sdk,可以參考FB官方github:FB Github
    也可以使用pod,
    也可以直接下載frameworkd:FB iOS SDK 下載頁面
    注意:要接入 FBSDKCoreKit.framework  FBSDKLoginKit.framework Bolts.framework
  4. 在AppDelegate加入FB程式
       
      import FBSDKLoginKit
      import FBSDKCoreKit
       
      @UIApplicationMain
      class AppDelegate: UIResponder, UIApplicationDelegate {
       
      ...
       
      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
      // Override point for customization after application launch.
       
      FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
       
      FBSDKSettings.setAppID("{your fb app id}")
      return true
      }
       
      func applicationDidBecomeActive(_ application: UIApplication) {
      FBSDKAppEvents.activateApp()
      }
       
      func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
      let result = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)
      return result
      }
       
      func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
      let result = FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
      return result
      }
  5. 撰寫登入程式碼
      import UIKit
      import FBSDKLoginKit
       
      class ViewController: UIViewController {
       
      @IBAction func bindFB() {
      let fbLoginManager = FBSDKLoginManager()
      fbLoginManager.logIn(withReadPermissions: ["public_profile","email"], from: self, handler: { action, previewViewController in
      if action != nil {
      if let cancel = action?.isCancelled {
      let tokenInfo = action?.token
      let uid = tokenInfo?.userID
      let tokenString = tokenInfo?.tokenString
       
      if !cancel {
      print("登入成功")
      }
      }
      } else {
      print("未知的錯誤")
      }
      })
      }
      }
    view rawLoginVC.swift hosted with by GitHub

 

常見問題搜集來自stackoverflow的發問

  • Q: 登入後可以取得accessToken,但是沒有profile資料


    A: 這問題在Android與iOS上都有。
    其實使用Facebook只有取得您要求權限的「AccesssToken」,與其使用者id,並不包含任何資料,您必須再去取得Profile才行。詳情可以見「範例專案」loadCurrentProfile方法。

  • Q: 取得的使用者id好像跟使用者的id不一樣


    A: 這是Facebook的政策,每一個不同的「FB應用程式」所取得的同一個使用者的id會不一樣,稱之為「app-scoped IDs」,意即這個id只有在取得的應用程式中有效。

  • Q: 無法取得使用者email


    A: Facebook只會返回經過驗證的Email,這是開發者無法避免的,甚至是使用者可以隨時註銷給應用程式的權限,因此您無法預期應用程式一定會取得使用者的Email。

  • Q: 無法取得其他資料,ex: 使用者所在地點


    A: 要取得使用者的資料,除非是必定存在的既有資料(例如:使用者id),有三個點需要特別注意:
    1. 使用者有在Facebook留下該資料:
      若使用者沒有留下資料,那麼應用程式再怎麼嘗試去取得資料,都會返回nil。
    2. 應用程式需要開通此權限:
      一個應用程式預設批准的登入權限有三個:emailpublic_profile(括姓名、大頭貼照、性別和年齡範圍)與user_friends(使用者有在使用此應用程式的朋友名單)
    3. 登入時需要涵蓋該權限:
      在撰寫程式時,需要設定登入的權限,記得加入權限。

 

範例專案 包含登入、取得Profile(Facebook應用程式是我本人建立測試的)

Github連結