如何在 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流。

谢谢 埃兰戈

【问题讨论】:

简单,教程中在applicationDidFinishLaunchingWithOptionsviewDidLoad等中完成的任何事情。把它放在你的分享动作中。 当我发现用户第一次尝试发帖时,我将用户重定向到 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 应用中使用 Facebook 实现登录

登录并再次授权时如何在iOS SDK中的Facebook应用程序中获取Facebook帐户的更改?

如何使用内置的 facebook 帐户在 IOS 中进行 Facebook 登录?

如何在 fbsdk 登录 React Native 中更改名称应用程序('项目想要使用 facebook.com')iOS

Facebook 登录在 Twitter iOS 应用程序中不起作用

如何通过 Facebook 应用登录我的 ios 应用?