title: ios-facebook接入 categories: Ios tags: [ios, facebook] date: 2021-02-13 23:31:18 comments: false mathjax: true toc: true

ios-facebook接入

前篇

    官方 GitHub - https://github.com/facebook/facebook-ios-sdkGet Started - Facebook SDK for iOS - https://developers.facebook.com/docs/facebook-login/ios/v2.2?locale=zh_CN&sdk=cocoapods CocoaPods 方式引入 - https://developers.facebook.com/docs/ios/componentsdks#cocoapods, https://developers.facebook.com/docs/ios/use-cocoapods 登录 - https://developers.facebook.com/docs/ios/use-facebook-login用户数据 - https://developers.facebook.com/docs/ios/get-user-data分享 - https://developers.facebook.com/docs/ios/share-photos

facebook 接入

pod 'FBSDKCoreKit', '~> 9.0.1' pod 'FBSDKLoginKit', '~> 9.0.1' pod 'FBSDKShareKit', '~> 9.0.1' /Users/XXX/Library/Developer/Xcode/DerivedData/Build/Products<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> <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> // 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; } // 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]; } #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