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 视图控制器永远不会被关闭。它加载一个新的空白页面,然后什么也不做。如果我点击完成按钮,返回的FBSDKLoginManagerLoginResult
的isCancelled
为真。
SDK 选择 Safari 视图控制器而不是 Facebook 应用程序是否正常?为什么登录完成后没有收到回调?
【问题讨论】:
关于重定向到app:有一个名为FBSDKLoginBehavior的属性来设置登录行为(可以设置通过old school webview、system或FB app登录)。如果您对默认登录名是 SFSafariViewController 感到沮丧,请在此处加入俱乐部:developers.facebook.com/bugs/786729821439894/?search_id 【参考方案1】:事实证明,在 iOS 9 上,当 UIApplicationDelegate
的 application:openURL:options:
被实现时,application:openURL:sourceApplication:annotation:
将不会被调用。
所以我要做的就是从UIApplicationDelegate
的application:openURL:options:
调用FBSDKApplicationDelegate
的application: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)