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,在UIApplicationDelegate
的application:openURL:options:
被实现时,在iOS 9上, application:openURL:sourceApplication:annotation:
将不会被调用。
所以我所要做的就是调用FBSDKApplicationDelegate
的application:openURL:sourceApplication:annotation:
来自UIApplicationDelegate
的application: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) }