---
title: "Test Firebase email-link sign-in on iOS and Android · Proxy Mail QA"
description: "Firebase email-link sign-in in mobile apps after Dynamic Links: ActionCodeSettings, Associated Domains, App Links, and testing the link on one device or two."
url: https://proxymail.qa/mobile/firebase-email-link
---

1. [Home](https://proxymail.qa/)
2. [Mobile apps](https://proxymail.qa/mobile)

# 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 October 15, 2026

## What changed after Dynamic Links

- **The link is on your Hosting domain.** With current SDKs, the email links to `PROJECT_ID.firebaseapp.com`, or to a custom Firebase Hosting domain you name with `linkDomain`. `dynamicLinkDomain` is deprecated: don’t set it.
- **Your app has to claim that domain.** On iOS through Associated Domains, on Android through a verified App Link. Without it, the link opens in the browser.
- **Old SDKs stopped working.** Apps on the Apple SDK before 11.8.0 or the Android Auth SDK before 23.2.0 send Dynamic Links, which no longer resolve. Flutter and React Native wrappers need versions built on those SDKs.
- **New projects don’t allow localhost.** Projects created after 28 April 2025 don’t list `localhost` as an authorised domain, so a continue URL on `localhost` is refused until you add it.

## The setup to test

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

Swift

```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

```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:

- **iOS:** add `applinks:PROJECT_ID.firebaseapp.com` (or your custom Hosting domain) under **Signing & Capabilities → Associated Domains**.
- **Android:** add an intent filter with `android:autoVerify="true"`, the `VIEW` action, the `DEFAULT` and `BROWSABLE` categories, scheme `https`, host `PROJECT_ID.firebaseapp.com` (or your custom domain) and `pathPrefix` `/__/auth/links`. Register the app’s SHA-1 and SHA-256 fingerprints in the Firebase console.

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](https://firebase.google.com/docs/auth/ios/email-link-auth) and [Android](https://firebase.google.com/docs/auth/android/email-link-auth) 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](https://proxymail.qa/docs/mobile), then open it with `XCUIApplication().open`, an `ACTION_VIEW` intent, Maestro’s `openLink` or Detox’s `device.openURL`.

## What to check

- **Same device, app closed.** Open the link with the app not running: it should launch, complete sign-in without asking for the address, and land on the right screen.
- **Same device, app open.** Open it while the app is on the sign-in screen.
- **Another device, or after reinstalling.** The saved address is gone, so the app must ask for it, and refuse a different address with a clear message.
- **Twice.** The second time, the link should be refused as already used, with a way to request a new one.
- **The continue URL.** If it points at `localhost` or `10.0.2.2`, Proxy Mail QA flags it, even inside Firebase’s mobile link. See [links that point at localhost](https://proxymail.qa/solve/localhost-links).

Platform setup beyond Firebase: [iOS](https://proxymail.qa/mobile/ios-sign-up-testing), [Android](https://proxymail.qa/mobile/android-sign-up-testing), [React Native and Expo](https://proxymail.qa/mobile/react-native-expo) and [Flutter](https://proxymail.qa/mobile/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 account](https://app.proxymail.qa/?mode=signup)

## 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.

## Related guides

- [Test sign-up emails in a SwiftUI or UIKit appCodes and Universal Links in the iOS simulator, by hand or in XCUITest, and the cold-start link bug to check for.](https://proxymail.qa/mobile/ios-sign-up-testing)
- [Test sign-up emails in an Android app (Kotlin)Codes and App Links on the emulator, by hand or in Espresso, and why a link opens Chrome instead of your app.](https://proxymail.qa/mobile/android-sign-up-testing)
- [Test sign-up emails and magic links in React Native and Expoexp:// and myapp:// links from Expo Go and development builds, opened in the simulator or from Detox.](https://proxymail.qa/mobile/react-native-expo)
- [Test sign-up emails in a Flutter appCodes in integration tests, deep links on both platforms, and Supabase or Firebase redirects that open the app.](https://proxymail.qa/mobile/flutter)

[See every email testing problem we solve](https://proxymail.qa/solve)
