Налаштування In-App Review (запис відзиву) у мобільному додатку
SKStoreReviewRequest на iOS та In-App Review API на Android — це нативні діалоги, що дозволяють користувачеві залишити оцінку без виходу з додатка. Конверсія нативного діалогу значительно вища, ніж у кастомного popover з пропозицією «перейти у App Store».
iOS: SKStoreReviewRequest
import StoreKit
// iOS 16+
func requestReviewIfAppropriate() {
guard let scene = UIApplication.shared.connectedScenes
.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
else { return }
SKStoreReview.requestReview(in: scene)
}
Ключове обмеження: Apple дозволяє показувати діалог не більше 3 разів за 365 днів незалежно від того, як часто вызівается requestReview. Виклик поверх ліміту — iOS просто не показує діалог. Никакого callback про те, був ли діалог показаний, — немає.
Це означає: три моменти показу у рік — це весь бюджет. Тратити їх на користувачів, які щойно встановили додаток, — розточлива. Оптимальний момент:
- Після завершення основної дії (користувач досяг цілі)
- Після N сесій (5–10), не при першому запуску
- Після позитивної события: перший успішний платіж, перший завершений проект
Перевірка у Xcode Simulator: діалог показується кожен раз, не підлягаючи ліміту — це тільки для розроблення. На реальному пристрої — ліміт працює.
Android: In-App Review API
// build.gradle
implementation 'com.google.android.play:review:2.0.1'
implementation 'com.google.android.play:review-ktx:2.0.1'
class MainActivity : AppCompatActivity() {
private lateinit var reviewManager: ReviewManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
reviewManager = ReviewManagerFactory.create(this)
}
fun requestInAppReview() {
val request = reviewManager.requestReviewFlow()
request.addOnCompleteListener { task ->
if (task.isSuccessful) {
val reviewInfo = task.result
val flow = reviewManager.launchReviewFlow(this, reviewInfo)
flow.addOnCompleteListener {
// Діалог завершен (або не був показаний)
// Немає інформації про те, оставив користувач відзив
}
}
}
}
}
Аналогічно iOS: Google не гарантує, що діалог буде показаний. Внутрішня квота Google — невідома публічно, але по практиці: не більше одного разу на 30 днів на користувача. Спроба вызвать launchReviewFlow частіше — діалог не з'явиться без помилки.
Тестування на Android
У DEBUG-сборке діалог не працює реалистично. Для тестування — FakeReviewManager:
val reviewManager = if (BuildConfig.DEBUG) {
FakeReviewManager(context)
} else {
ReviewManagerFactory.create(context)
}
FakeReviewManager завжди показує діалог без квот — зручно для QA.
Момент запиту: головний фактор
Неверний момент — головна причина низької конверсії In-App Review. Типові антипаттерни:
- При першому запуску: користувач ще не зрозумів цінність
- При помилці або неудачній дії: запрос відзиву після краху
- При виході з додатка: діалог перекриває процес, раздражає
- Примусово через 3 дні після встановлення без урахування активності
Що працює: запрос після того, як користувач продемонстрував вовлеченість. Наприклад, у додатку для читання — після завершення третьої книги. У трекері звичок — після 7-денного стрика. У e-commerce — після другого успішного замовлення.
Обходне шляхи при достиженню ліміту
Коли квота вичерпана, нативний діалог не з'явиться. Стандартна практика: запропонувати користувачеві перейти у магазин через deeplink.
// iOS — deeplink у App Store на сторінку відзивів
let appID = "123456789"
let url = URL(string: "https://apps.apple.com/app/id\(appID)?action=write-review")!
UIApplication.shared.open(url)
// Android — deeplink у Google Play
val uri = Uri.parse("market://details?id=${packageName}")
val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)
Показувати цей deeplink тільки користувачам з високим NPS або після явного позитивного сигналу.
Процес роботи
Визначення оптимального моменту для запиту на основі користувальницького флоу.
Інтеграція SKStoreReviewRequest (iOS) та In-App Review API (Android).
Налаштування FakeReviewManager для тестування.
Опціональний fallback на deeplink для користувачів за межами квоти.
Орієнтири по строкам
Інтеграція In-App Review для iOS та Android — 2–4 години. З розробленням логіки визначення моменту показу на основі користувальницьких подій — 1 день.







