Facebook iOS SDK extendAccessToken无法正常工作 - 未调用fbDidExtendToken

时间:2013-05-20 13:19:07

标签: ios facebook facebook-ios-sdk facebook-login facebook-access-token

一旦用户的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?请?我们甚至转向一家外包公司来帮助我们解决这个问题,并且没有任何突破!

2 个答案:

答案 0 :(得分:5)

解决!!!

因此,结论:您无法扩展无效的Facebook访问令牌。相反,您应该通过您的FBSession清理您的AccessToken并续订您的Facebook凭证。

  • 首先,我断开与Facebook的联系并清理我的令牌数据。
  • 然后我为FBSession更新我的凭据
  • 最后,我尝试通过打开新的活动会话来重新连接。

这是我的代码(“无效的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];
        }