iOS 9中使用Facebook OpenURL进行登录的方法(iOS Swift)

3

我的应用程序中同时集成了 Facebook 和 Gmail 登录,但是当我添加了 Gmail 登录的 open url 功能时,Facebook 登录就停止工作了。

以下是我应用程序中用于 open url 的代码:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {

    var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application,openURL: url,sourceApplication: sourceApplication,annotation: annotation)

    shouldOpen = shouldOpen ? shouldOpen : GIDSignIn.sharedInstance().handleURL(url,
                                                                                sourceApplication: sourceApplication,
                                                                                annotation: annotation)

    return shouldOpen

}

这在Facebook登录时运作良好,但当我为iOS 9添加Gmail的openurl方法时,问题就出现了,即在Facebook登录后,我们无法重定向回应用程序。在模拟器中,白色屏幕显示在Safari中。这是iOS 9的Gmail登录代码:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
    if #available(iOS 9.0, *) {

        return GIDSignIn.sharedInstance().handleURL(url,
                                                    sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String?,
                                                    annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
    }
    return true
}

如果我把上面的代码注释掉,Facebook登录就可以正常工作了。我猜问题可能是在iOS 9中,我也必须为Facebook的openurl返回布尔值。但我不知道该怎么做?谢谢。


http://stackoverflow.com/questions/36543729/google-sign-in-api/36545047#36545047 - Sahil
3个回答

3

我找到了答案,我需要实现openurl的两种方法,像这样:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {

    var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application,openURL: url,sourceApplication: sourceApplication,annotation: annotation)

    shouldOpen = shouldOpen ? shouldOpen : GIDSignIn.sharedInstance().handleURL(url,
                                                                                sourceApplication: sourceApplication,
                                                                                annotation: annotation)
    return shouldOpen

}

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
    if #available(iOS 9.0, *) {
        var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(
            app,
            openURL: url,
            sourceApplication: options["UIApplicationOpenURLOptionsSourceApplicationKey"] as! String,
            annotation: nil)

        shouldOpen = shouldOpen ? shouldOpen : GIDSignIn.sharedInstance().handleURL(url,sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String?,
                                                                                    annotation: options[UIApplicationOpenURLOptionsAnnotationKey])

        return shouldOpen
    }
    return true
}

我只需要检查iOS 9下Facebook打开URL的方法。

针对Swift 3.0进行编辑,函数已更改。

private func application(application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool {


    return  FBSDKApplicationDelegate.sharedInstance().application(application,open: url as URL!,sourceApplication: sourceApplication,annotation: annotation)

}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    if #available(iOS 9.0 , *){
     return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: "UIApplicationOpenURLOptionsKey", annotation: nil)   

    }

return true
}

这对于带有FBSDKLoginButton的iOS 10 Beta也适用;但使用sourceApplication的方法已经过时了,仅使用第二种方法。 - tech4242
这就是我正在寻找的那个。+1 使用三元运算符。但如果我使用另一个URL方案,它会有所影响 :) - Anand

1

我尝试了@Aruk k的答案,但对我没有用。

过去一个月,我也遇到了这个问题。我按照所有步骤和教程进行了操作,但什么都没用。我正在将Facebook登录与iOS 10 Swift 3中的Firebase集成。最终,我成功地实现了它。我通过在AppDelegate文件中进行以下更改来进行修正。

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        FIRApp.configure()
        FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
          return true
    }


    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
        -> Bool {
            var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application,  open: url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!,annotation: options[UIApplicationOpenURLOptionsKey.annotation])
            return shouldOpen
    }

    // for iOS below 9.0
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application,open: url as URL!,sourceApplication: sourceApplication,annotation: annotation)
        return shouldOpen
    }

我希望你能为其他人提供帮助。 在iOS 10.2模拟器和运行iOS 10.2的iPhone 6 Plus上进行了测试。

0

Swift 4. Xcode 9. iOS 11. Google SignIn + Facebook SignIn. AppDelegate.

Swift 4。Xcode 9。iOS 11。Google登录+Facebook登录。AppDelegate。

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

    var signedIn: Bool = GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation)

    signedIn = signedIn ? signedIn : FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)

    return signedIn
}

@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {

    var signedIn: Bool = GIDSignIn.sharedInstance().handle(url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])

    signedIn = signedIn ? signedIn : FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: nil)

    return signedIn
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接