Реалізація App Indexing для Android-додатку
App Indexing — механізм, який дозволяє Google індексувати контент всередину Android-додатку і показувати його у результатах пошуку. Користувач шукає в Google — бачить результат з deep link в ваш додаток, тапає — потрапляє одразу на потрібний екран. Якщо додаток не встановлено — перехід на веб-версію.
Технічно це зв'язка двох речей: App Links (верифікація домену для надійних deep link) та Firebase App Indexing SDK (індикація активності для персональних результатів пошуку).
App Links та верифікація домену
Без App Links Android показує disambiguation dialog («Відкрити через...»). З App Links система одразу відкриває ваш додаток, обходячи діалог.
Маніфест:
<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="yourdomain.com" android:pathPrefix="/products/" />
</intent-filter>
android:autoVerify="true" запускає верифікацію при встановленні: система звертається до https://yourdomain.com/.well-known/assetlinks.json. Якщо файл недоступний або некорректний — верифікація провалиться, діалог повернеться.
assetlinks.json повинен містити SHA-256 fingerprint сертифікату підпису APK. Для debug та release — різні сертифікати. При використанні Play App Signing потрібен fingerprint із Google Play Console, а не локального keystore.
Часта помилка: файл assetlinks.json віддається з Content-Type: text/plain замість application/json, або закритий авторизацією, або редиректить з www. Android верифікація не дотримується редиректів.
Firebase App Indexing SDK
FirebaseAppIndex.getInstance(context).update(
Indexable.Builder("Article")
.setName(article.title)
.setUrl("https://yourdomain.com/articles/${article.id}")
.setDescription(article.summary)
.put("keywords", article.tags.joinToString(","))
.build()
)
setUrl() — це той же URL що в App Links. Його Google індексує і показує у пошуку.
Індексуємо при кожному перегляді контенту користувачем. Для пакетної індексації — у WorkManager задачі при першому запуску або оновленні контенту. Не індексуємо весь каталог одразу в onCreate() — це сповільнює запуск.
App Indexing History. FirebaseUserActions.getInstance(context).start(action) / end(action) — логує дії користувача для персональних Siri (Google Assistant) пропозицій. Action.Builder(Action.Builder.VIEW_ACTION).setObject(title, url). Start — при відкритті контенту, End — при закритті.
Обробка deep link
class ArticleActivity : 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) {
val action = intent.action
val data = intent.data
if (Intent.ACTION_VIEW == action && data != null) {
val articleId = data.lastPathSegment
viewModel.loadArticle(articleId)
}
}
}
onNewIntent потрібен якщо Activity запущена з launchMode="singleTop" або singleTask — інакше повторний deep link не обробиться.
Web vs App: зв'язка контенту
Для коректної індексації Google контент по URL в App Links повинен збігатися з контентом на веб-сторінці. Сторінка повинна містити meta-теги:
<link rel="alternate" href="android-app://com.yourapp/https/yourdomain.com/articles/42">
Без цієї зв'язки Google може проіндексувати веб-версію, але не знати про додаток.
Тестування
adb shell am start -a android.intent.action.VIEW \
-d "https://yourdomain.com/products/123" com.yourapp
Перевірка верифікації App Links: adb shell pm get-app-links --user cur com.yourapp — повинна показати verified для вашого домену.
Google Search Console → Mobile Usability → App Indexing показує статус індексації.
Розклад
App Links + базове App Indexing: 2–3 тижні. Повна інтеграція з Firebase App Indexing, пакетною індексацією, Google Assistant actions: 4–7 тижнів. Вартість залежить від обсягу контенту та складності deep link схеми.







