4

我有一个应用程序仍然使用已弃用的 Facebook 类与 Facebook 连接。如果我在没有扩展权限的情况下授权,一切正常。但是,如果我确实包含权限,那么第一次授权的往返总是会失败(即使它获得了有效的令牌!)。我错过了一步吗?

这是为应用程序启动 Facebook 授权的代码

- (IBAction) doConnect:(id)sender
{
    NSArray* permissions = [NSArray arrayWithObjects:
                            @"email",@"publish_actions",nil];
    [self.facebook authorize:permissions];
}

这是在用户授予权限并将控制权返回给我的应用程序后调用的代码。该 url 总是包含一个漂亮的令牌,即使是第一次通过。

// handle the incoming url from app switching
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [self.facebook handleOpenURL:url];
}

这是连接成功后调用的 FBSessionDelegate 方法。尽管上面的 url 包含一个令牌,但我们第一次到达这里时它就消失了。但是如果我调用上面的 doConnect 方法,当我们到达这里时,令牌就会出现。

// FBSessionDelegate
- (void)fbDidLogin
{
    if( [self.facebook accessToken] == nil )
    {
        NSLog(@"Had an access token above, but not now!");

        // If I reinvade the doConnect: method again, it will work!!!
    }
    // ...

}

深入查看 FBSession.m 中的 sdk 代码,似乎请求的权限第一次没有与新令牌相关联,导致会话忽略新令牌。第一次通过时,cachedPermissions 始终是一个空列表

    // get the cached permissions, and do a subset check
    NSArray *cachedPermissions = [tokenInfo objectForKey:FBTokenInformationPermissionsKey];
    BOOL isSubset = [FBSession areRequiredPermissions:permissions
                                 aSubsetOfPermissions:cachedPermissions];
4

3 回答 3

3

您要求两种类型的权限,读取类型(电子邮件)和写入类型(publish_actions)。

您应该使用最新的 Facebook SDK,v3.1.1,并且您必须分开读取和写入 - 特别是如果您希望支持 iOS6。您最初只能请求读取。请参阅https://developers.facebook.com/docs/tutorial/iossdk/upgrading-from-3.0-to-3.1/中的注释以及分别请求读取和写入的部分。

于 2012-12-15T01:58:35.510 回答
0

对于 Facebook SDK 3.1,使用 [FBSession activeSession] 的

reauthorizeWithPublishPermissions: defaultAudience:completionHandler:

对于 Facebook SDK 3.2,使用 [FBSession activeSession] 的

requestNewPublishPermissions: defaultAudience:completionHandler:
于 2014-03-18T07:51:23.270 回答
0

我们可以在单个请求中授权用户。它不需要两次尝试。为此,我们需要做的是“我们需要先请求发布许可”。调用下面的方法

let fbLoginMngr =  FBSDKLoginManager();
fbLoginMngr.logOut()
fbLoginMngr.logInWithPublishPermissions

它将首先询问个人资料详细信息,然后询问请求的发布权限。一旦我们收到回调,我们就会查询 Graph api 以提取配置文件数据,如下所示。

let fbRequest = FBSDKGraphRequest(graphPath:"me",    parameters:self.FB_REQ_PARAMS);
                fbRequest.startWithCompletionHandler { (connection : FBSDKGraphRequestConnection!, result : AnyObject!, error : NSError!) -> Void in
                    if error == nil {
                        debugPrint(result)
                    } else {
                        handleError(error)
                    }
                }
于 2016-07-22T05:08:10.203 回答