Ios 谷歌登录与Facebook登录冲突

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登录就可

我正在使用并在我的应用程序中提供Google和Facebook登录

问题是,当我同时使用它们时,Facebook登录屏幕(基于Safari View Controller)不会在用户登录后关闭。

经过数小时痛苦的调试,我发现只有在显示Facebook登录提示之前初始化Google登录,问题才会出现

基本上,这是一条线

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: [:])
    }
}