更新iOS 9和Facebook SDK 4.6后,登录窗口无法打开。

6

我将我的Xcode更新到了7版本,同时将Facebook更新到了4.6版SDK。

以下是我的警告:

Warning: Attempt to present <FBSDKContainerViewController: 0x159337700> on <UIAlertController: 0x159262700> whose view is not in the window hierarchy!

在我的项目中,BitCode是NO - 因为如果我将其设置为Yes,就会出现以下错误:
ld:'/Users/MyName/Desktop/MyProjectName/ProjectName/ProjectName/Resources/Frameworks/Fabric.framework/Fabric(Fabric.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是解析方法:
-(void)signInWithFacebookClicked
{
NSArray *permissions = [NSArray arrayWithObjects:@"email",@"user_friends", nil];
[PFFacebookUtils logInInBackgroundWithReadPermissions:permissions block:^(PFUser *user, NSError *error)
 {
     if (!user) // The user cancelled the Facebook login
     {
         NSLog(@"Uh oh. The user cancelled the Facebook login.");
     }
     else if (user.isNew) // New user (not stored on DB) - User signed up and logged in through Facebook
     {
         [self handleNewUser];
     }
     else if (user) // the user is exist at DB
     {
       // the user is exist at DB  
     }
     else if (error)
     {
        // showAlertOfSomethingWentWrong
     }
 }];
}

这是 FBSDKGraphRequest:

-(void)handleNewUser
{

FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"friends, first_name, gender, last_name, link, name, verified, picture, email"}];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
 {
     NSMutableDictionary *userData = (NSMutableDictionary *)result;
}];

我的问题是这一行代码:
[PFFacebookUtils logInInBackgroundWithReadPermissions:permissions block:^(PFUser *user, NSError *error)

在 iPhone 上,这个运行时从未进入此代码块,在模拟器上却可以正常工作。


我认为这个链接 https://dev59.com/BV0b5IYBdhLWcg3wSPqL#29637893 可以帮助你: - iSibDev
对我没用 )-: 我编辑了问题。 - Roei Nadam
1
你有没有找到这个问题的解决方案? - jjjjjjjj
4个回答

2

我曾经遇到过类似的问题,当时我在尝试在FBSDKContainerViewController上方显示登录提示。

在这个调用中

- (void)logInWithReadPermissions:(NSArray *)permissions
          fromViewController:(UIViewController *)fromViewController
                     handler:(FBSDKLoginManagerRequestTokenHandler)handler;

Facebook 提供了自己的视图控制器,如果您没有指定 fromViewController,"最上层的视图控制器将会自动确定为最佳选择。"

在您的情况下,看起来 Facebook 正试图在已经关闭的警报框之上呈现视图,即使这不是所调用的操作。


嗨!我也遇到了完全相同的问题!但是在LogInWithWritePermissions中...你是如何解决它的? - rickrvo
1
@rickrvo - 我现在无法访问我的代码,但我认为我要么指定了一个 fromViewController,以便 Facebook 不会推断出错误的视图,要么确保我正在呈现的警报不再显示。 - PastryPup
1
我找到了一个解决方法!问题在于 loginwithWritePermissions 在另一个 loginWithReadPermissions 之后被调用... 而 iOS 没有时间在调用 loginWithWritePermissions 之前返回应用程序,因此它得到了不同的视图控制器。 一个快速的修复方法是在 WritePermissions 调用前添加 1 秒延迟,这样iOS可以切换回应用程序,然后第二个调用就可以正常工作了。 - rickrvo

0

你在 info.plist 中添加了 NSAppTransportSecurityLSApplicationQueriesSchemes 键吗?


1
在模拟器上,Facebook 开放登录,但在 iPhone 上窗口没有打开。 - Roei Nadam

0

我找到了一个解决方法,感谢@PastryPup的回答。

当试图在已解除警报视图上方呈现Facebook登录视图控制器时,会显示警告。然而,切换到UIAlertController可以解决这个问题。

我的印象是这样做可以起作用,因为UIAlertController是一个完整的控制器,因此即使在被解除后仍存在于视图层次结构中。

解决方案基本上是用UIAlertController替换UIAlertView,并在UIAlerController的默认操作中调用[PFFacebookUtils logInInBackgroundWithReadPermissions:permissions block:^(PFUser *user, NSError *error)

如何实现UIAlertController的链接


0

我做了一些小技巧让它工作。我不知道这是否是最好的方法,但我只是创建了一个布尔值,在活动执行之前(即点击fb按钮之前)将其设置为false。因此,在返回后,只需将布尔值设置为true,并在ViewDidAppear中添加条件,如果布尔值为true,则执行到您想要转到的下一个窗口的segue。 希望能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接