Facebook第三方登录

作者: 牧晓逸风 | 来源:发表于2016-03-01 23:50 被阅读46108次

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

参考

相关文章

网友评论

  • f767a11768e3:点击分享按钮后,出现不了safari登录界面,在iPhone5c就可以,其他手机不可以报错:
    Warning: Attempt to present <FBSDKContainerViewController: 0x1012db350> on <UIViewController: 0x1012189d0> whose view is not in the window hierarchy!
    这是什么原因呀?
  • 陈藩:请问我一点击登录 就爆出这样的错误: fbxxxxxxxxxx    is not registered as a URL scheme. Please add it in your Info.plist' 但是我在Info里面也加入了。而且加入之后 在Target 的info里面看不到,在左边的info里面可以看到。
    牧晓逸风:检查加入的内容是否有误,在target的info里面也是可以看得到的
  • 陈藩:- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [[FBSDKApplicationDelegate sharedInstance] application:application
    openURL:url
    sourceApplication:sourceApplication
    annotation:annotation
    ];
    }
    关于这行代码,谷歌登录也有同样的设置怎么处理呢?
    陈藩:@kangxx 谢谢
    扛支枪:BOOL fb = [[FBSDKApplicationDelegate sharedInstance] application:application
    openURL:url
    sourceApplication:sourceApplication
    annotation:annotation
    ];
    BOOL google = 谷歌;
    fb = fb?fb:google;
    return fb;
    牧晓逸风:没做谷歌登录,建议查看谷歌API
  • 邓凯献:收藏学习了
  • aaa000:我这使用facebook登录的时候,点击登录按钮 在网页上显示 你已授权xxx。 然后点击确定按钮 就刷新到了一个新的空白网页。 左上方有一个【完成】按钮 点击【完成】直接显示取消登录! 请问我是在那个地方设置有问题吗
    c96787cb33a7:我把SDK更新到最新的之后就没这个问题,但是发现在用iPhone测试分享成功后不再返回postID了,请问你有这个问题吗?
    牧晓逸风:又测试了一下,没有遇到这种情况,请好好检查一下白名单设置和URLSchemes。
    f5e06882cf76:请问你这个问题解决了吗?我现在也是登录之后一片空白没办法跳转
  • ad193b2e3cf5:你好,有OC的demo吗?还有我这边第一次登录的时候可以登录成功,但是登录过一次后本地保存了token,再用token的时候就会出现token失效。请问这是什么原因造成的呢?是不是fields的参数问题呢
  • 3d9f86278469:请问Android版本,语言可以设置吗?
  • 初入云门:楼主您好,这个用户的图像的url具体是怎么获取到 这个显示是一个字符串的不是一个网址
    初入云门:我自己搞迷了,找到了感谢楼主
  • c96787cb33a7:请问怎么可以拿facebook好友的id?
    牧晓逸风:获取相应的权限:"user_friends",参考:https://developers.facebook.com/docs/facebook-login/permissions/#reference-pages_show_list
  • 一枚霉:facebook 新sdk的分享是不是也拉不起app 只能到网页? 博主可以从哪里知道facebook新版sdk不支持客户端的? 我也好给我们项目经理交代
  • Flora_HAHA:请问 -canOpenURL: failed for URL: "fbauth2:/" - error: "未能完成操作。添加了白名单也有这个错误是什么原因
    Flora_HAHA:@牧晓逸风 谢谢
    Flora_HAHA:@牧晓逸风 添加了 已经找到原因 真机测试 appdelegate.m文件里 这两个方法 走一个- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
    - (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;
    牧晓逸风:@哈哈秦 是否添加了 schema
  • d83b1a9a55db:请问博主,在没有安装facebook的情况下,我这个每次点击facebook登录就会直接跳转到授权,无法再次切换账号,我在登录的时候调用的logout,但是下一次登录的时候还是直接跳转到授权
    灵儿菇凉:请问你解决了吗
    灵儿菇凉:@牧晓逸风 这样貌似没有用,
    牧晓逸风:@浅忆微凉iOS 需要进入 Safari 浏览器登录facebook,然后点击退出账号。再次使用应用登录测试试试
  • UASHS:请问博主,我这授权之后回调一直 提示用户取消登录 是什么情况啊
  • 信以为真:你好,我按照你的整合,整合到第七步,编译就报错啦
    linker command failed with exit code 1 (use -v to see invocation)

    那两个方法不写就没事
    牧晓逸风:@信以为真 由于Facebook框架版本升级,需要再添加一个框架Bolts.framework
  • 木木光: 你好, @牧晓逸风 关于这个请求,我请求不到,,birthday 是为什么啊。 其他的个人 信息都能拿到。。。就birthday那边 返回为空, 请问有拿到过啊嘛。
  • 秘制鸭腿:你好,请问我这边只能实现网页登陆,不能够跳转到facebook应用登陆?可以解决吗?
    牧晓逸风:@秘制鸭腿 根本原因是Facebook SDK升级的原因,以前是可以打开客户端的,大版本升级之后就不让打开客户端了,只能走网页授权
    秘制鸭腿:@牧晓逸风 我哭晕在厕所,多谢回复、好像iOS9以下还是可以吗?
    牧晓逸风:@秘制鸭腿 Facebook 最新的SDK不支持客户端登录,只能网页授权登录

本文标题:Facebook第三方登录

本文链接:https://www.haomeiwen.com/subject/yrknkttx.html