麻烦处理GoogleloginSwift 3

我是新来的iOS,并在Swift 3中的应用程序委托URL处理有问题,我真的可以使用一些指针。

下面的代码在Swift 2.3中工作得很好:

func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool { return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey]) } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { var options: [String: AnyObject] = [UIApplicationOpenURLOptionsSourceApplicationKey: sourceApplication, UIApplicationOpenURLOptionsAnnotationKey: annotation] return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: sourceApplication, annotation: annotation) } 

当我直接从Firebase网站粘贴swift 2.3代码时,Xcode提示我很多方法已经改变。 特别是options对象。

在Swift 2.3中,我可以使用options[UIApplicationOpenURLOptionsSourceApplicationKey]和注解使用options[UIApplicationOpenURLOptionsAnnotationKey]来访问源应用程序。

Xcode提示我将其更改为UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as StringUIApplicationOpenURLOptionsKey.annotation._rawValue as String

然而,当我提出修改build议时,Google会返回一个url,但没有任何反应。 而不是redirect到应用程序,它进入本地的谷歌网站,对我来说:www.google.co.nz

完整的Swift 3版本我看起来像这样:

 func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool { print(UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String) print(UIApplicationOpenURLOptionsKey.annotation._rawValue as String) return GIDSignIn.sharedInstance().handle(url as URL!, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation._rawValue as String]) } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { var options: [String: AnyObject] = [UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String: sourceApplication as AnyObject, UIApplicationOpenURLOptionsKey.annotation._rawValue as String: annotation!] print(UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String) print(UIApplicationOpenURLOptionsKey.annotation._rawValue as String) return GIDSignIn.sharedInstance().handle(url as URL!, sourceApplication: sourceApplication, annotation: annotation) } 

Xcode 8 Swift 3

如果您在使用Googlelogin时使用多个URLscheme,请使用如下所示:

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { if(url.scheme!.isEqual("fbXXXXXXXXXXX")) { return SDKApplicationDelegate.shared.application(app, open: url, options: options) } else { return GIDSignIn.sharedInstance().handle(url as URL!, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) } } 

尝试在AppDelegate的“signIn”函数中执行任何操作。

Google向您发送一些数据后:

 func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) { if (error == nil) { // Perform any operations on signed in user here. let userId = user.userID // Perform some operation to change the scene. // ........ } else { print("\(error.localizedDescription)") } } 

也许下面的代码可以给你一些想法:

 let myStoryBoard:UIStoryboard = UIStoryboard(name:"Main", bundle:nil) let protectedPage = myStoryBoard.instantiateViewControllerWithIdentifier("ProtectedPageViewController") as! ProtectedPageViewController let protectedPageNav = UINavigationController(rootViewController: protectedPage) let appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate appDelegate.window?.rootViewController = protectedPageNav 

??? 我从YouTube上的“Sergey Kargopolov”提供的video“用Google帐户loginbutton,Swift.Video 2中的示例”中提及。

和…

我有一个类似的问题,并没有解决它…

祝你好运! 🙂

虽然n.by.n答案是好的,我在另一个线程(Swift 2.3)中看到了更好的答案:

 if GIDSignIn.sharedInstance().handle(url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) { return true } else if something else { return true } else { return false }