ios-facebook接入
ios-facebook接入
前篇
- 官方
- GitHub - https://github.com/facebook/facebook-ios-sdk
- Get Started - Facebook SDK for iOS - https://developers.facebook.com/docs/facebook-login/ios/v2.2?locale=zh_CN&sdk=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 接入
在 facebook 后台 配置 ios 平台, 获取 fb appid
- store id 可以先随便找一个已存在的填入进去.
CocoaPods 引入几个核心库
1
2
3pod 'FBSDKCoreKit', '~> 9.0.1'
pod 'FBSDKLoginKit', '~> 9.0.1'
pod 'FBSDKShareKit', '~> 9.0.1'pod 工程构建出 静态库丢到
/Users/XXX/Library/Developer/Xcode/DerivedData/Build/Products
对应 真机/模拟器 的目录下, 然项目工程编译时可以链接到静态库
在 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>- [APP_ID] 替换 fb appid.
- [APP_NAME] 替换为 app 名.
代码
在 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;
}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];
}登录, 登出, 获取用户信息, 展示 登录页面
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 中文语言 情况下, 才会点不了 打开 按钮, 切换成英文语言则没有问题.