我有一个应用程序仍然使用已弃用的 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];