IOS-Facebook授权应用程序后空白屏幕

问题描述:

我从Parse v1.6.4升级到最新版本,并且我正在将facebook ios sdk升级到v4.7。 问题是应用程序被授权后,它显示一个空白的白色屏幕,如果我点击“完成”,它关闭Safari并在日志中显示,用户取消登录。
将它升级到新版本之前它工作正常。IOS-Facebook授权应用程序后空白屏幕

我的plist

<key>CFBundleURLTypes</key> 
<array> 
    <dict> 
    <key>CFBundleURLSchemes</key> 
<array> 
<string>fbxxxxxx</string> 
</array> 
</dict> 
</array> 
<key>FacebookAppID</key> 
<string><my FacebookAppID></string> 
<key>FacebookDisplayName</key> 
<string>my appname</string> 

白名单FB服务器

<key>NSAppTransportSecurity</key> 
<dict> 
<key>NSExceptionDomains</key> 
<dict> 
<key>facebook.com</key> 
<dict> 
    <key>NSIncludesSubdomains</key> 
    <true/> 
    <key>NSExceptionRequiresForwardSecrecy</key> 
    <false/> 
</dict> 
<key>fbcdn.net</key> 
<dict> 
    <key>NSIncludesSubdomains</key> 
    <true/> 
    <key>NSExceptionRequiresForwardSecrecy</key> 
    <false/> 
</dict> 
<key>akamaihd.net</key> 
<dict> 
    <key>NSIncludesSubdomains</key> 
    <true/> 
    <key>NSExceptionRequiresForwardSecrecy</key> 
    <false/> 
</dict> 

<key>LSApplicationQueriesSchemes</key> 
<array> 
    <string>fbapi</string> 
    <string>fb-messenger-api</string> 
    <string>fbauth2</string> 
    <string>fbshareextension</string> 
</array> 

AppDelegate.m

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation { 
    return [[FBSDKApplicationDelegate sharedInstance] application:application 
                 openURL:url 
               sourceApplication:sourceApplication 
                 annotation:annotation]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [FBSDKAppEvents activateApp]; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    return [[FBSDKApplicationDelegate sharedInstance] application:application 
            didFinishLaunchingWithOptions:launchOptions]; 
} 

viewController.m

-(IBAction)facebookLogin:(id)sender 
{ 
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 

    if ([FBSDKAccessToken currentAccessToken]) 
    { 
     //Do something 

    } 
    else 
    { 
     [login logInWithReadPermissions:@[@"email"] fromViewController:nil handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) 
     { 
      if (error) 
      { 
       NSLog(@"Error"); 
      } 
      else if (result.isCancelled) 
      { 
       NSLog(@"User cancelled login"); 
      } 
      else 
      { 
       NSLog(@"Login Success"); 

       if ([result.grantedPermissions containsObject:@"email"]) 
       { 
        NSLog(@"result is:%@",result); 

       } 
       else 
       { 
        NSLog(@"FB email permission error"); 

       } 
      } 
     }]; 
    } 
} 

这里是屏幕的图像。

enter image description here

我在我的IPhone 6设备上运行这个测试程序。
谢谢! :)

编辑1:
今天,我升级我的项目Facebook的新V4.8 SDK,这一次,它似乎像它的工作。
我不确定,那时我做错了什么,但现在它正在为arm64设备工作。
但是,当我启用armv7s支持,它给我这个错误...

ld: file is universal (4 slices) but does not contain a(n) armv7s slice: 

它指向FBSDKLoginKit.framework。
armv7s设备不再被支持吗?
无论如何摆脱这个错误?
谢谢! :)

+0

谢谢Dharmesh!现在好多了!你是怎么做到的?我的意思是,通过使用一些图像托管网站或其他东西? – Alex

+0

您需要声望才能附加图片。 – anhtu

+0

哦,好的:)谢谢你,anhtu! – Alex

我有同样的问题,事实证明,

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool 

在IOS 9.0已经过时了。我也执行了方法

func application(application: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool 

所以FB SDK调用后者。 所以,我必须确保我打电话FBSDKApplicationDelegate在这两种方法(一次IOS 8和一次ios9)。

这是我实现的AppDelegate的:

@available(iOS 9.0, *) 
func application(application: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 
    let handled = FBSDKApplicationDelegate.sharedInstance().application(application, 
                     openURL: url, 
                     sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String, 
                     annotation: options [UIApplicationOpenURLOptionsAnnotationKey]) 
    if !handled { 
     return self.openURL(url) 
    } 
    return true 
} 

@available(iOS, introduced=8.0, deprecated=9.0) 
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { 
    let handled = FBSDKApplicationDelegate.sharedInstance() 
     .application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) 
    if !handled { 
     return self.openURL(url) 
    } 
    return true 
} 

其中self.openURL(URL)可以被用来处理Facebook的那些旁边其他类型的URL。

+0

您lifesaver。这个AppDelegate方法的微妙不同的签名花了我们许多小时。 – MattD