在设备上切换FB帐户时,在iOS6上Facebook授权失败
我正在使用Facebook SDK 3.1.1在iOS应用程序中实现FB Connect。在简单的情况下,无论是新的FB集成(在iOS上登录)还是通过web view恢复到正常授权(我没有在这两种情况下安装本机Facebook应用程序),这都可以正常工作。 当我在iOS级别上切换帐户时出现问题。使用不同的FB用户帐户注销和登录 要登录/授权,请执行以下操作:在设备上切换FB帐户时,在iOS6上Facebook授权失败,ios6,single-sign-on,facebook-ios-sdk,Ios6,Single Sign On,Facebook Ios Sdk,我正在使用Facebook SDK 3.1.1在iOS应用程序中实现FB Connect。在简单的情况下,无论是新的FB集成(在iOS上登录)还是通过web view恢复到正常授权(我没有在这两种情况下安装本机Facebook应用程序),这都可以正常工作。 当我在iOS级别上切换帐户时出现问题。使用不同的FB用户帐户注销和登录 要登录/授权,请执行以下操作: [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allo
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
如果每次获取FBSessionStateClosedLogin失败,即使我在达到该状态时执行了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}
任何人都可以重现这一点,或者知道问题可能出在哪里吗?提供了一种手动将设备与服务器重新同步的方法。我定义了一个名为fbRsync
的方法来调用此代码。确保在实现文件中导入,然后定义此方法:
-(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){
}
}];
}
}
然后,如果openActiveSessionWithReadPermissions
产生错误,我调用fbResync
:
[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帐户之间切换,并且可以登录。耶 在ios 6中使用fb sdk 3.1.1。请在“[FBSession 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;
}
}];
}
#定义IOS更新的或等于6([[[UIDevice currentDevice]systemVersion]floatValue]>=6.0)
-(void)showFBLogin
{
[FBSession.activeSession closeAndClearTokenInformation];
NSArray*权限=[NSArray arrayWithObjects:@“电子邮件、发布操作、发布流”,无];
#如果定义IOS较新或等于6
permissions=nil;或NSArray*permissions=[NSArray arrayWithObjects:@“email”,nil];
#恩迪夫
NSLog(@“\n权限=%@”,权限);
[FBSession openActiveSessionWithReadPermissions:权限
阿洛洛洛吉努伊:是的
completionHandler:
^(第*届会议,
FBSessionState状态,N错误*错误){
NSLog(@“\nfb sdk错误=%@”,错误);
开关(状态){
案例FBSessionStateOpen:
[[FBRequest requestForMe]startWithCompletionHandler:
^(FBRequestConnection*连接,NSDictionary*用户,NSError*错误){
如果(!错误){
//成功
}
}];
打破
案件审理结束:
//需要处理
打破
案例FBSessionStateClosedLogin失败:
//需要处理
打破
违约:
打破
}
}];
}
我也遇到了同样的问题。请检查您的FB应用程序是否已在设置->Facebook中启用。
我的被禁用了(尽管我不记得禁用了),一旦我启用了它,它就被修复了
在我的测试过程中,我已经多次从我的FB帐户中添加和删除我的FB应用程序,该帐户与我的iPhone相链接。这可能会神奇地解释为什么我的应用程序被禁用。你尝试了RenewSystemCredential方法吗?请看这篇文章:
我也遇到了同样的错误。但是我使用了@ill\u always\u be\u a\u warriors方法:
-(void)fbResync
,但对我不起作用
我终于发现这是我的权限问题,我删除了脱机访问权限
权限,它可以工作,希望它能帮助一些人。我在iOS7.1的3.1.3 FB SDK上也遇到了同样的问题。我在这里找到了解决方案。希望能有所帮助!!
我在这里尝试了所有答案。
@loganathan无权限,@ill\u always\u be\u a\u fbResync.
所有这些都不适合我。
但我发现,当我在iPhone 7.1模拟器中启动相同的代码时,它会很好地工作
(无SSO“单点登录”)
同样的代码在旧版本iOS FB SDK上运行良好(不确定是哪个版本,但不是3.13)
(但尝试登录时不会显示SSO)
因此,我尝试重新编写一个示例问题。我在这里发现了几个不同的问题。
1.添加新的FacebookDisplayName
2.我修改了iTunes connect的BundleID,但没有将其更新回Faceboook应用程序开发
修改这些设置后,它将在具有SSO功能的iOS应用程序上运行。
希望能有帮助!!我想我和你有同样的问题。我还不知道任何解决方案或解决办法。你是如何打开FBSDKLog日志记录的?我在这里找到了这个方法:
[FBSettings setLoggingBehavior:[NSSet setWithObjects:FBLoggingBehaviorFBRequests,FBLoggingBehaviorFBURLConnections,FBLoggingBehaviorAccessTokens,FBLoggingBehaviorSessionStateTransforms,nil]]
BTW,现在似乎对我有效,尽管我不知道为什么。我已经将问题的解决方案合并到我的sessionStateChanged处理程序中,但它仍然无法工作。直到我稍后重试。出于某种原因,现在的行为如下所示。我在iOS上切换当前正在工作的FB用户,在应用程序中会话是打开的,但是请求将失败。下次尝试时,将打开一个具有正确令牌的新会话,对FB的下一个请求将生效。最好将底部代码块封装到一个名为fbAttemptConnection
的函数中,然后使用[自执行选择器:@selector(fbAttemptConnection)with object:nil afterDelay:0.5]
而不是使用sleepForTimeInterval:
并阻塞线程。此外,这将与iOS 5不向后兼容。出于某种原因,fbAccounts
为我返回一个空数组,即使在iOS 6上也是如此。与其使用任何延迟,不如创建一个完成块,以便fbResync在内部调用([accountStore续订Account:Account的凭证