单击"确定"已经授权应用程序返回应用程序后,Facebook iOS似乎丢失了会话

aob*_*obs 6 iphone facebook ios facebook-ios-sdk

我已将我的应用程序从Facebook SDK 2升级到3.1.

我在RecordsScreen上有一个Post按钮.如果用户未登录Facebook,则将显示登录页面,如果用户已登录,则将加载另一个笔尖以提示用户输入用于发布到他/她自己的墙壁的消息.

我已经登录了.之后,每次单击"发布"按钮时,有关该应用程序的页面已经过授权,并通过单击"确定"显示是否继续.单击"确定"后,应用程序将终止并从头开始重新启动.每次单击"发布"按钮时,都会再次显示相同的页面.它看起来无法找到有效的会话或令牌丢失.

我在模拟器和设备上测试了这个.同样的事情发生.部署目标是iOS5.1.

我还没输入的唯一参数是iPhone App Store ID.这会影响上述行为吗?

我已经尝试了很多次,但找不到解决方案.

任何帮助表示赞赏.

谢谢!

AOB的


1月4日编辑:

我发现每次调用openSessionWithAllowLoginUI.返回状态FBSessionStateClosedLoginFailed.登录有问题.但是,自"已经授权"页面出现以来,用户已经登录.

原因是applicationWillTerminate在openSessonWithAllowLoginUI之后立即执行.任何人都可以阐明这一点吗?


在appDelegate.h中,我导入了FacebookSDK/FacebookSDK.h,在appDelegate.m中,实现了以下内容:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [FBSession.activeSession handleOpenURL:url);
}

-(void)applicationDidBecomeActive:(UIApplication *)application {
[FBSession.activeSession handleDidBecomeActive];
}

-(void)applicationWillTerminate:(UIApplication *)application {
[FBSession.activeSession close];
}
Run Code Online (Sandbox Code Playgroud)

mainViewController是一个多视图控制器,可以切换笔尖.

我已经实现了一个类FBHandler来处理Facebook登录/注销.FBHandler.h包含#import"Facebook.h",FBHandler是一个包含的类

-(void)sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error {
  switch(state) {
    case FBSessionStateOpen:
        break;
    case FBSessionStateClosed:
    case FBSessionStateClosedLoginFailed:
        [FBSession.activeSession closeAndClearTokenInformation];
    default:
        break;
  }

  [[NSNotificationCenter defaultCenter]postNotificationName:FBSessionStateChangedNotification object:session];

  // If there is an error, display the alert view.  I have skipped this code.
}

-(BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    return [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
        [self sessionStateChanged:session state:state error:error];
    }];
}
Run Code Online (Sandbox Code Playgroud)

其中一个笔尖 - RecordsScreen.xib包含Facebook登录/注销按钮.在RecordsScreen.m(用户可以在其中查看他/她的分数以及登录或从Facebook注销)的位置,以下内容添加到viewDidLoad:

fbHandler = [[FBHandler alloc] init];
[fbHandler openSessionWithAllowLoginUI:NO];

// Also, we will listen to FBSessionStateChangedNotification in viewDidLoad.  Code is skipped here.

// The implementation of sessionStateChanged in RecordsScreen:
-(void)sessionStateChanged:(NSNotification *)notification {
    if (FBSession.activeSession.isOpen) {
        if (self.facebook == nil) {
            self.facebook = [[Facebook alloc]initWithAppId:FBSession.activeSession.appID andDelegate:nil];
            self.facebook.accessToken = FBSession.activeSession.accessToken;
            self.facebook.expirationDate = FBSession.activeSession.expirationDate;
        }
    } else {
        self.facebook = nil;
    }
}   
Run Code Online (Sandbox Code Playgroud)

在RecordsScreen.m中,如果用户单击登录按钮,

if (!FBSession.activeSession.isOpen) {
    // Login to Facebook.
    [fbHandler openSessionWithAllowLoginUI:YES];
} else {
    // If user is login, post to wall.
    [self postScoreToWall];
}
Run Code Online (Sandbox Code Playgroud)

aob*_*obs 4

我发现了问题。在 plist 中,“应用程序不在后台运行”设置为 YES。设置为NO解决了这个问题。