Facebook iOS SDK:使用权限授权需要2次尝试

时间:2012-11-21 16:00:14

标签: ios facebook-ios-sdk

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

这是启动Facebook授权的代码

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

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

// 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];

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

reauthorizeWithPublishPermissions: defaultAudience:completionHandler:

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

requestNewPublishPermissions: defaultAudience:completionHandler:

答案 2 :(得分: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)
                    }
                }