Ios 谷歌登录与Facebook登录冲突
我正在使用并在我的应用程序中提供Google和Facebook登录 问题是,当我同时使用它们时,Facebook登录屏幕(基于Safari View Controller)不会在用户登录后关闭。 经过数小时痛苦的调试,我发现只有在显示Facebook登录提示之前初始化Google登录,问题才会出现 基本上,这是一条线Ios 谷歌登录与Facebook登录冲突,ios,xcode,swift,facebook-sdk-4.0,google-login,Ios,Xcode,Swift,Facebook Sdk 4.0,Google Login,我正在使用并在我的应用程序中提供Google和Facebook登录 问题是,当我同时使用它们时,Facebook登录屏幕(基于Safari View Controller)不会在用户登录后关闭。 经过数小时痛苦的调试,我发现只有在显示Facebook登录提示之前初始化Google登录,问题才会出现 基本上,这是一条线 GGLContext.sharedInstance().configureWithError(&configureError) 如果我评论这句话,Facebook登录就可
GGLContext.sharedInstance().configureWithError(&configureError)
如果我评论这句话,Facebook登录就可以了
编辑:这是我的AppDelegate.swift中的内容:
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])
可悲的是,这个方法根本没有被调用。
但是,如果我禁用谷歌登录-它可以正常工作
其他详情:
我正在使用Facebook SDK v4.12.0和Google登录SDK v4.0.0
Xcode版本7.3.1(7D1014),在iOS 9.3上测试
欢迎提出任何意见 我也同时使用谷歌和facebook登录,它工作正常。你必须使用下面的方法
func应用程序(应用程序:UIApplication,openURL:NSURL,sourceApplication:String,注释:AnyObject)->Bool
as
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject) -> Bool {
if url.absoluteString().containsString("FACEBOOK_ID") {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
else {
return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: sourceApplication, annotation: annotation)
}
}
好了,伙计们,我终于明白了。 对我有效的技巧是在Facebook SDK之前初始化Google登录SDK 现在,我的AppDelegate如下所示:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Initialize google sign-in
var configureError: NSError?
GGLContext.sharedInstance().configureWithError(&configureError)
assert(configureError == nil, "Error configuring Google services: \(configureError)")
// init FB SDK
FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
return true
}
如果您使用google文档集成他们的auth系统,请不要使用以下方法:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
var returnVal = false
if #available(iOS 9.0, *) {
returnVal = GIDSignIn.sharedInstance().handle(url,sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,annotation: options[UIApplicationOpenURLOptionsKey.annotation])
} else {
returnVal = false
}
return returnVal
}
这应该可以避免与iOS 9发生冲突,但一旦我删除了它,fb登录和google登录都可以在iOS 9设备上运行
希望这对任何人都有帮助。在Swift 3(iOs 10)中,只需这样做:(对我来说效果很好)
这在Swift 3上奏效了:我在同一个页面上登录了Facebook和Google
@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
print( " open URL : \(url.absoluteURL.absoluteString)")
if url.absoluteURL.absoluteString.contains("fb728991920603705") //Facebook ID from Plist
{
print("contain FB ID")
return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)
}
else {
let result = GIDSignIn.sharedInstance().handle(url,
//added exclamation mark
sourceApplication: String(describing: options[UIApplicationOpenURLOptionsKey.sourceApplication]!),
annotation: options[UIApplicationOpenURLOptionsKey.annotation])
return result
}
}
我刚刚用最新版本的Facebook和Google pods以及Swift 3.1实现了这段代码,效果非常好
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
if url.absoluteString.contains("facebook") {
return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:])
} else {
return GIDSignIn.sharedInstance().handle(url,
sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
annotation: [:])
}
}
调用的一行代码是何时/何处?它在应用程序启动时(didFinishLaunchingWithOptions)调用,但在FBSDKApplicationDelegate.sharedInstance()之后调用。应用程序(应用程序,didFinishLaunchingWithOptions:launchOptions)在didFinishLaunchingWithOptions函数中,返回如下:-
返回FBSDKApplicationDelegate.sharedInstance().application(application,didFinishLaunchingWithOptions:launchOptions)
哪个方法不被调用?应用程序…openURL
方法?所以,如果你把断点放在那里,它就不起作用了?你看了吗?请阅读对我问题的编辑。问题是,在我的例子中,应用程序……openURL
方法根本没有被调用。一旦我用GlgContext注释这行,就会调用应用程序…openURL
方法。只要按照我的回答中显示的那样尝试返回google。目前,你只返回facebook。好的,我已经尝试了你的解决方案,但它不起作用。Facebook登录提示仍然存在。不管怎样,我不明白如果方法应用程序…openURL
根本没有被调用,这怎么可能起作用。这就是我在回答中所做的,我评论道:)人们一直在建议这样做。它可能是工作代码,但与我的问题无关。如果你读了我的问题,你会注意到在我的例子中,根本没有调用方法application:openurl:options:。它可能是工作代码,但与我的问题无关。如果你读了我的问题,你会注意到在我的例子中,根本没有调用方法application:openurl:options:。它可能是工作代码,但与我的问题无关。如果你读了我的问题,你会注意到在我的例子中,根本没有调用方法应用程序:openURL:options:。你在代码中使用了“openURL:NSURL”,我为那些偶然发现你的问题并使用Xcode 8和Swift 3.1的人提供了一个解决方案。我不是建议您使用Xcode 7.3.1版实现我的代码。
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
if url.absoluteString.contains("facebook") {
return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:])
} else {
return GIDSignIn.sharedInstance().handle(url,
sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
annotation: [:])
}
}