Facebook登录在冷启动时崩溃

时间:2015-06-26 21:30:03

标签: ios facebook memory-management login crash

我为我们的应用实施新的Facebook登录时遇到了一些麻烦。我们正在使用Facebook SDK v4.3进行开发。登录/注册过程在内存不足的设备上崩溃。我们怀疑低内存限制导致我们的应用程序在触发切换到Facebook进行身份验证时终止。作为Facebook旧版SDK中的文档(链接https://developers.facebook.com/docs/facebook-login/ios#login-apicalls):

  

登录流程需要一个应用程序切换才能完成,在低内存条件下,或者如果您的应用程序不支持后台处理,您的应用程序可能会被iOS终止。

     

在这种情况下,提供给您的公开呼叫的状态更改处理程序将消失。

     

要处理该场景,请在handleOpenURL:call之前的任何时间显式地将状态更改处理程序块分配给FBSession实例:

// During the Facebook login, your app passes control to the Facebook iOS app or Facebook in a mobile browser.
// After authentication, your app will be called back with the session information.
- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication
        annotation:(id)annotation
  {
      // Note this handler block should be the exact same as the handler passed to any open calls.
      [FBSession.activeSession setStateChangeHandler:^(FBSession *session, FBSessionState state, NSError *error) {

           // Retrieve the app delegate
           AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
           // Call the app delegate's sessionStateChanged:state:error method to handle session state changes
           [appDelegate sessionStateChanged:session state:state error:error];
      }];
      return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];
  } 

不幸的是,新的Facebook SDK弃用了FBSession.activeSession及其stateChangeHandler。我按照我的应用程序的自定义UI FBLogin按钮,这是我的appDelegate代码

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                      openURL:url
                                            sourceApplication:sourceApplication
                                                   annotation:annotation];
}

代码工作正常,在正常情况下可以正常运行。但是,它在冷启动时表现得很奇怪(由于内存不足)。所以我的问题是:我们如何防止这种情况发生?是否有新SDK的等效处理程序?

PS。我完成了管理设备内存的工作。但在这种压力条件下,它仍无法发挥作用。

编辑:我想要的只是获取用户有关成功的基本信息。因此,我不需要跟踪(或有必要)访问令牌。这是我用来调用登录的代码块

    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
        if (error) {
            [ErrorMessageDisplay displayErrorAlertOnViewController:self withTitle:FB_LOGIN_ERROR_TITLE andMessage:FB_LOGIN_ERROR_MESSAGE];
            [self.loginView enableLoginButtons];
        } else if (result.isCancelled) {
            [ErrorMessageDisplay displayErrorAlertOnViewController:self withTitle:FB_LOGIN_CANCEL_TITLE andMessage:FB_LOGIN_CANCEL_MESSAGE];
            [self.loginView enableLoginButtons];
        } else {
            [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id user, NSError *error) {
                //TODO do something in here
            }];
        }
    }];

使用部分代码,应用程序在使用Facebook验证后仍会冻结内存不足。事实上,处理程序没有得到的调用

1 个答案:

答案 0 :(得分:1)

  1. 请务必遵循https://developers.facebook.com/docs/ios/getting-started中的所有步骤,包括关联application:didFinishLaunchingWithOptions:的{​​{1}}(除了openURL:)
  2. 在应用的相应区域中检查FBSDKApplicationDelegate(例如viewDidLoad,如https://developers.facebook.com/docs/facebook-login/ios/中所述)。在应用程序“冷启动”的情况下,SDK会为您设置。