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

    参考

    相关文章

      网友评论

      • Notqualified:点击分享按钮后,出现不了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