Fixing `GoogleSignIn 0x10461abdc -[GIDSignIn signInWithConfiguration:presentingViewController:hint:additionalScopes:callback:] + 228 (GIDSignIn.m:242)` in Flutter iOS
I recently started using flutterfire_ui's SignInScreen
, and it was working great for Android and Web, but not iOS. For some reason, when I clicked on "Sign in with Google", it would crash the app, and throw this debug info:
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0
Last Exception Backtrace:
0 CoreFoundation 0x111f482f8 __exceptionPreprocess + 160
1 libobjc.A.dylib 0x10551131c objc_exception_throw + 56
2 CoreFoundation 0x111f48214 -[NSException initWithCoder:] + 0
3 GoogleSignIn 0x10461bf2c -[GIDSignIn signInWithOptions:] + 364 (GIDSignIn.m:529)
4 GoogleSignIn 0x10461abdc -[GIDSignIn signInWithConfiguration:presentingViewController:hint:additionalScopes:callback:] + 228 (GIDSignIn.m:242)
5 Runner 0x10268a718 -[FLTGoogleSignInPlugin handleMethodCall:result:] + 1776
6 Flutter 0x115401520 __45-[FlutterMethodChannel setMethodCallHandler:]_block_invoke + 112
7 Flutter 0x114e8a328 invocation function for block in flutter::PlatformMessageHandlerIos::HandlePlatformMessage(std::__1::unique_ptr<flutter::PlatformMessage, std::__1::default_delete<flutter::PlatformMessage> >) + 108
8 libdispatch.dylib 0x10bd41fa4 _dispatch_call_block_and_release + 24
9 libdispatch.dylib 0x10bd43768 _dispatch_client_callout + 16
10 libdispatch.dylib 0x10bd53018 _dispatch_main_queue_drain + 1220
11 libdispatch.dylib 0x10bd52b44 _dispatch_main_queue_callback_4CF + 40
12 CoreFoundation 0x111eacb88 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
13 CoreFoundation 0x111ea7318 __CFRunLoopRun + 1956
14 CoreFoundation 0x111ea675c CFRunLoopRunSpecific + 584
15 GraphicsServices 0x113317c98 GSEventRunModal + 160
16 UIKitCore 0x131ee0b74 -[UIApplication _run] + 868
17 UIKitCore 0x131ee4b1c UIApplicationMain + 124
18 Runner 0x102580cd4 main + 64 (AppDelegate.swift:5)
19 dyld_sim 0x102a29fa0 start_sim + 20
20 dyld 0x102aed08c start + 520
21 ??? 0xec63800000000000 ???
I tried looking at the repo's GitHub issues but there was nothing.
However, as it crashed in Debug mode, I noticed that some human-readable error message was briefly displayed. So I used QuickTime and started a screen recording. I clicked "Sign in with Google", and crashed the app. Then I watched the recording again. Here's the error it captured:
Unhandled Exception: PlatformException(google_sign_in, Your app is missing support for the following URL schemes: com.googleusercontent.apps....
It looked familiar, so I searched for that string in my project. I also went into the Firebase Console to check. It turns out I was initializing SignInScreen
with a Google Client ID specific to Web. Instead, I should have passed the platform specific Google Client ID. So I fixed my initialization from:
final String googleClientId = 'some hard coded string';
SignInScreen(
auth: auth,
providerConfigs: [
GoogleProviderConfiguration(
clientId: googleClientId,
)
],
...
to
final String googleClientId = kIsWeb
? [web specific Google Client ID]
: (Platform.isAndroid
? DefaultFirebaseOptions.android.androidClientId
: DefaultFirebaseOptions.ios.iosClientId);
SignInScreen(
auth: auth,
providerConfigs: [
GoogleProviderConfiguration(
clientId: googleClientId,
)
],
...
And it started working for all platforms. Btw, if the Google Client ID used was the one for Web, why did it even work with Android in the first place? I have no idea.
March 2023 update
I am using flutterfire_cli version 0.2.7, and I have encountered a new bug. In this version, the CLI tool generates the wrong firebase_option
objects: the androidClientId String is in the ios map, not in the android one, so for now I have to use DefaultFirebaseOptions.ios.androidClientId
or it'll throw a null pointer exception.