我正在使用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}
任何人都可以复制这个或者知道问题可能在哪里吗?
答案 0 :(得分:38)
Another answer提供了一种手动将设备与服务器重新同步的方法。我定义了一个名为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
产生错误,我会致电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帐户之间切换,并且能够登录.Yay!
答案 1 :(得分:12)
我遇到了同样的问题。检查您的FB应用程序是否已在“设置”中启用 - &gt; Facebook的。 我被禁用(即使我不记得禁用它),一旦我启用它,它就被修复了。
在我的测试过程中,我已经从我的iPhone帐户中添加并删除了我的FB应用程序几次,该帐户与我的iPhone相关联。它可以解释为什么,神奇地,我的应用程序被禁用。
答案 2 :(得分:3)
在ios 6中使用fb sdk 3.1.1。请在“[FBSessio openActiveSessionWithReadPermissions ...”方法中将权限参数传递为“nil或email”。在这里,我的代码很棒。
#define IOS_NEWER_OR_EQUAL_TO_6 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 6.0 )
-(void)showFBLogin
{
[FBSession.activeSession closeAndClearTokenInformation];
NSArray *permissions = [NSArray arrayWithObjects:@"email, publish_actions, publish_stream", nil];
#ifdef IOS_NEWER_OR_EQUAL_TO_6
permissions = nil; or NSArray *permissions = [NSArray arrayWithObjects:@"email",nil];
#endif
NSLog(@"\npermissions = %@", permissions);
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error) {
NSLog(@"\nfb sdk error = %@", error);
switch (state) {
case FBSessionStateOpen:
[[FBRequest requestForMe] startWithCompletionHandler:
^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if (!error) {
//success
}
}];
break;
case FBSessionStateClosed:
//need to handle
break;
case FBSessionStateClosedLoginFailed:
//need to handle
break;
default:
break;
}
}];
}
答案 3 :(得分:1)
我在使用iOS7.1的3.1.3 FB SDK上遇到了同样的问题。我在这里找到了解决方案。希望它有所帮助!!
我在这里尝试了所有答案
@loganathan nil权限,@ lill_always_be_a_warriors fbResync。
所有这些都不适合我
但我发现当我在iPhone 7.1模拟器中启动相同的代码时它会很好用
(没有SSO“单点登录”)
相同的代码适用于旧版本的iOS FB SDK(不确定哪个版本,但不是3.13)
(但尝试登录时不会显示SSO)
所以,我尝试重新编写示例问题。我在这里找到了几个不同的东西
1. https://developers.facebook.com/docs/ios/getting-started添加新的FacebookDisplayName
2.我修改了用于iTune连接的BundleID,但我没有将它更新回Faceboook App Dev
修改这些设置后,它可以在我的iOS应用程序上使用SSO功能
希望它有所帮助!!
答案 4 :(得分:0)
您是否尝试过RenewSystemCredential方法?看一下这篇文章:
Facebook iOS SDK extendAccessToken not Working - fbDidExtendToken not being called
答案 5 :(得分:0)
我得到了同样的错误。但我使用@ill_always_be_a_warriors方法:-(void)fbResync
但不适合我。
我终于发现这是我的权限问题,我删除了offline_access
权限,它有效,希望它有所帮助。