我正在尝试将我的应用程序迁移到新的Facebook SDK3.1(支持iOS6身份验证)。
我让它工作得很好,所以我决定从FB网站上的授权应用程序列表中删除该应用程序,以便测试iOS是否会再次请求许可。
现在,我对[FBRequest requestForMe]的第一次调用导致了这个错误:
响应:
{
"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];
}
}];
}在回调上面的完成块之前,我的主状态处理程序块是用一个FBSessionStateClosed状态调用的。同时,Facebook SDK已经记录了上述错误。
我找不到任何方法来重置系统;我也不是真的理解原因。
有没有人能说点什么?
发布于 2012-09-30 00:09:10
设备上的Facebook帐户与服务器以及应用程序/SDK的缓存不同步。这可以通过调用ACAccountStore方法renewCredentialsForAccount来解决,该方法将更新操作系统对令牌状态的理解。
在SDK的下一次更新中,当SDK收到服务端的响应,表示某个token已经失效时,SDK会自动调用此接口。对于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的位置/时间有几个选项。最简单的地方是在应用程序启动或视图加载时进行机会主义调用。这种方法的一个问题是,它将导致通常不必要的网络往返。另一种选择是在发生会话更改通知时调用它,表明会话已关闭。此外,许多应用程序在应用程序启动时获取一些基本信息,如raph.facebook.com/me,如果是这样的话--在出现错误响应的情况下调用此方法可能是请求iOS更新其令牌状态的合理位置。
希望这能有所帮助!
发布于 2012-11-06 19:39:13
我只想贡献另一个让我浪费3个小时的东西:如果你试图以非应用开发者的FB用户登录,请确保你的FB应用程序设置没有打开'Sandbox‘选项……这可能很明显,但希望能为其他人节省几个小时。
发布于 2012-09-29 01:34:49
试着在你的iOS应用程序的settings panel中添加你的Facebook应用程序包ID作为建议的here。
希望这能有所帮助。
https://stackoverflow.com/questions/12601191
复制相似问题