← Back to Documentation
Migration Guide

How to Replace Firebase Dynamic Links with DeepTap

Firebase Dynamic Links was shut down on August 25, 2025. Here's how to migrate your app to DeepTap using native iOS Universal Links and Android App Links.

What Changed

Firebase Dynamic Links Shutdown

Google shut down Firebase Dynamic Links on August 25, 2025. All existing dynamic links have stopped working, and the SDK no longer functions.

If your app used Firebase Dynamic Links for deep linking, you need to migrate to a new solution. DeepTap provides a replacement using native iOS Universal Links and Android App Links.

The good news: Native deep links are actually simpler and more reliable than Firebase Dynamic Links. They don't require an SDK, which means smaller app binaries and fewer dependencies.

Migration Steps

1

Create a DeepTap Account

Sign up for DeepTap and create a subdomain for your app (e.g., myapp.deeptap.io).

Go to Dashboard →
2

Configure Your App Credentials

In the DeepTap dashboard, enter your app credentials:

  • iOS: Team ID and Bundle Identifier
  • Android: Package Name and SHA-256 Certificate Fingerprints
3

Update Your App Configuration

Update your app to use the new DeepTap domain:

iOS - Associated Domains (Xcode)

applinks:myapp.deeptap.io

Android - Intent Filter Host (AndroidManifest.xml)

android:host="myapp.deeptap.io"
4

Update Your Links

Update any hardcoded links in your marketing materials, emails, push notifications, and other external sources to use your new DeepTap domain.

Old Firebase Link

https://myapp.page.link/promo

New DeepTap Link

https://myapp.deeptap.io/promo
5

Remove Firebase SDK

Remove the Firebase Dynamic Links SDK from your app. Native Universal Links and App Links don't require any SDK - they use built-in OS capabilities.

Code Changes Required

iOS Changes

Before (Firebase Dynamic Links):

import FirebaseDynamicLinks

// In AppDelegate
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

    let handled = DynamicLinks.dynamicLinks()
        .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in
            guard let link = dynamiclink?.url else { return }
            // Handle the dynamic link
        }
    return handled
}

After (Native Universal Links - No SDK):

// No import needed!

// In AppDelegate
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else { return false }

    // Handle the URL directly - it's already the final destination
    handleDeepLink(url)
    return true
}

func handleDeepLink(_ url: URL) {
    let path = url.path  // e.g., "/promo" or "/product/123"
    // Route to the appropriate screen based on path
}

SwiftUI Alternative:

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL { url in
                    handleDeepLink(url)
                }
        }
    }

    func handleDeepLink(_ url: URL) {
        let path = url.path
        // Route to the appropriate screen
    }
}

Android Changes

Before (Firebase Dynamic Links):

import com.google.firebase.dynamiclinks.ktx.dynamicLinks
import com.google.firebase.ktx.Firebase

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Firebase.dynamicLinks
            .getDynamicLink(intent)
            .addOnSuccessListener { pendingDynamicLinkData ->
                val deepLink = pendingDynamicLinkData?.link
                if (deepLink != null) {
                    // Handle the deep link
                }
            }
    }
}

After (Native App Links - No SDK):

// No Firebase import needed!

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_VIEW == intent.action) {
            val data: Uri? = intent.data
            if (data != null) {
                val path = data.path  // e.g., "/promo" or "/product/123"
                // Route to the appropriate screen based on path
                handleDeepLink(path)
            }
        }
    }
}

What You Lose / What You Gain

What You Lose

  • -Firebase Analytics Integration: Deep link analytics were tied to Firebase Analytics
  • -Deferred Deep Linking: Firebase could pass data to users who installed the app after clicking a link
  • -Short Links: Firebase provided automatic link shortening

What You Gain

  • +No SDK Dependency: Remove Firebase SDK, reducing app size and complexity
  • +Native Performance: Universal Links and App Links are handled by the OS, not a third-party SDK
  • +No Vendor Lock-in: Standard protocols work with any hosting provider
  • +Simpler Code: Direct URL handling without callbacks and async wrappers

Custom Domain Option

By default, DeepTap provides subdomains under *.deeptap.io. However, for enterprise users who need to keep their existing domain or use a custom branded domain, we offer custom domain setup.

With a custom domain, you can use URLs like links.yourcompany.com instead of yourcompany.deeptap.io.

Contact Support for Custom Domains

Ready to Migrate?

Create your DeepTap subdomain and start configuring your deep links in minutes.