Диплинки требуют подписки Pro plan или выше.
Это руководство поможет вам заменить Firebase Dynamic Links на Revroute для создания диплинков, отслеживания кликов и маршрутизации между платформами.
Предварительные требования
Перед началом убедитесь, что вы выполнили руководство быстрого старта для настройки диплинков в Revroute, включая следующие шаги:
- Настройте домен диплинков в Revroute. Это заменяет домен Firebase
*.page.linkна ваш собственный брендированный домен диплинков. - Создайте ваши диплинки в Revroute.
- Обработайте перенаправления диплинков в вашем приложении (подробности ниже).
Миграция Android-приложений
Удалите Firebase Dynamic Links SDK
Если у вас установлен Firebase Dynamic Links SDK, удалите его из файла build.gradle:
implementation 'com.google.firebase:firebase-dynamic-links:21.1.0'Удалите все импорты Firebase из ваших Kotlin/Java файлов:
import com.google.firebase.dynamiclinks.FirebaseDynamicLinks
import com.google.firebase.dynamiclinks.DynamicLinkОбновите AndroidManifest.xml
Если вы используете один и тот же домен для Firebase Dynamic Links и Revroute (например, yourapp.com), изменения не требуются — можете пропустить этот раздел.
Однако, если вы ранее использовали брендированный домен Firebase (например, yourapp.page.link), вам нужно заменить его на ваш пользовательский домен Revroute в конфигурации приложения.
<activity android:name=".MainActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="yourapp.page.link" /> <!-- Replace with your Revroute deep link domain -->
</intent-filter>
</activity>Реализуйте обработку диплинков
Переопределите onNewIntent в вашей основной activity для обработки открытий диплинков:
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
intent?.data?.let { uri ->
handleDeepLink(uri)
}
}
private fun handleDeepLink(uri: Uri) {
// Track the deep link open and get destination URL
trackDeepLinkClick(uri.toString())
}
private fun trackDeepLinkClick(deepLink: String) {
val url = URL("https://api.dub.co/track/open")
val connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "POST"
connection.setRequestProperty("Content-Type", "application/json")
connection.doOutput = true
val body = JSONObject().apply {
put("deepLink", deepLink)
}
connection.outputStream.use { os ->
os.write(body.toString().toByteArray())
}
val response = connection.inputStream.bufferedReader().use { it.readText() }
val jsonResponse = JSONObject(response)
val destinationUrl = jsonResponse.getString("url")
runOnUiThread {
navigateToDestination(destinationUrl)
}
}Этот код выполняет следующее:
- Извлекает домен и ключ из URL диплинка
- Отправляет данные на эндпоинт
/track/open - Получает финальный целевой URL
- Выполняет навигацию к целевому URL в приложении
Миграция iOS-приложений
Удалите Firebase Dynamic Links SDK
Если у вас установлен Firebase Dynamic Links SDK, удалите его из Podfile:
pod 'Firebase/DynamicLinks'Удалите все импорты Firebase, например:
import FirebaseDynamicLinksОбновите Associated Domains
Если вы используете один и тот же домен для Firebase Dynamic Links и Revroute (например, yourapp.com), изменения не требуются — можете пропустить этот раздел.
Однако, если вы использовали брендированный домен Firebase (например, yourapp.page.link), вам нужно заменить его на ваш домен Revroute в настройках проекта iOS.
Чтобы включить Universal Links с Revroute, обновите Associated Domains в Xcode:
- Откройте ваш проект Xcode.
- Выберите таргет приложения → Signing & Capabilities
- В разделе Associated Domains замените старый домен Firebase на ваш домен Revroute:
Изменения в Info.plist приложения не требуются, если у вас не было других специфических для Firebase конфигураций диплинков.
import Foundation
import UIKit
func handleDubDeepLink(\_ url: URL) {
let domain = url.host ?? ""
let key = url.lastPathComponent
let payload: [String: Any] = [
"domain": domain,
"key": key,
]
guard let requestURL = URL(string: "https://api.dub.co/track/open"),
let httpBody = try? JSONSerialization.data(withJSONObject: payload) else {
print("Invalid request setup")
return
}
var request = URLRequest(url: requestURL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = httpBody
// Send the request
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Failed to track deep link: \(error)")
return
}
guard let data = data,
let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
let destination = json["url"] as? String else {
print("Invalid response from /track/open")
return
}
print("Resolved destination: \(destination)")
DispatchQueue.main.async {
// Navigate to the destination URL or handle it in-app
navigateToScreen(from: destination)
}
}.resume()
}
func navigateToScreen(from url: String) {
print("Navigating to in-app destination: \(url)")
// Add your navigation logic here
}Этот код выполняет следующее:
- Отправляет URL диплинка на эндпоинт
/track/open - Получает финальный целевой URL
- Выполняет навигацию к целевому URL в приложении