Facebook第三方登录

1.集成并测试facebook

1.注册开发者账号

登陆facebook开发者平台 (https://developers.facebook.com/), 注册facebook开发者账号。

2.创建应用

  • 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.在项目中新建名称为FrameworksGroup
  • 2.打开下载的SDK的目录 ~/Documents/FacebookSDK
    并拖拽
    Bolts.framework
    FBSDKCoreKit.Framework,
    FBSDKLoginKit.Framework,
    FBSDKShareKit.Framework

    到项目的Frameworks组中。在拖拽选项中选择Copy items if neededCreate 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,此时要要连接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.打开Keychain(很重要)

Xcode8iOS 10 的情况下,还需要做一步操作,那就是打开Keychain
在Xcode左侧导航栏最上面,点击“项目名称”,在右侧面板中选择Capabilities,在下面找到Keychain Sharing,点击ON按钮。

Keychain.png
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.mAppdelegate.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的登陆按钮。
Facebook登录按钮
  • 3.点击登录按钮,就会跳转到登录界面:
facebook登录页面

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审核通过,至于如何审核,请看下面的审核流程!

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,613评论 4 59
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 22,958评论 8 183
  • 生活不如意之处十之八九,没有一帆风顺的人生,好多的不幸运都是我们打脑里臆想出来的一些困扰自己的情绪。 如果你正在不...
    金丫丫阅读 82评论 0 1
  • 刚听闻你去世的消息,已经过去了一个月,那时我刚巧在和朋友逛街,开心的吃吃喝喝,收到弟弟打来的电话。开始楞着不知如何...
    9807115ff8e3阅读 246评论 0 0
  • 1.绘制线稿,先画一张模糊的吉娃娃的线稿 2.从内层叶片开始上色,先用玫瑰花色和足量水调和,从叶尖开始上色。然后将...
    桔纱阅读 918评论 5 15