0

这是我第一次使用 Facebook SDK,所以登录/权限流程可能不正确,尽管我遵循了 Facebook 教程。我的应用程序只需要在墙上分享,我使用的是 SDK 3.2.1。

每次用户点击共享按钮时,我都会使用+ (BOOL)openActiveSessionWithReadPermissions:(NSArray*)readPermissions allowLoginUI:(BOOL)allowLoginUI completionHandler:(FBSessionStateHandler)handler方法登录。

第一次要求电子邮件/密码组合。我面临的问题是它之后不会重用存储的令牌:

  • 如果存储了令牌(用户之前登录到 Facebook),应用程序将使用“您已授权的应用程序名称”请求权限,然后它很可能会在共享时再次询问。

  • 如果openActiveSessionWithReadPermissions第二次调用,它不会要求任何权限。

  • 第三次调用它会再次询问。

我发现会话正在自动关闭,但我不知道为什么。完成处理程序显示如何FBSessionStateClosed在之前接收到FBSessionStateOpen。我想这就是 Facebook SDK 每隔一段时间就请求批准的原因。

完成块会话关闭 完成块会话打开

这 2 条跟踪来自第二次openActiveSessionWithReadPermissions调用(您可以看到会话是如何关闭和再次打开的)。下次调用该方法时,它只会收到一个关闭的会话,并会询问“已授权”屏幕。

我的代码有点像下面:

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    return [FBSession openActiveSessionWithReadPermissions:nil
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session,
                                                             FBSessionState state,
                                                             NSError *error) {
                                             [self sessionStateChanged:session
                                                                 state:state
                                                                 error:error];
                                         }];
}

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                // We have a valid session
                NSLog(@"User session found");
            }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }

    [[NSNotificationCenter defaultCenter]
     postNotificationName:FBSessionStateChangedNotification
     object:session];
}

我希望有人可以帮助解决这个问题,我很沮丧。

4

0 回答 0