如何在 iOS 应用中及时登录 Facebook
Posted
技术标签:
【中文标题】如何在 iOS 应用中及时登录 Facebook【英文标题】:How to login just in time to facebook in iOS app 【发布时间】:2012-09-07 03:15:06 【问题描述】:已经查看了how to integrate facebook with ios 上的 facbook 页面,但我一直在寻找的是有点不同。
我想仅在用户决定共享内容时提示 Facbook 登录,FB 文档中解释的流程通过如何登录(处理来自 FB 登录的异步响应)并显示发布按钮,但我们需要的是显示“发布到 FB”按钮,当用户点击时,我希望用户登录,然后转到将要发布的内容的预览,然后发布到 FB。
我使用的是FB SDK和iOS 5,难点是如何将FB登录流直接连接到Post流。
谢谢 埃兰戈
【问题讨论】:
简单,教程中在applicationDidFinishLaunchingWithOptions
、viewDidLoad
等中完成的任何事情。把它放在你的分享动作中。
当我发现用户第一次尝试发帖时,我将用户重定向到 FB Auth,但是一旦我重新获得控制权,我想继续使用新视图,但是我没有得到控制,没有调用 viewDidLoad。 DecisionAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; [appDelegate openSessionWithAllowLoginUI:YES];
【参考方案1】:
下面是我编写的一些代码。如果用户尚未从设备设置登录 Facebook,则只需拨打openActiveSessionWithPublishPermissions:
即可获得更好的用户体验,这一步即可完成读取和发布权限。否则,您只需依次执行这两个权限。一旦读取权限成功,您就执行发布权限。
我使用 Facebook SDK 3.2.1 在 iOS6 和 iOS5 设备上测试了这段代码
- (BOOL)hasFacebookInDeviceSettings
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"];
BOOL hasFacebookBuiltinAccount = (accountTypeFB != nil);
return hasFacebookBuiltinAccount;
- (BOOL)hasLoggedInToFacebookInDeviceSettings
if (![self hasFacebookInDeviceSettings])
return NO;
BOOL result = [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook];
return result;
- (void)openFacebookSessionWithAllowLoginUI:(BOOL)allowLoginUI
if (![self hasLoggedInToFacebookInDeviceSettings])
// Simpler if we don't have the built in account
[FBSession openActiveSessionWithPublishPermissions:@[@"publish_actions"]
defaultAudience:FBSessionDefaultAudienceFriends
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error)
[self facebookSessionStateChanged:session
state:state
error:error];
];
else if (!FBSession.activeSession.isOpen)
__block BOOL recursion = NO;
[FBSession openActiveSessionWithReadPermissions:nil
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error)
if (recursion)
return;
recursion = YES;
if (error || !FBSession.activeSession.isOpen)
[self facebookSessionStateChanged:session
state:state
error:error];
else
assert(FBSession.activeSession.isOpen);
if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound)
[FBSession.activeSession requestNewPublishPermissions:@[@"publish_actions"]
defaultAudience:FBSessionDefaultAudienceFriends
completionHandler:^(FBSession *session,
NSError *error)
[self facebookSessionStateChanged:session
state:FBSession.activeSession.state
error:error];
];
];
hasFacebookInDeviceSettings
会在设置中告诉您此设备是否支持 Facebook(即这是 iOS6+)。
hasLoggedInToFacebookInDeviceSettings
告诉您用户是否已从 iOS6 Facebook 设备设置登录到 Facebook。
您需要创建自己的facebookSessionStateChanged:
和其他代码,如login tutorial 中所述
【讨论】:
以上是关于如何在 iOS 应用中及时登录 Facebook的主要内容,如果未能解决你的问题,请参考以下文章
登录并再次授权时如何在iOS SDK中的Facebook应用程序中获取Facebook帐户的更改?
如何使用内置的 facebook 帐户在 IOS 中进行 Facebook 登录?
如何在 fbsdk 登录 React Native 中更改名称应用程序('项目想要使用 facebook.com')iOS