iOS第三方登录 —— Facebook

1、 登录

注册Facebook开发者账号,登录Facebook开发者平台

https://www.facebook.com/login/

2、 创建应用

https://developers.facebook.com/docs/app-events/getting-started-app-events-ios#disable-auto-events官网链接

(1)、在App Dashboard界面,点击“My Apps”, 然后创建一个新应用程序(如果您还没有的话)。然后点击左侧的“Settings(设置) >“基本(Basic以查看具有您的App ID,您的App Secret和有关您的应用程序的其他详细信息的“应用程序详细信息面板” 。

(2)、向下滚动到页面底部,然后点击添加平台。选择iOS,添加您的应用程序详细信息,然后保存更改。

通过添加以下详细信息来设置广告应用程序:

应用程序域(App Domains -提供您的应用程序的Apple App Store URL。

隐私权政策网址(Privacy Policy URL-提供隐私权政策网址。必须公开您的应用。

服务条款URLTerms of Service URL-提供服务条款URL。

平台(Platform -滚动到“设置”面板的底部以添加iOS平台。

3、 设置Xcode开发环境

使用 Cocoapod

1、将下列代码添加到 Podfile 中:

pod 'FBSDKLoginKit'

2、在终端窗口的项目根目录中运行以下命令:

$ pod install

4、 配置应用

1、添加Bundle Identifier

2、启用单一登录

5、 配置项目

配置 Info.plist 文件。

右键点击 Info.plist,然后选择Open As(打开方式) Source Code(源代码)或者文本

将下列 XML 代码片段复制并粘贴到文件正文中 (<dict>...</dict>)。

<key>CFBundleURLTypes</key> 

<array> 

    <dict> 

        <key>CFBundleURLSchemes</key> 

            <array>

                 <string>fb[APP_ID]</string>

             </array> 

       </dict>

 </array>

 <key>FacebookAppID</key> 

<string>[APP_ID]</string>

 <key>FacebookDisplayName</key>

 <string>[APP_NAME]</string>

在 [CFBundleURLSchemes] 键内的 <array><string> 中,将[APP_ID]替换为应用编号。

在 FacebookAppID 键内的 <string> 中,将[APP_ID]替换为应用编号。

在 FacebookDisplayName 键内的 <string> 中,将[APP_NAME]替换为应用名称。

如要使用任何 Facebook 对话框(如登录、分享、应用邀请等)以将您的应用切换至 Facebook 应用,您应用程序的 Info.plist 中还需包含:<dict>...</dict>。

<key>LSApplicationQueriesSchemes</key>

<array>

<string>fbapi</string>

<string>fbapi20130214</string> 

<string>fbapi20130410</string>

<string>fbapi20130702</string> 

<string>fbapi20131010</string>

<string>fbapi20131219</string> 

<string>fbapi20140410</string>

<string>fbapi20140116</string>

 <string>fbapi20150313</string>

<string>fbapi20150629</string> 

<string>fbapi20160328</string>

<string>fbauth</string>

<string>fb-messenger-share-api</string> 

<string>fbauth2</string>

<string>fbshareextension</string>

</array>

若是多个应用使用同一Facebook应用编号

 (1)、添加网址格式后缀(URL Scheme Suffix)

(2)、在添加的两个后缀的应用的.plist添加参数FacebookUrlSchemeSuffix

(3)、修改.plist 文件的URL types 下的Facebook里 URL Schemes

6、 配置App Delegate and Scene Delegate

在 AppDelegate 方法中添加以下代码。此代码会在启动应用时初始化 SDK,并在您执行登录或分享操作时,允许 SDK 处理原生 Facebook 应用产生的结果。

Swift

// AppDelegate.swift

import UIKit

import FBSDKCoreKit

@UIApplicationMain

class AppDelegate:UIResponder, UIApplicationDelegate {

func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { ApplicationDelegate.shared.application( application, didFinishLaunchingWithOptions: launchOptions )

return true

}

func application( _ app:UIApplication, open url:URL, options: [UIApplication.OpenURLOptionsKey :Any] = [:] ) -> Bool {

ApplicationDelegate.shared.application( app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplication.OpenURLOptionsKey.annotation] )

}

}   

Objective C

// AppDelegate.m

#import <FBSDKCoreKit/FBSDKCoreKit.h>

@import FacebookCore;

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];

return YES;

}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(nonnull NSDictionary *)options { [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url options:options]; return YES;

}

iOS 13 将功能移到了 SceneDelegate 中。如果您使用的是 iOS 13,请将以下方法添加到 SceneDelegate 中,以便登录或分享等功能的操作可按照预期运作(若Xcode中删除了SceneDelegate 可不用配置):

Swift

// SceneDelegate.swift

import FBSDKCoreKit

...

func scene(_ scene:UIScene, openURLContexts URLContexts:Set) {

guard let url = URLContexts.first?.url else { return } ApplicationDelegate.shared.application( UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation] )

}   

Objective C

// SceneDelegate.m

#import <FBSDKCoreKit/FBSDKCoreKit.h>

@import FacebookCore;

@interface SceneDelegate ()

@end

@implementation SceneDelegate

- (void)scene:(UIScene *)scene openURLContexts:(NSSet *)URLContexts {

UIOpenURLContext *context = URLContexts.allObjects.firstObject; [FBSDKApplicationDelegate.sharedInstance application:UIApplication.sharedApplication openURL: context.URL sourceApplication:context.options.sourceApplication annotation:context.options.annotation];

}  

7、 将登录功能添加到代码里

1、 在您的应用中使用 Facebook 登录按钮

将 Facebook 登录功能添加到代码中

要向应用添加具有 Facebook 品牌标识“登录”按钮,请将下列代码片段添加至视图控制器。

// Swift //

// 将下列代码添加到文件的头文件中,例如:在 ViewController.swift 中导入FBSDKLoginKit

// 将下列代码添加到正文类

ViewController:UIViewController {

       override func viewDidLoad() {

            super.viewDidLoad()

             let loginButton = FBLoginButton()

             loginButton.center = view.center

           view.addSubview(loginButton)

      }

}

// Objective-C //

// 将下列代码添加到文件的头文件中,例如:在 ViewController.m 中

// 在 #import "ViewController.h" 之后

#import <FBSDKCoreKit/FBSDKCoreKit.h>

#import <FBSDKLoginKit/FBSDKLoginKit.h>

// 将下列代码添加到正文:

@implementation ViewController

- (void)viewDidLoad {

       [super viewDidLoad];

       FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];

      // Optional: Place the button in the center of your

       view. loginButton.center = self.view.center; [self.view addSubview:loginButton];

}

@end

此时,您应该能运行应用并使用 Facebook“登录”按钮登录。

2、 自定义“按钮”登录

使用登录管理工具类 (FBSDKLoginManager) 和自定义按钮 (UIButton)调用“登录”对话框

//Swift

let loginManager  = LoginManager()

loginManager.logIn(permissions: ["public_profile"], from: self) { (result, error) in

guard error == nil else { return }

if result?.isCancelled == true {

return GoosPKHUD.shared().showInfoMessage(message: "用户取消了登录".localized)

}

// Objective-C //

 FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];

  [login

    logInWithReadPermissions: @[@"public_profile"]

          fromViewController:self

                     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {

    if (error) {

      NSLog(@"Process error");

    } else if (result.isCancelled) {

      NSLog(@"Cancelled");

    } else {

      NSLog(@"Logged in");

    }

  }];

推荐阅读更多精彩内容