Facebook第三方登录

1.集成并测试facebook

1.注册开发者账号

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

2.创建应用

  • 1.点击 (https://developers.facebook.com/) 右上角的My Apps按钮,在弹出的下拉菜单中,选择Add a New App
Facebook第三方登录_第1张图片
  • 2.选择iOS平台
Facebook第三方登录_第2张图片
  • 3.输入APP的名称,选择Create New Facebook App ID
Facebook第三方登录_第3张图片
  • 4.选择APP类别,点击创建应用编号。
Facebook第三方登录_第4张图片

3.下载SDK

在该界面中点击按钮下载SDK,或者在
https://developers.facebook.com/docs/ios中下载iOS平台的SDK。

Facebook第三方登录_第5张图片

4.配置APP在facebook中的信息

  • 1.点击右上角My Apps,进入Dashboard界面。
    此时可以看到AppID和AppSecret,记住这两个值,之后要用到。(如果AppSecret是加密的话,点击旁边的show即可看到值)
Facebook第三方登录_第6张图片
  • 2.点击Dashboard左边的Settings选项,点击+ Add Platform

Facebook第三方登录_第7张图片


  • 3.选择iOS平台。

Facebook第三方登录_第8张图片


  • 4.输入Bundle ID。
  • 5.设置Single Sign(单点登录)为on。
  • 6.选择是否打开自动记录 iOS 应用内购买事件(选填)
  • 7.点击保存Save Changes

Facebook第三方登录_第9张图片


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中...
CFBundleURLTypes

  
  CFBundleURLSchemes
  
    fb{your-app-id}
  
  

FacebookAppID
{your-app-id}
FacebookDisplayName
{your-app-name}

将 fb{your-app-id} 替换为 Facebook 应用编号,加上前缀 fb。例如,fb123456。您可以通过 Facebook 应用面板找到应用编号。

使用应用编号替换 {your-app-id}

使用您在应用面板中指定的显示名称替换 {your-app-name}

5.2.Facebook加入网络白名单
  • iOS9要配置App Transport Security,把Facebook加入白名单,打开Info.plist,添加以下片段。
NSAppTransportSecurity

    NSExceptionDomains
    
        facebook.com
        
            NSIncludesSubdomains
            
            NSThirdPartyExceptionRequiresForwardSecrecy
            
        
        fbcdn.net
        
            NSIncludesSubdomains
            
            NSThirdPartyExceptionRequiresForwardSecrecy
            
        
        akamaihd.net
        
            NSIncludesSubdomains
            
            NSThirdPartyExceptionRequiresForwardSecrecy
            
        
    

5.3.设置应用跳转白名单
  • 如果使用了facebook的登陆分享功能,需要跳转到facebook的APP,同样也要在.plist文件中处理一下。
LSApplicationQueriesSchemes

  fbapi
  fb-messenger-api
  fbauth2
  fbshareextension

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 

- (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按钮。

Facebook第三方登录_第10张图片
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 
- (void)applicationDidBecomeActive:(UIApplication *)application {
  [FBSDKAppEvents activateApp];
}

swift代码:

func applicationDidBecomeActive(application: UIApplication) {
    FBSDKAppEvents.activateApp()
}

10.测试登陆

1.导入头文件

swift项目中,在桥接文件中添加导入头文件代码。如果是objc的话,在你的ViewController.mAppdelegate.m中导入头文件。

#import 
#import 
2.添加相应代码
  • 1.在ViewController.swift中的viewDidLoad方法中添加以下代码:
let loginBtn: FBSDKLoginButton = FBSDKLoginButton()
loginBtn.center = self.view.center
view.addSubview(loginBtn)
  • 2.现在编译并运行你的APP,就可以看到facebook的登陆按钮。
Facebook第三方登录_第11张图片
Facebook登录按钮
  • 3.点击登录按钮,就会跳转到登录界面:
Facebook第三方登录_第12张图片
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审核通过,至于如何审核,请看下面的审核流程!

参考

  • 创建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

你可能感兴趣的:(Facebook第三方登录)