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)用
- 1.點(diǎn)擊 (https://developers.facebook.com/) 右上角的My Apps按鈕,在彈出的下拉菜單中,選擇Add a New App。
- 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)目中新建名稱為Frameworks的Group。
- 2.打開(kāi)下載的SDK的目錄 ~/Documents/FacebookSDK,
并拖拽
Bolts.framework
FBSDKCoreKit.Framework,
FBSDKLoginKit.Framework,
FBSDKShareKit.Framework
到項(xiàng)目的Frameworks組中。在拖拽選項(xiàng)中選擇Copy items if needed和Create 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í)要要連接AppDelegate和FBSDKApplicationDelegate。在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(很重要)
在 Xcode8 和 iOS 10 的情況下,還需要做一步操作,那就是打開(kāi)Keychain。
在Xcode左側(cè)導(dǎo)航欄最上面,點(diǎn)擊“項(xiàng)目名稱”,在右側(cè)面板中選擇Capabilities,在下面找到Keychain Sharing,點(diǎn)擊ON按鈕。
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.m和Appdelegate.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的登陸按鈕。
- 3.點(diǎn)擊登錄按鈕,就會(huì)跳轉(zhuǎn)到登錄界面:
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)看下面的審核流程!
參考
- 創(chuàng)建facebook應(yīng)用參考:http://bbs.mob.com/thread-43-1-5.html
- facebook審核流程參考:http://bbs.mob.com/forum.php?mod=viewthread&tid=19104&page=1&extra=#pid40942