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

时间:2015-09-24 22:20:18

标签: objective-c ios9 facebook-sdk-4.0

我将我的Xcode更新为7,将Facebook更新为4.6 sdk。

这是我的警告:

IL_0000: ldarg.1    
IL_0001: castclass  A
IL_0006: stloc.0    
IL_0007: ldloc.0    
IL_0008: ldarg.0    
IL_0009: ldc.i4.0   
IL_000a: ldelem.ref 
IL_000b: castclass  System.Func`1[System.Int32]
IL_0010: callvirt   Int32 Invoke()/System.Func`1[System.Int32]
IL_0015: callvirt   Void set_Value(Int32)/A
IL_001a: ldloc.0    
IL_001b: ldarg.0    
IL_001c: ldc.i4.1   
IL_001d: ldelem.ref 
IL_001e: castclass  IServiceFactory
IL_0023: ldarg.1    
IL_0024: castclass  A
IL_0029: call       A Process(IServiceFactory, A)/TestClass
IL_002e: ret        

在我的项目中,BitCode为NO - 因为如果我将其转为“是”,我会收到此错误:

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

这是解析方法:

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)

这是FBSDKGraphRequest:

-(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
     }
 }];
}

我的问题是该行:

-(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;
}];

运行永远不会进入iPhone的这个块,在模拟器中这个工作正常。

4 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,我试图在FBSDKContainerViewController上显示登录提醒。

在此次电话会议中

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

Facebook提供了自己的视图控制器,如果你没有指定fromViewController,“最顶层的视图控制器将尽可能自动确定。”

在你的情况下,听起来Facebook试图在被解雇的警报之上呈现,即使这不是被调用的电话。

答案 1 :(得分:0)

你添加 NSAppTransportSecurity &amp;您的info.plist的 LSApplicationQueriesSchemes 键是什么?

答案 2 :(得分:0)

由于@ PastryPup的回答,我找到了解决方法。

尝试在已解除的警报视图上显示Facebook登录视图控制器时,会显示警告。但是,切换到UIAlertController可以解决问题。

我的印象是,这是有效的,因为UIAlertController是一个成熟的控制器,因此即使在它被解散后也存在于视图层次结构中。

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

Link on how to implement a UIAlertController

答案 3 :(得分:0)

我做了一些技巧来完成这项工作。我不知道这是否是最佳方式。但是我只是在活动执行之前做了一个假的布尔值(点击了fb按钮)。因此,在它返回之后,只需将布尔值设置为true并在 ViewDidAppear 中有一个条件,如果布尔值为true,则执行segue到下一个要去的窗口。 我希望它有所帮助!