2015-06-26 80 views
1

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

登录流程需要应用交换机完成,有可能你的应用进行了内部监督办公室在内存不足的情况,或者如果您的应用程序不支持backgrounding终止。

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

来处理方案明确的状态更改处理块之前的handleOpenURL任何时间分配给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
  1. 确保您按照https://developers.facebook.com/docs/ios/getting-started所有步骤,包括连接FBSDKApplicationDelegateapplication:didFinishLaunchingWithOptions:(除的OpenURL :)
  2. 检查FBSDKAccessToken currentAccessToken在您的应用的适当区域(如viewDidLoad,如https://developers.facebook.com/docs/facebook-login/ios/中所述)。这将在您的应用“冷启动”情况下由SDK为您设置。
+0

我尝试了上述所有操作,并在didFinishLaunchingWithOptions和applicationDidBecomeActive中添加了代码。我认为这就是为什么它适用于所有手机,除了内存非常低的手机之外。你碰巧知道其他可能有用的东西吗? –

+0

你是说'currentAccessToken'仍然是零?如果是这样,请将代码示例的错误提交给developers.facebook.com/bugs。否则,即使应用程序已从内存中逐出,也应该使用currentAccessToken。 –

+0

我们不需要在我们的应用程序中实际使用currentAccessToken,因为我们不需要它。因为我不能在这里发布代码,请在我的编辑中阅读 –