Facebook SDKlogin从不在iOS 9上回拨我的应用程序

我已经按照本指南更新了我的应用程序,使用Facebook SDK 4.6在使用iOS 9 SDK构build时能够正常工作。

当我点击loginbutton时,一个Safari视图控制器会呈现(不应该redirect到Facebook应用程序?),但是在接受权限之后,Safari视图控制器永远不会被解散。 它加载一个新的空白页,坐在那里什么都不做。 如果我点击完成button,返回的FBSDKLoginManagerLoginResult isCancelled为true。

SDK是通过Facebook应用程序selectSafari视图控制器是否正常? 为什么我在login完成后没有得到callback?

事实certificate,在UIApplicationDelegateapplication:openURL:options:被实现时,在iOS 9上, application:openURL:sourceApplication:annotation:将不会被调用。

所以我所要做的就是调用FBSDKApplicationDelegateapplication:openURL:sourceApplication:annotation:来自UIApplicationDelegateapplication:openURL:options:

 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options { return [[FBSDKApplicationDelegate sharedInstance] application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]; } 

对于Swift,这是为我工作(将其添加到AppDelegate.swift中):

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

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

在每种情况下记得添加import FBSDKCoreKit与其他import语句。

它基本上是Google SignIn使用的。 如果它仍然不能正常工作,您需要像在FaceBook Docs中指定的那样设置代表和您的info.plist。 我希望这有帮助!

对于Swift 3和Facebook SDK 4.16.0:

将以下代码添加到AppDelegate.swift

 func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) } 

对于那些遇到与iOS10相同的问题,我添加了这个:

 @available(iOS 9.0, *) func application(_ application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) } 

这应该工作,但现在它只是一个解决方法

对于Xamarin用户:

 public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation) { OnUrlProtocolDetected(url.ToString()); if (url.AbsoluteString.StartsWith("fb")) { return ApplicationDelegate.SharedInstance.OpenUrl(application, url, sourceApplication, annotation); } } 

你有没有按照这些步骤?

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

我想你错过了在App委托中调用应用程序委托的地步。 第二种方法是至关重要的,它给你的应用程序callback关于login在用户的safari完成

我正在使用旧的3.24版本,在iOS 9我正面临类似的问题。

发现在appDelegate方法中- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

return [FBSession.activeSession handleOpenURL:url];

代替

return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];

对于像我这样的快速新手,问题是application()方法的替代实现:

工作版本:

  func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application( application, open: url, sourceApplication: sourceApplication, annotation: annotation) } 

非工作版本(从某处复制)

 func application(application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: Any) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application( application, open: url, sourceApplication: sourceApplication, annotation: annotation) } 

我刚刚遇到了这个问题,谢谢@Hesham的修复。

这里是Swift3修复:

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application( app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) } 

对于任何人在这个问题上寻找Swift协助,以下为我工作。

 func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url, sourceApplication: UIApplicationOpenURLOptionsSourceApplicationKey, annotation: UIApplicationOpenURLOptionsAnnotationKey) }