我正在使用 Facebook SDK 3.1.1 在我的 iOS 应用程序中实现 FB Connect。在简单的情况下,无论是使用新的 FB 集成(在 iOS 上登录)还是通过 Web 视图返回到正常授权(在这两种情况下我都没有安装本机 Facebook 应用程序),这都可以正常工作。
当我在 iOS 级别切换帐户时会出现此问题。使用不同的 FB 用户帐户注销和登录。
要登录/授权,我执行:
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
如果然后每次都会得到 FBSessionStateClosedLoginFailed 即使我执行closeAndClearTokenInformation
当达到该状态时:
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
{
NSLog(@"Session State Changed: %u", [[FBSession activeSession] state]);
switch (state) {
case FBSessionStateOpen:
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
NSLog(@"FBSessionStateClosedLoginFailed ERROR: %@", [error description]);
[[FBSession activeSession] closeAndClearTokenInformation];
break;
default:
break;
}
但是,每次重试时我都会收到相同的状态。我的日志内容如下:
FBSDKLog: FBSession **INVALID** transition from FBSessionStateCreated to FBSessionStateClosed
FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening
FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateClosedLoginFailed Session State Changed: 257
FBSessionStateClosedLoginFailed TOKEN: (null)
FBSessionStateClosedLoginFailed ERROR: Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xb24cc20 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason}
任何人都可以重现这个或知道问题可能出在哪里吗?
另一个答案 https://stackoverflow.com/questions/12601191/facebook-sdk-3-1-error-validating-access-token提供了一种手动将设备与服务器重新同步的方法。我定义了一个名为fbRsync
来调用这段代码。确保#import <Accounts/Accounts.h>
在您的实现文件中,然后定义此方法:
-(void)fbResync
{
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){
}
}];
}
}
然后我打电话fbResync
if openActiveSessionWithReadPermissions
产生错误:
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
if(error)
{
NSLog(@"Session error");
[self fbResync];
[NSThread sleepForTimeInterval:0.5]; //half a second
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
}
else
[self sessionStateChanged:session state:state error:error];
}];
半秒的延迟可能是不必要的,但它目前让我放心了。
这似乎为我解决了问题。我现在可以在 Facebook 帐户之间切换并能够登录。耶!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)