我有一个应用仍然使用已弃用的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];
答案 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)
}
}