Facebook SDK 登录永远不会在 iOS 9 上回调我的应用程序

Posted

技术标签:

【中文标题】Facebook SDK 登录永远不会在 iOS 9 上回调我的应用程序【英文标题】:Facebook SDK login never calls back my application on iOS 9 【发布时间】:2015-08-30 17:24:02 【问题描述】:

我已按照this 指南更新我的应用程序,以便在使用 ios 9 SDK 构建时使用 Facebook SDK 4.6 正常工作。

当我现在点击登录按钮时,会显示一个 Safari 视图控制器(它不应该重定向到 Facebook 应用程序吗?),但在接受许可后,Safari 视图控制器永远不会被关闭。它加载一个新的空白页面,然后什么也不做。如果我点击完成按钮,返回的FBSDKLoginManagerLoginResultisCancelled 为真。

SDK 选择 Safari 视图控制器而不是 Facebook 应用程序是否正常?为什么登录完成后没有收到回调?

【问题讨论】:

关于重定向到app:有一个名为FBSDKLoginBehavior的属性来设置登录行为(可以设置通过old school webview、system或FB app登录)。如果您对默认登录名是 SFSafariViewController 感到沮丧,请在此处加入俱乐部:developers.facebook.com/bugs/786729821439894/?search_id 【参考方案1】:

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

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

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

【讨论】:

本机登录在 iOS 9+ 上被禁用。 pbs.twimg.com/media/CPqUE3bW8AEcS8n.png 在 SDK v4.6 和 v3.24 中,FB SDK 默认使用 Safari 视图控制器,而不是快速应用程序切换到原生 Facebook 应用程序。这是设计使然,因为在 iOS 9 上,Safari 视图控制器为人们提供了比快速应用切换流程更好的体验。 这就是解决方案!又是一个垃圾 Facebook SDK!谢谢! 它对我不起作用。登录对话框保持打开状态。任何的想法?谢谢 我不明白为什么 Facebook 文档上没有提到这个如此重要的问题。我在其他任何地方都找不到这个。非常感谢@HeshamAbd-Elmegid。【参考方案2】:

对于 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。我希望这会有所帮助!

【讨论】:

【参考方案3】:

对于 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)

【讨论】:

【参考方案4】:

对于那些在 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)

这应该可行,但目前它只是一种解决方法

【讨论】:

【参考方案5】:

我刚刚遇到这个问题,感谢@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])

【讨论】:

【参考方案6】:

对于 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);
            


【讨论】:

这就是我们想要的!谢谢【参考方案7】:

您是否遵循了这些步骤?

- (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 委托中调用应用程序委托的点。 第二种方法很重要,因为它会向您的应用程序提供有关用户在 safari 中完成的登录的回调

【讨论】:

是的,我做到了。在我开始使用 iOS 9 构建之前,我的应用运行良好。 iOS 9.0 已弃用此方法。【参考方案8】:

我使用的是 old 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];

【讨论】:

对我来说就像一个魅力!【参考方案9】:

对于像我这样的新手来说,问题在于 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)

【讨论】:

【参考方案10】:

对于在这个问题上寻求 Swift 帮助的任何人,以下内容对我有用。

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

【讨论】:

以上是关于Facebook SDK 登录永远不会在 iOS 9 上回调我的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

ios facebook swift sdk 共享对话框永远不会返回成功

用户更改密码后 Facebook iOS SDK 不会打开登录 UI (iOS 6)

iOS:最新的 Parse SDK PFFacebookUtils 块永远不会被执行

使用 facebook sdk 为应用程序生成哈希键

Android Facebook 登录回调永远不会触发

调用 facebook ios sdk 的注销功能未清除用户凭据