1.集成并测试facebook
1.注册开发者账号
登陆facebook开发者平台 (https://developers.facebook.com/), 注册facebook开发者账号。
2.创建应用
- 1.点击 (https://developers.facebook.com/) 右上角的My Apps按钮,在弹出的下拉菜单中,选择Add a New App。
- 2.选择iOS平台
- 3.输入APP的名称,选择Create New Facebook App ID
- 4.选择APP类别,点击创建应用编号。
3.下载SDK
在该界面中点击按钮下载SDK,或者在
https://developers.facebook.com/docs/ios中下载iOS平台的SDK。
4.配置APP在facebook中的信息
- 1.点击右上角My Apps,进入Dashboard界面。
此时可以看到AppID和AppSecret,记住这两个值,之后要用到。(如果AppSecret是加密的话,点击旁边的show即可看到值)
- 2.点击Dashboard左边的Settings选项,点击+ Add Platform。
- 3.选择iOS平台。
- 4.输入Bundle ID。
- 5.设置Single Sign(单点登录)为on。
- 6.选择是否打开自动记录 iOS 应用内购买事件(选填)
- 7.点击保存Save Changes
4.集成SDK到XCode中
- 1.在项目中新建名称为Frameworks的Group。
- 2.打开下载的SDK的目录 ~/Documents/FacebookSDK,
并拖拽
Bolts.framework
FBSDKCoreKit.Framework,
FBSDKLoginKit.Framework,
FBSDKShareKit.Framework
到项目的Frameworks组中。在拖拽选项中选择Copy items if needed和Create groups。
5.配置Xcode工程
右键点击Info.plist文件,选择Open As Source Code。
5.1.设置URLSchemes
- 复制粘贴以下片段到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 应用编号,加上前缀 fb。例如,fb123456。您可以通过 Facebook 应用面板找到应用编号。
使用应用编号替换 {your-app-id}
使用您在应用面板中指定的显示名称替换 {your-app-name}
5.2.Facebook加入网络白名单
- iOS9要配置App Transport Security,把Facebook加入白名单,打开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.设置应用跳转白名单
- 如果使用了facebook的登陆分享功能,需要跳转到facebook的APP,同样也要在.plist文件中处理一下。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
6.添加系统资源库
点击target->General->Linked Frameworks and Libraries,点击左下角的+号按钮,依次添加以下系统资源库
Security.framework
libiconv.dylib
SystemConfiguration.framework
CoreGraphics.Framework
libsqlite3.dylib
CoreTelephony.framework
libstdc++.dylib
libz.dylib
Accounts.framework
7.连接Application Delegate
在facebook登录或者分享过程中,会打开facebook APP或者跳转到Safari,此时要要连接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.打开Keychain(很重要)
在 Xcode8 和 iOS 10 的情况下,还需要做一步操作,那就是打开Keychain。
在Xcode左侧导航栏最上面,点击“项目名称”,在右侧面板中选择Capabilities,在下面找到Keychain Sharing,点击ON按钮。
9.添加应用程序事件(Events)(非必选)
当用户安装或者使用APP的时候,有些事件数据可以被统计,可以在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.测试登陆
1.导入头文件
swift项目中,在桥接文件中添加导入头文件代码。如果是objc的话,在你的ViewController.m和Appdelegate.m中导入头文件。
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
2.添加相应代码
- 1.在ViewController.swift中的viewDidLoad方法中添加以下代码:
let loginBtn: FBSDKLoginButton = FBSDKLoginButton()
loginBtn.center = self.view.center
view.addSubview(loginBtn)
- 2.现在编译并运行你的APP,就可以看到facebook的登陆按钮。
- 3.点击登录按钮,就会跳转到登录界面:
10.自定义登录按钮
大多数情况下,我们希望能够自定义facebook的登陆按钮,在按钮的点击事件方法中,写入以下代码:
/// 按钮监听方法
func facebookBtnClick() {
// 打开 FBSDKProfile 自动追踪 FBSDKAccessToken
FBSDKProfile.enableUpdates(onAccessTokenChange: true)
// 清空FBSDKAccessToken
FBSDKAccessToken.setCurrent(nil)
// 登录
let loginManager: FBSDKLoginManager = FBSDKLoginManager()
loginManager.logOut() // 先退出登录
loginManager.loginBehavior = .native // 优先客户端方式
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())")
}
}
}
如果想要进一步获取用户信息,比如用户名和头像等,需要添加通知,监听用户登录获取。
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(
forName: NSNotification.Name.FBSDKProfileDidChange,
object: nil, queue: nil) { (Notification) in
// 进一步获取用户信息
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)")
}
}
}
/// 移除监听
deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.FBSDKProfileDidChange, object: nil)
}
11. 登录评审
一般情况下,使用第三方登录,只需要****public_profile, email and user_friends****这三种权限就可以了,此时在app的设置页需要填写联系邮箱才能拥有这些权限。这种情况下,不需要facebook的审核,就可以使用了。
如果你的应用需要请求public_profile, email and user_friends之外的额外需求,在你发布应用之前,Facebook需要进行评审。
注意:只能是注册应用的开发者账号才能做分享,如果要所有的账号都可以使用的话,需要把注册的应用提交给facebook审核通过,至于如何审核,请看下面的审核流程!
参考
- 创建facebook应用参考:http://bbs.mob.com/thread-43-1-5.html
- facebook审核流程参考:http://bbs.mob.com/forum.php?mod=viewthread&tid=19104&page=1&extra=#pid40942
网友评论
Warning: Attempt to present <FBSDKContainerViewController: 0x1012db350> on <UIViewController: 0x1012189d0> whose view is not in the window hierarchy!
这是什么原因呀?
return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation
];
}
关于这行代码,谷歌登录也有同样的设置怎么处理呢?
openURL:url
sourceApplication:sourceApplication
annotation:annotation
];
BOOL google = 谷歌;
fb = fb?fb:google;
return fb;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
linker command failed with exit code 1 (use -v to see invocation)
那两个方法不写就没事