I am new to iOS and am having trouble with app delegate URL handling in Swift 3, and I could really use some pointers.
The below code works perfectly fine in 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)
}
When I paste the swift 2.3 code straight from the Firebase website, Xcode prompts me that a lot of the methods have changed. In particular, the options
object.
In Swift 2.3, I can access the source application using options[UIApplicationOpenURLOptionsSourceApplicationKey]
and the annotation using options[UIApplicationOpenURLOptionsAnnotationKey]
Xcode prompts me to change it to UIApplicationOpenURLOptionsKey.sourceApplication._rawValue as String
and UIApplicationOpenURLOptionsKey.annotation._rawValue as String
Yet when I make the suggested changes, Google returns a URL, but nothing happens. Instead of redirecting to the app, it proceeds to enter the local google site, for me: www.google.co.nz
The full Swift 3 version I have looks like this:
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
If you are using multiple URL Schemes along with Google Sign In, use it like this:
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])
}
}
Swift 4, Xcode 9
If you are using multiple URLSchemes for facebook and Google SignIn:
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
let fbSignIn = FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
let googleSignIn = GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation)
return fbSignIn || googleSignIn
}
For swift 5 Xcode 10.3 (Latest google signin)
@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
let googleDidHandle = GIDSignIn.sharedInstance().handle(url)
return googleDidHandle
}
func application(_ application: UIApplication,open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
let googleDidHandle = GIDSignIn.sharedInstance().handle(url)
return googleDidHandle
}
To open signIn screen on Button click
@IBAction func btnGoogleSigninClick(_ sender: AnyObject) {
GIDSignIn.sharedInstance()?.presentingViewController = self
GIDSignIn.sharedInstance()?.restorePreviousSignIn()
GIDSignIn.sharedInstance().signIn()
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With