iOS swift You must specify clientID Exception in google integration

匿名 (未验证) 提交于 2019-12-03 01:34:02

问题:

Code:

let signIn = GPPSignIn.sharedInstance()         signIn.shouldFetchGooglePlusUser = true         signIn.clientID = "912597493260-qg351fl8olmnmjl8qobos8n6u909jp0o.apps.googleusercontent.com"         signIn.scopes = [kGTLAuthScopePlusLogin];         signIn.trySilentAuthentication();         GIDSignIn.sharedInstance().signInSilently()         signIn.delegate = self 

due to uncaught exception 'NSInvalidArgumentException', reason: 'You must specify |clientID| for |GIDSignIn|

I double checked my code.Even i set client-id getting this exception.Where i went wrong?any help will be appreciated.thanks in advance

回答1:

I was following Google's own guide for adding Sign-In here. I followed it step by step - integrated the google configuration file too. As per the guide, if the configuration file was included, setting the client id manually was not required. Unfortunately, I encountered exactly the same error when I run the app and hit the Sign-In button:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'You must specify |clientID| for |GIDSignIn|'

Solution:

For some reason, clientID was not automatically picked from the configuration file. We should instead configure the GIDSignIn object directly, (using the client ID found in the GoogleService-Info.plist file) in the app delegate's application:didFinishLaunchingWithOptions: method:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {       // Initialize sign-in       var configureError: NSError?       GGLContext.sharedInstance().configureWithError(&configureError)       assert(configureError == nil, "Error configuring Google services: \(configureError)")       GIDSignIn.sharedInstance().clientID = "Cliend id From GoogleService-Info.plist file"       GIDSignIn.sharedInstance().delegate = self       return true } 

Also, if you are using Firebase, you can do it this way too:

GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID 


回答2:

It looks like the auto-generated config file, GoogleService-Info.plist, will include the wrong credentials by default; it includes the Web Client credentials instead of the iOS app credentials.

You need to correct the Client ID and the Reverse Client ID in the GoogleService-Info.plist.

Since these credentials are also used in your app's URLSchemes, you need to correct this there too.



回答3:

The clientId definitely does get picked up from the .plist file. If it appears not to be, it is likely that your code is attempting to use the sign-in object before it has been properly configured. Set a breakpoint on your configureWithError line, and make sure that it gets hit before any attempt to set a delegate, perform silent sign-in, etc.



回答4:

Looks like the sign in method has now been updated by google, I was implementing the Google Calendar for iOS app and I found the following code for Sign In:

func applicationDidFinishLaunching(_ application: UIApplication) {         // Initialize sign-in         var configureError: NSError?         GGLContext.sharedInstance().configureWithError(&configureError)         assert(configureError == nil, "Error configuring Google services: \(configureError!)")     } 

in their document which gave the same error:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'You must specify |clientID| for |GIDSignIn|' 

I took the lines which were inside:

func applicationDidFinishLaunching(_ application: UIApplication) 

and put them in this method and sign in worked:

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

Code for refernce:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {     // Override point for customization after application launch.      // Initialize sign-in     var configureError: NSError?     GGLContext.sharedInstance().configureWithError(&configureError)     assert(configureError == nil, "Error configuring Google services: \(configureError!)")     return true } 


回答5:

You may need to obtain GoogleService-Info.plist from https://console.firebase.google.com rather than https://console.developers.google.com/.



回答6:

Using Firebase remember also that you have to call Firebase.configure() function before you set the clientId. Otherwise, it won't work.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!