我们在为我们的应用实施新的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的身份验证后低内存。事实上,处理程序没有得到调用在所有
我尝试了上述所有操作,并在didFinishLaunchingWithOptions和applicationDidBecomeActive中添加了代码。我认为这就是为什么它适用于所有手机,除了内存非常低的手机之外。你碰巧知道其他可能有用的东西吗? –
你是说'currentAccessToken'仍然是零?如果是这样,请将代码示例的错误提交给developers.facebook.com/bugs。否则,即使应用程序已从内存中逐出,也应该使用currentAccessToken。 –
我们不需要在我们的应用程序中实际使用currentAccessToken,因为我们不需要它。因为我不能在这里发布代码,请在我的编辑中阅读 –