我为我们的应用实施新的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验证后仍会冻结内存不足。事实上,处理程序没有得到的调用
答案 0 :(得分:1)
application:didFinishLaunchingWithOptions:
的{{1}}(除了openURL:)FBSDKApplicationDelegate
(例如viewDidLoad,如https://developers.facebook.com/docs/facebook-login/ios/中所述)。在应用程序“冷启动”的情况下,SDK会为您设置。