本文章包含
加入 facebook sdk(cocoapad)
swift串接 facebook sdk
常見問題
範例專案
如果iOS需要接入FB登入功能,有2個步驟
- 在FB Developer中建立「應用程式」,取得「應用程式編號」
- 在Project中進行設定,並接入SDK,並撰寫程式
建立FB應用程式
- 登入FB開發者後台
- 點選「我的應用程式」->「新增應用程式」,輸入「顯示名稱」(顯示名稱會在使用者登入時顯示)
點擊顯示示意圖-新增應用程式
- 點選「Facebook登入」
點擊顯示示意圖-新增Facebook登入功能
- 選擇iOS(選擇後會出現Facebook的完整教學,您也可以跟著做。)
點擊顯示示意圖-選擇平台-iOS
- 在「設定」->「基本資料」中點擊「新增平台」,選擇iOS
點擊顯示示意圖-新增平台
- 輸入「套件組合編號」(您的Bundle ID,下個步驟會建立)
點擊顯示示意圖-輸入套件組合編號
如此一來就完成了「FB應用程式」的建立
建立專案並接入SDK
- 將專案的套件組合編號(BundleID)填寫至FB開發者後台(建立FB應用程式 步驟6)
點擊顯示示意圖-查看專案的套件組合編號(BundleID)
- 在plist中輸入資料,包含FacebookAppID、FacebookDisplayName與URL Schemes
點擊顯示示意圖-填寫plist資料
- 接入sdk,可以參考FB官方github:FB Github
也可以使用pod,
也可以直接下載frameworkd:FB iOS SDK 下載頁面
注意:要接入 FBSDKCoreKit.framework 與 FBSDKLoginKit.framework與 Bolts.framework
- 在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 |
| |
} |
- 撰寫登入程式碼
| |
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("未知的錯誤") |
| |
} |
| |
}) |
| |
} |
| |
} |
常見問題搜集來自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),有三個點需要特別注意:
- 使用者有在Facebook留下該資料:
若使用者沒有留下資料,那麼應用程式再怎麼嘗試去取得資料,都會返回nil。
- 應用程式需要開通此權限:
一個應用程式預設批准的登入權限有三個:email與public_profile(括姓名、大頭貼照、性別和年齡範圍)與user_friends(使用者有在使用此應用程式的朋友名單)
- 登入時需要涵蓋該權限:
在撰寫程式時,需要設定登入的權限,記得加入權限。
範例專案 包含登入、取得Profile(Facebook應用程式是我本人建立測試的)
Github連結