ios-facebook接入

ios-facebook接入


前篇


facebook 接入

  1. 在 facebook 后台 配置 ios 平台, 获取 fb appid

    • store id 可以先随便找一个已存在的填入进去.
  2. CocoaPods 引入几个核心库

    1
    2
    3
    pod 'FBSDKCoreKit', '~> 9.0.1'
    pod 'FBSDKLoginKit', '~> 9.0.1'
    pod 'FBSDKShareKit', '~> 9.0.1'
    • pod 工程构建出 静态库丢到 /Users/XXX/Library/Developer/Xcode/DerivedData/Build/Products 对应 真机/模拟器 的目录下, 然项目工程编译时可以链接到静态库

  3. info.plist 文件的 <dict>...</dict> 内加入配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <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>

    <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>
    1. [APP_ID] 替换 fb appid.
    2. [APP_NAME] 替换为 app 名.
  4. 代码

    1. 在 app 启动完后初始化 sdk

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      // AppDelegate.m  
      @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<UIApplicationOpenURLOptionsKey, id> *)options{
      [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url options:options];
      return YES;
      }
    2. iOS 13 将打开网址的功能移到了 SceneDelegate 中

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      // SceneDelegate.m
      #import <FBSDKCoreKit/FBSDKCoreKit.h>

      @import FacebookCore;

      @implementation SceneDelegate

      - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts{
      UIOpenURLContext *context = URLContexts.allObjects.firstObject;
      [FBSDKApplicationDelegate.sharedInstance application:UIApplication.sharedApplication
      openURL:context.URL
      sourceApplication:context.options.sourceApplication
      annotation:context.options.annotation];
      }
    3. 登录, 登出, 获取用户信息, 展示 登录页面

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      #import "FBHelper.h"

      #import <FBSDKCoreKit/FBSDKCoreKit.h>
      #import <FBSDKLoginKit/FBSDKLoginKit.h>

      @implementation FBHelper

      static FBHelper *_sharedIns = nil;
      +(instancetype) shareInstance {
      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
      _sharedIns = [[self alloc] init] ;
      }) ;

      return _sharedIns ;
      }

      -(void)showLoginBtn:(UIView*)view{
      FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
      loginButton.center = view.center;
      [view addSubview:loginButton];
      }

      -(void)login:(UIViewController*)vc{
      FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
      [login logInWithPermissions:@[@"publish_actions"]
      fromViewController:vc
      handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
      if (error) {
      NSLog(@"--- login fail, err: %@", error);
      return;
      }

      FBSDKAccessToken* accessToken = [FBSDKAccessToken currentAccessToken];
      if (accessToken) {
      NSLog(@"--- login success, userId: %@, token: %@", accessToken.userID, accessToken.tokenString);
      return;
      }

      NSLog(@"--- login cancel");
      }];
      }

      -(void)logout{
      if ([FBSDKAccessToken currentAccessToken]) {
      NSLog(@"--- has accessToken");
      FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
      [login logOut];
      } else {
      NSLog(@"--- no accessToken");
      }
      }

      -(void)getUserData{
      if ([FBSDKAccessToken currentAccessToken]) {
      if ([FBSDKAccessToken currentAccessToken]) {
      [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me?fields=id,name,token_for_business" parameters:nil]
      startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
      if (!error) {
      NSLog(@"--- fetched success, result: %@", result);
      } else {
      NSLog(@"--- fetched error: %@", error);
      }
      }];
      }
      } else {
      NSLog(@"--- no accessToken");
      }
      }

      @end

踩坑

编译报错: 找不到 swift 相关文件

报错: Undefined symbol: __swift_FORCE_LOAD_$_

原因是因为 sdk 使用了 swift, 而工程配置里没有配置 swift 头文件搜索的路径.

解决办法很简单: 创建一个 swift 文件即可, xcode 会提示创建桥接文件 Create Bridging Header

参考: https://github.com/facebook/react-native-fbsdk/issues/794


拉起 app 登录时点不了 打开 按钮

实际测试, iPhone X 中文语言 情况下, 才会点不了 打开 按钮, 切换成英文语言则没有问题.