Facebook iOS 在单击“确定”后返回应用程序时似乎丢失会话您已经授权应用程序

Posted

技术标签:

【中文标题】Facebook iOS 在单击“确定”后返回应用程序时似乎丢失会话您已经授权应用程序【英文标题】:Facebook iOS seems lost session when return to app after clicking Okay to You have already authorized app 【发布时间】:2013-01-01 09:19:00 【问题描述】:

我已将我的应用从 Facebook SDK 2 升级到 3.1。

我在 RecordsScreen 上有一个发布按钮。如果用户没有登录 Facebook,则会出现登录页面,如果用户已经登录,则会加载另一个 nib 以提示用户输入消息以发布到他/她自己的墙上。

我已经登录了。之后,每次我点击发布按钮时,关于应用程序的页面已经被授权,并通过点击确定询问您是否继续。单击确定后,应用程序终止并重新从头开始启动。每次单击“发布”按钮时,都会再次出现相同的页面。似乎找不到有效会话或令牌丢失。

我已经在模拟器和设备上对此进行了测试。发生同样的事情。部署目标是ios5.1。

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

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

感谢任何帮助。

谢谢!

aobs


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];

mainViewController 是一个多视图控制器,会切换 nib。

我已经实现了一个类 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];
    ];

其中一个笔尖 - 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;
    
   

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

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

【问题讨论】:

不需要应用商店 ID 在 Facebook SDK 2 中可以正常工作吗? 是的,它在 SDK 2 中运行良好。代码不同。 然后检查这个链接。它显示了 2 和 3.1 之间的区别 developers.facebook.com/docs/tutorial/iossdk/…) 谢谢,但我之前已经浏览过那个链接。我再次测试了应用程序,问题是 FBSession.activeSession.isOpen 总是错误的。不知道为什么,因为如果页面“您已经授权应用程序...”出现消息“您正在以用户名登录应用程序”意味着用户已经登录并且会话应该已经打开。 【参考方案1】:

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

【讨论】:

【参考方案2】:

在您展示的代码中,您仅获得会话的一组基本读取权限。至少需要调用reauthorizeWithPublishPermissions: 并传递适当的权限。

我刚刚遇到了类似的问题,我通过更改两件事解决了这个问题,在登录时我没有使用 Facebook 建议的两步权限升级方法,但我尝试使用 @987654323 获取登录所需的权限@。

您还需要确保在 Facebook 登录过程结束时调用 handleDidBecomeActive:,然后再尝试再次调用 sdk。如果您有一系列块执行此过程的各个步骤,则可能不会发生这种情况。

我没有使用这个 sdk 的旧版本,但它看起来更直观。

【讨论】:

我将在用户登录后使用 reauthorizeWithPublishPermissions 并单击 Post 按钮。但我会试试你的建议,看看是否能解决问题。 刚刚测试了将权限更改为 openActiveSessionWithPublishPermissions 的应用。出现同样的问题。

以上是关于Facebook iOS 在单击“确定”后返回应用程序时似乎丢失会话您已经授权应用程序的主要内容,如果未能解决你的问题,请参考以下文章

iOS Facebook SDK:您已经授权应用程序后出现空白屏幕?

如何获取 Facebook 登录令牌,在“您已经授权 APPName”Facebook 中单击“确定”按钮后

Facebook 连接集成错误

Facebook:当我返回我的应用程序时,登录和权限屏幕不会关闭

iOS Facebook SDK 分享照片和从 Facebook 应用程序注销后

Facebook iOS SDK - 第二次登录时多余的“确定”点击?