FBSDKLoginManager logInWithReadPermissions:fromViewController:处理程序:应用程序首次运行时未调用完成

Posted

技术标签:

【中文标题】FBSDKLoginManager logInWithReadPermissions:fromViewController:处理程序:应用程序首次运行时未调用完成【英文标题】:FBSDKLoginManager logInWithReadPermissions: fromViewController: handler: completion not called on app first run 【发布时间】:2016-10-17 14:32:05 【问题描述】:

我有一个启用 Facebook 登录的应用程序,由于某种原因,在安装后我的应用程序的第一次运行时没有调用 FBSDKLoginManager logInWithReadPermissions: fromViewController: handler:。如果我只是杀死我的应用程序(即使没有尝试登录 Facebook 或做任何事情:尝试在第一次打开时登录或不尝试登录不会改变任何东西)然后再次打开它,它会完美运行。

为什么?

(我已经检查过传递给方法的视图控制器不是 nil 并且是当前视图控制器)

这是我的登录代码:

+(void)loginWithFacebookWithCompletion:(ULCompletion)completion
    [[[FBSDKLoginManager alloc] init] logInWithReadPermissions:FACEBOOK_READ_PERMISSIONS fromViewController:[ULMasterViewController instance] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) 
        if(result.token)
          ...
        
[...]

其余部分无关紧要,因为根本不调用完成块(即使有错误也不调用)。我有 FACEBOOK_READ_PERMISSIONS 硬编码:

#define FACEBOOK_READ_PERMISSIONS (@[@"user_friends", @"user_birthday", @"email", @"user_photos"])

最后,[ULMasterViewController instance] 是有效的(不是 nil,并且在层次结构中有它的视图(否则它会抱怨视图不在层次结构中,也尝试过)。

【问题讨论】:

您是否在您的 appdeligate.m 文件中编写了 - (BOOL)application:(UIApplication *)application openURL... 方法? @SatishMavani 是的。并且它有适当的调用 FBSDKLoginManager,但在任何一种情况下都不会调用它(在“失败”第一次运行时,也不是在第二次运行时成功登录) 您是否创建了使用 facebook 按钮登录的自定义操作? @SatishMavani 你到底是什么意思? 我的意思是,您使用 FBSDKLoginButton 登录 facebook 吗? 【参考方案1】:

这在我的情况下有效。

1 .在界面中创建FLoginManager的实例。

FBSDKLoginManager *manager

2 . 在 ViewDidLoad 中初始化。

manager = [FBSDKLoginManager new]

3.最后使用FBLoginManager这个实例调用登录权限方法。

【讨论】:

哦,你的意思是在类范围内初始化实例,是的,这行得通。【参考方案2】:

我遇到了这个确切问题,非常令人沮丧。修复它的关键是我的应用程序代码正在创建大量同时存在的 FBSDKLoginManager 对象。重构我的代码以使用单例共享实例(而不是到处运行[FBSDKLoginManager new])为我消除了这个错误/问题。

奇怪的是,我从来不明白为什么会这样。我使用调试器跟踪 FBSDK 代码,我发现的唯一(非常)神秘的问题是,在 loginWithReadPermissions 方法内部,fromViewController 参数被设置为 nil,即使我传入了一个非nil 值。 奇怪...

【讨论】:

【参考方案3】:

这无关紧要,但尝试单独创建 FBSDKLoginManager 对象,因为我已经做过同样的事情并为我工作。

FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];

【讨论】:

我认为这不仅仅是单独创建,而是在类/全局范围内创建,而不是在方法范围内创建。可能,Facebook SDK 持有对管理器的弱引用,并且在函数返回后立即释放,因此在回调时为零。

以上是关于FBSDKLoginManager logInWithReadPermissions:fromViewController:处理程序:应用程序首次运行时未调用完成的主要内容,如果未能解决你的问题,请参考以下文章

FBSDKLoginManager 有效,PFFacebookUtils logInInBackgroundWithReadPermissions 无效

FBSDK FBSDKLoginManager 和 SFSafariViewController 不会关闭

FBSDKLoginManager 未在本机 ios 应用程序中打开登录对话框

[FBSDKLoginManager logInWithReadPermissions:fromViewController:handler:]:无法识别的选择器发送到实例

FBSDKLoginManager logInWithReadPermissions:fromViewController:处理程序:应用程序首次运行时未调用完成

如何使用 iOS Facebook SDK 2.4 保持登录状态