Proxy Mail QA

Testing Firebase email-link sign-in on iOS and Android

Firebase Dynamic Links shut down on 25 August 2025, and with them the old way an email sign-in link opened a mobile app. Current Firebase SDKs send the link through your Firebase Hosting domain instead. That's new setup on both platforms, and a flow worth testing end to end.

Updated

The setup to test

Send the link with handleCodeInApp on, your continue URL, and both app IDs. On iOS:

Swift
let settings = ActionCodeSettings()
settings.url = URL(string: "https://example.com/finish-sign-in")
settings.handleCodeInApp = true
settings.setIOSBundleID(Bundle.main.bundleIdentifier!)
settings.setAndroidPackageName("com.example.android", installIfNotAvailable: false, minimumVersion: "12")

try await Auth.auth().sendSignInLink(toEmail: email, actionCodeSettings: settings)
UserDefaults.standard.set(email, forKey: "Email")

On Android:

Kotlin
val settings = actionCodeSettings {
    url = "https://example.com/finish-sign-in"
    handleCodeInApp = true
    setIOSBundleId("com.example.ios")
    setAndroidPackageName("com.example.android", true, "12")
}
Firebase.auth.sendSignInLinkToEmail(email, settings)

The continue URL’s domain must be in Authentication → Settings → Authorized domains. Then:

When the link opens the app, check it and sign in with the saved address: Auth.auth().isSignIn(withEmailLink:) and signIn(withEmail:link:) on iOS, isSignInWithEmailLink(link) and signInWithEmailLink(email, link) on Android. Firebase’s guides for iOS and Android have the details.

Test it end to end

  1. Create an address in Proxy Mail QA and enter it in your app’s sign-in screen in the simulator or emulator.
  2. The link arrives on the address’s row as a sign-in link. Nothing has opened it.
  3. Open it on the device, not in your desktop browser: xcrun simctl openurl booted '<link>' on iOS, adb shell "am start -W -a android.intent.action.VIEW -d '<link>'" on Android. The app should open, not the browser.
  4. Check you’re signed in as that address, and land where your app sends people after signing in.

In a UI test, wait for a link of type magic_signin with the helper from the mobile guides, then open it with XCUIApplication().open, an ACTION_VIEW intent, Maestro’s openLink or Detox’s device.openURL.

What to check

Platform setup beyond Firebase: iOS, Android, React Native and Expo and Flutter.

Try it on your next sign-up test

Free plan, no credit card. Create an address and watch the code or link arrive.

Create a free accountOpen the app

Questions

Does Firebase email-link sign-in still work without Dynamic Links?

Yes, with the Firebase Apple SDK 11.8.0 or later and the Android Auth SDK 23.2.0 or later. They build the link on your Firebase Hosting domain (PROJECT_ID.firebaseapp.com, or a custom Hosting domain set with linkDomain). Leave dynamicLinkDomain unset: it's deprecated. Older SDKs still use Dynamic Links and their links no longer work.

Why does the sign-in link open the browser instead of my app?

The app isn't associated with the Hosting domain. On iOS, add applinks:PROJECT_ID.firebaseapp.com (or your custom domain) to Associated Domains. On Android, add an intent filter with autoVerify for that host and the /__/auth/links path, and register the app's SHA-1 and SHA-256 fingerprints in the Firebase console.

Why does my app ask for the email address again?

Completing sign-in needs the same address the link was sent to. Apps usually save it when sending the link, so on the same device it's filled in for you. Opened on another device, or after reinstalling, the app has to ask. That's by design, and worth testing.

Will testing use up the link?

Not on our side. Proxy Mail QA never opens, scans or prefetches links, so the link is still unused when your test or simulator opens it.

See every email testing problem we solve