iOS - Facebook SDK allowLoginUI 不起作用

Posted

技术标签:

【中文标题】iOS - Facebook SDK allowLoginUI 不起作用【英文标题】:iOS - Facebook SDK allowLoginUI not working 【发布时间】:2014-07-23 07:07:01 【问题描述】:

我正在尝试使用以下代码从 facebook 获取基本用户信息

- (void)viewDidLoad

    [super viewDidLoad];

    if(![[FBSession activeSession] isOpen])
        NSLog(@"Creating new session");
        [FBSession openActiveSessionWithPermissions:nil
                                       allowLoginUI:NO
                                  completionHandler:^(FBSession *session, FBSessionState state, NSError *error)      
                                      [self makeRequestForUserData];                         
                                  ];
    else

    


- (void) makeRequestForUserData

    [FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
        if (!error) 
            NSLog(@"user info: %@", result);
            [self.txtDetails setText: [result string]];
            //[[FBSession activeSession] closeAndClearTokenInformation];
         else 
            NSLog(@"error %@", error.description);
        
    ];

当 closeAndClearToken 被注释并且 allowLoginUI 设置为 NO 或 YES 时没有发生错误并且我得到数据,问题是是否有人登录到 fb,我得到最后一个登录用户的数据。当我取消注释 closeAndClearToken 我收到以下错误:

错误 = 代码 = 2500; message = "必须使用活动访问令牌来查询有关当前用户的信息。"; 类型 = OAuthException; ;

【问题讨论】:

您是否在 facebook 上注册了您的应用程序? @BogdanSomlea 是的,我做到了 所以我没想到会这样,但问题是,我在 viewDidLoad 中编写了这段代码并将其放入 viewDidAppear 工作正常。 因为在 viewDidLoad 中,你的 activeSession 状态,如果你刚刚创建了会话,它还没有打开。这一切的发生都是因为 openActiveSession 在不同的线程上运行并且还没有被带回主线程 请将此问题标记为已解决 【参考方案1】:

这是一个类方法,带有completionHandler,您将在其中获取用户。只要在任何地方调用这个方法,它应该可以工作,如果你在 facebook 上设置你的应用程序。

 + (void)requestFacebookDataWithCompletionHandler:(void (^)(NSDictionary *))handler 

// If the session state is any of the two "open" states when the button is clicked
if (FBSession.activeSession.state == FBSessionStateOpen
    || FBSession.activeSession.state == FBSessionStateOpenTokenExtended) 
    [FBSession.activeSession closeAndClearTokenInformation];
    if (handler) 
        handler(nil);
    
    // If the session state is not any of the two "open" states when the button is clicked
 else 
    // Open a session showing the user the login UI
    // You must ALWAYS ask for public_profile permissions when opening a session
    [FBSession openActiveSessionWithReadPermissions:@[@"public_profile",@"email"]
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session, FBSessionState state, NSError *error) 
         [[FBRequest requestForMe] startWithCompletionHandler: ^(FBRequestConnection *connection,
                                                                 NSDictionary<FBGraphUser> *user,
                                                                 NSError *error) 
             if (!error) 
                 if (handler) 
                     handler(user);
                 
             

         ];
         DAppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
         [appDelegate sessionStateChanged:session state:state error:error];
     ];

您还必须在 AppDelegate 中添加一些方法;但你会在那里找到这些方法: https://developers.facebook.com/docs/facebook-login/ios/v2.0 。希望它会工作

【讨论】:

我现在得到的错误是:对端点“我”的请求出错:必须为调用此端点指定一个打开的 FBSession。

以上是关于iOS - Facebook SDK allowLoginUI 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Facebook SDK:在IOS7上无法完成操作(com.facebook.sdk错误2)

Facebook SDK 错误 Domain=com.facebook.sdk Code=5 在 ios 中获取好友列表时

facebook-ios-sdk 是不是使用 iOS 6 Facebook 集成来支持登录而不打开本机 Facebook 应用程序?

无法在 Xcode 3.2.6 上为 iOS 构建 Facebook SDK

iOS Facebook SDK:哪个登录系统更好?

facebook-ios-SDK 问题