Ios Facebook SDK 3.1-验证访问令牌时出错

Ios Facebook SDK 3.1-验证访问令牌时出错,ios,facebook,ios6,facebook-ios-sdk,facebook-sdk-3.1,Ios,Facebook,Ios6,Facebook Ios Sdk,Facebook Sdk 3.1,我正在尝试将我的应用程序转换到新的Facebook SDK 3.1(支持iOS6身份验证) 我让它工作得很好,因此我决定从FB网站上的授权应用列表中删除该应用,以测试iOS是否会再次请求许可 现在,我对[FBRequestRequestForme]的第一次调用导致以下错误: 答复: { "error": { "message": "Error validating access token: Session does not match current stored session.

我正在尝试将我的应用程序转换到新的Facebook SDK 3.1(支持iOS6身份验证)

我让它工作得很好,因此我决定从FB网站上的授权应用列表中删除该应用,以测试iOS是否会再次请求许可

现在,我对
[FBRequestRequestForme]
的第一次调用导致以下错误:

答复:

{
  "error": {
    "message": "Error validating access token: Session does not match current stored session. This may be because the user changed the password since the time the session was created or Facebook has changed the session for security reasons.",
    "type":"OAuthException",
    "code":190,
    "error_subcode":460
  }
}
一些细节:

我将按如下方式开始本次会议:

   [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

                                           switch (state) {
                                               case FBSessionStateOpen:
                                                   [self presentPostOptions];
                                                   break;

                                               case FBSessionStateClosed:
                                               case FBSessionStateClosedLoginFailed:
                                                   [FBSession.activeSession closeAndClearTokenInformation];
                                                   break;

                                               default:
                                                   break;
                                           }
然后我在状态
FBSessionStateOpen
下被召回(此时iOS还没有显示请求对话框,这是预期的吗)?Facebook记录如下:

2012-09-26 13:43:43.768 MyApp[2177:907] FBSDKLog: FBSession INVALID transition from FBSessionStateCreated to FBSessionStateClosed
2012-09-26 13:43:43.769 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
2012-09-26 13:43:43.837 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateOpen 
一旦会话打开,在presentPostOptions中,我将执行以下操作:

- (void)presentPostOptions
{    
    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
        if (!error) {
            self.usersName = user.name;
            self.usersID = user.id;

            [self getPages];
        }
        else
        {
            [self didFailWithError:error];
        }
    }];
}
-(无效)presentPostOptions
{    
[[FBRequest requestForMe]startWithCompletionHandler:^(FBRequestConnection*连接,NSDictionary*用户,NSError*错误){
如果(!错误){
self.usersName=user.name;
self.usersID=user.id;
[自选网页];
}
其他的
{
[错误:错误];
}
}];
}
在回调上述完成块之前,我的主状态处理程序块将使用
FBSessionStateClosed
状态调用。与此同时,Facebook SDK已经记录了上述错误

我找不到任何方法来重置系统;我也不太明白原因


有人能解释一下吗?

如果您还没有,请尝试按照建议在您的Facebook应用程序中添加iOS应用程序包ID


希望这有帮助。

设备上的Facebook帐户与服务器以及应用程序的/SDK缓存不同步。这可以通过调用ACAccountStore方法renewCredentialsForAccount来解决,该方法将更新操作系统对令牌状态的理解

在SDK的下一次更新中,当SDK从服务器接收到指示令牌无效的响应时,它将自动调用此API。对于SDK的3.1.0版本,应用程序需要显式调用此API。下面是一个代码示例:

ACAccountStore *accountStore;
ACAccountType *accountTypeFB;
if ((accountStore = [[ACAccountStore alloc] init]) &&
    (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
    id account;
    if (fbAccounts && [fbAccounts count] > 0 &&
        (account = [fbAccounts objectAtIndex:0])){

        [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
            //we don't actually need to inspect renewResult or error.
            if (error){

            }
        }];
    }
}
在何处/何时调用API有几个选项。最简单的方法是在应用程序启动或视图加载时,机会主义地进行调用。这种方法的一个问题是,它将导致通常不必要的网络往返。另一个选项是在出现会话更改通知时调用它,指示会话已关闭。此外,许多应用程序在应用程序启动时获取一些基本信息,如graph.facebook.com/me,如果是这样,那么在出现错误响应时调用此方法可能是要求iOS更新其令牌状态的合理位置


希望这有帮助

我相当肯定这是一个Facebook iOS SDK错误(即使是在3.1.1版上),我已经提交了文件


在尝试使用示例应用Scrumpious复制此错误时,我发现如果您使用的是
openActiveSessionWithReadPermissions
,它允许您成功地重新授权。但是,如果您通过
openActiveSessionWithPublishPermissions
请求发布权限,它将被困在
com.facebook.sdk.error 5

中,我将提供另一项检查,这将导致我浪费3个小时: 如果您试图使用非应用开发者FB用户登录,请确保您的FB应用设置未启用“沙盒”选项。。。
可能是显而易见的,但希望能为其他人节省几个小时。

在facebook SDK 3.7.1中,我仍然存在这个问题。基本上,我已经决定在这种情况发生时从facebook缓存中清除令牌。像这样:

if(state == FBSessionStateClosed ) {
     [FBSession.activeSession closeAndClearTokenInformation];
}

简单Swift 2+解决方案用于Facebook验证访问令牌时出错

// Step 1: Logout 
FBSDKLoginManager().logOut()

// Step 2: Login
FBSDKLoginManager().logInWithReadPermissions(["public_profile", "email"], fromViewController: self, handler: { result, error -> Void in 

// ...

}

如果出现此错误,您必须创建新的Facebook会话,因此您必须再次登录。

我遇到了与您描述的完全相同的问题,今天刚刚更新为3.1。即使卸载应用程序也无济于事我没有尝试卸载,因为我特别不想做一些可能使它重新开始工作的事情:)我真的很想找到一个编程解决方案,这样我的用户就不会陷入这种境地。无论如何,很有意思的是,它并不能解决这个问题。当您仅在iOS6设备/模拟器中运行时,会发生这种情况吗?它在iOS5上工作吗?嗨。这是在真实设备上运行的iOS6上发生的。在这个阶段,我没有测试过其他任何东西。请注意,在我从Facebook上删除应用程序的权限之前,它一直工作得很好,所以我认为这让iPhone的内部状态变得一团糟,我不知道如何重置它。至少可以说这是令人沮丧的——我的用户正在等待更新。正如tarmes在真实设备中所说的一样。在iOS5上,它可以工作,因为如果你从Facebook上删除应用权限,你只需要重新授权该应用(因此你被重定向到safari或fb应用,你只需要按照预期再次允许该应用)。我只是仔细检查了一下,确认输入的都是正确的-是的,所以这不是问题所在。我也有同样的问题,并且在检查成功后立即进行了检查。证明。这当然有帮助!我们正在开发一个dot版本,修复的bug数量有限。应该不会太远。关于信息,我可以确认这确实解决了问题。现在我正在等待SDK更新,以便在正确的位置完成。嗨,Jason。我已经安装了3.1.1并删除了上面的临时补丁。不幸的是,新的SDK没有解决这个问题。我已经找到了问题所在-我们能在什么地方讨论一下吗?@JasonClark-我正在使用3.1.1,并且遇到了各种与此相关的问题。一种特殊情况是,如果用户从iOS设置中删除其FB帐户,则应用程序/SDK仍然认为他们拥有有效的令牌。令牌可能有效,但如果用户从设置中删除了他们的帐户,则继续使用它似乎是错误的。那么,如果他们在中添加一个不同的FB帐户呢
// Step 1: Logout 
FBSDKLoginManager().logOut()

// Step 2: Login
FBSDKLoginManager().logInWithReadPermissions(["public_profile", "email"], fromViewController: self, handler: { result, error -> Void in 

// ...

}