一旦用户的Facebook访问令牌因任何原因无效(从Facebook网站删除应用程序或从Facebook设置中删除应用程序的访问权限),无论我做什么,我都无法获得新的令牌!
到目前为止,我已经尝试了两种方法:( sharedFaceBookManager是管理Facebook的Singleton)
1)[sharedFaceBookManager.facebook extendAccessToken]
;
这项工作首次发生“失效”,应用程序将打开FB的应用程序并提示用户输入所需的任何内容并返回App Safe和声音......第二次访问令牌无效,extendAccessToken只会挂在那里,用户将无法再通过Facebook登录。 Not a good Solution
。
2)尝试删除Cookie,断开Facebook连接并重新连接!
for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
if([[cookie domain] isEqualToString:@"facebook"]) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
}
// Reconnecting:
NSArray *permissions = [NSArray arrayWithObjects:@"email", @"read_friendlists", @"user_photos", @"user_events", nil];
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error) {
[[EWFacebookManager sharedFaceBookManager] sessionStateChanged:session state:state error:error];
}];
此仅返回对- (void)sessionStateChanged: with:FBSessionStateOpen
的呼叫和应用程序交易,就像登录成功一样,结果:ENDLESS LOOP(登录成功 - 登录失败)NOT A GOOD SOLUTION!
我知道当令牌无效时我不应该调用extendAccessToken,我应该提示用户再次登录
ANYBODY?请?我们甚至转向一家外包公司来帮助我们解决这个问题,并且没有任何突破!
答案 0 :(得分:5)
解决!!!
因此,结论:您无法扩展无效的Facebook访问令牌。相反,您应该通过您的FBSession清理您的AccessToken并续订您的Facebook凭证。
这是我的代码(“无效的fb令牌”将调用“renewFacebookCredentials”,然后“facebookReconnect”将被执行):
- (void)facebookReconnect
{
NSArray *permissions = [NSArray arrayWithObjects:@"email", @"read_friendlists", @"user_photos", @"user_events", nil];
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error) {
[[EWFacebookManager sharedFaceBookManager] sessionStateChanged:session state:state error:error];
}];
}
+ (void)renewFacebookCredentials
{
[FBSession.activeSession closeAndClearTokenInformation];
[FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result,
NSError *error)
{
[[EWFacebookManager sharedFaceBookManager] facebookReconnect];
}];
}
我希望这可以帮助一些失去的灵魂并防止对新的Facebook iOS SDK及其“弱”文档产生更多的仇恨;-)
埃尔南
答案 1 :(得分:0)
你应该像这样编码,
1)此代码将在用户登录完成后执行...(如果它在appdelegate中的位置意味着,这是一个好主意)
if( SYSTEM_VERSION_LESS_THAN(@"6.0"))
[[self facebook] extendAccessTokenIfNeeded];
else
if( [[FBSession activeSession] respondsToSelector:@selector(handleDidBecomeActive)])
[FBSession.activeSession handleDidBecomeActive];
2)当你调用facebook时,你应该验证会话,否则会导致错误。代码应该:
if (![[self.appDelegate facebook] isSessionValid]) {
NSArray *permissions = [[NSArray alloc] initWithObjects:@"offline_access", nil];
[[self.appDelegate facebook] authorize:permissions];
[permissions release];
}