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.
On This Page
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
Create a DeepTap Account
Sign up for DeepTap and create a subdomain for your app (e.g., myapp.deeptap.io).
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
Update Your App Configuration
Update your app to use the new DeepTap domain:
iOS - Associated Domains (Xcode)
applinks:myapp.deeptap.ioAndroid - Intent Filter Host (AndroidManifest.xml)
android:host="myapp.deeptap.io"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/promoNew DeepTap Link
https://myapp.deeptap.io/promoRemove 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.