- PVSM.RU - https://www.pvsm.ru -
Среди многообразия инструментов, анонсированных на Android Dev Summit [1], особое внимание хочется уделить механизму обновления приложения In-App Updates (IAUs), который помогает разработчикам ускорить добавление новых фич, баг-фиксов и улучшений производительности. Поскольку эта функциональность была опубликована [2] после Google I/O 2019, в этой статье я подробно расскажу об IAUs, опишу рекомендованные схемы реализации и приведу некоторые примеры кода. Также я расскажу о нашем опыте интеграции IAUs в Pandao [3], приложение для заказа товаров из Китая.
Новый API позволяет разработчикам инициировать обновление приложения до последней доступной в Google Play версии. Таким образом IAUs дополняет уже существующий механизм автоматического обновления Google Play. IAUs содержит несколько схем реализации, которые принципиально различаются с точки зрения взаимодействия с пользователем.
Поскольку второй вариант не так важен и меньше подходит для приложения Pandao, разберём подробнее сценарий Flexible Flow.
Процесс обновления с помощью IAUs состоит из нескольких шагов.
Если установка скачанного обновления не была завершена, то Google Play может завершить установку в фоновом режиме. Данный вариант лучше не использовать явно, потому что он не гарантирует установки обновления.
Чтобы вручную выполнить весь процесс обновления на тестовом устройстве, нужно иметь как минимум две версии приложения с разными номерами сборок: исходная и целевая.
Здесь мы рассмотрим пример кода для использования IAUs Flexible Flow, который также можно найти в официальной документации [2]. Для начала необходимо добавить библиотеку Play Core в build.gradle файл на уровне модуля.
dependencies {
...
implementation "com.google.android.play:core:1.5.0"
}
Затем создадим экземпляр AppUpdateManager
и добавим функцию обратного вызова к AppUpdateInfo
, в которой будет возвращаться информация о доступности обновления, объект для запуска обновления (если оно доступно) и текущий прогресс скачивания, если оно уже началось.
// Create instance of the IAUs manager.
val appUpdateManager = AppUpdateManagerFactory.create(context)
// Add state listener to app update info task.
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
// If there is an update available, prepare to promote it.
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
// ...
}
// If the process of downloading is finished, start the completion flow.
if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
// ...
}
}
.addOnFailureListener { e ->
// Handle the error.
}
Чтобы показать диалог для запроса обновления из Google Play, необходимо передать полученный объект AppUpdateInfo
в метод startIntentSenderForResult
.
appUpdateManager.startUpdateFlowForResult(
// Pass the intent that is returned by 'getAppUpdateInfo()'.
appUpdateInfo,
// Or 'AppUpdateType.IMMEDIATE for immediate updates.
AppUpdateType.FLEXIBLE,
// The current activity.
activity,
REQUEST_CODE
)
Для отслеживания состояния обновления можно добавить в менеджер IAUs слушатель событий InstallStateUpdatedListener
.
// Create a listener to track downloading state updates.
val listener = InstallStateUpdatedListener { state ->
// Update progress indicator, request user to approve app reload, etc.
}
// At some point before starting an update, register a listener for updates.
appUpdateManager.registerListener(listener)
// ...
// At some point when status updates are no longer needed, unregister the listener.
appUpdateManager.unregisterListener(listener)
Как только обновление будет скачано (статус DOWNLOADED
), нужно перезапустить приложение, чтобы завершить обновление. Перезапуск можно инициировать с помощью вызова appUpdateManager.completeUpdate()
, но перед этим рекомендуется показать диалоговое окно, чтобы пользователь явно подтвердил свою готовность к перезапуску приложения.
Snackbar.make(
rootView,
"An update has just been downloaded from Google Play",
Snackbar.LENGTH_INDEFINITE
).apply {
setAction("RELOAD") { appUpdateManager.completeUpdate() }
show()
}
Во-первых, перепроверьте соответствие требованиям, перечисленным в разделе «Basic Implementation Requirements». Если вы все выполнили, однако обновление согласно вызову onSuccess
, всё же недоступно, то проблема может быть в кэшировании. Вполне вероятно, что приложение Google Play не знает о доступном обновлении из-за внутреннего механизма кэширования. Чтобы избежать этого при ручном тестировании, вы можете принудительно сбросить кэш, зайдя на страницу «Мои приложения и игры» в Google Play. Или можете просто очистить кэш в настройках приложения Google Play. Обратите внимание, что эта проблема возникает только в ходе тестирования, она не должна влиять на конечных пользователей, поскольку у них кэш всё равно обновляется ежедневно.
Мы участвовали в программе раннего доступа и интегрировали IAUs Flexible Flow (рекомендованная реализация) в приложение Pandao — платформу, на которой производители и вендоры могут торговать китайскими товарами. Диалог IAUs отображался на главном экране, так что с ним могло взаимодействовать максимальное количество пользователей. Изначально мы хотели показывать диалог не чаще раза в день, чтобы не отвлекать людей от взаимодействия с приложением.
Поскольку A/B-тестирование играет ключевую роль в жизненном цикле любой новой фичи, мы решили оценить эффект от IAUs в нашем приложении. Мы случайным образом разделили пользователей на две непересекающиеся группы. Первая была контрольной, без использования IAUs, а вторая группа была тестовой, этим пользователям мы показывали диалог IAUs.
A/B-тест IAUs Flexible Flow в приложении Pandao.
В течение последних нескольких релизов мы измерили долю активных пользователей каждой версии приложения. Оказалось, что среди активных пользователей с последней доступной на тот момент версией основную часть составляли участники из группы B, то есть с функцией IAU. Фиолетовая линия на графике показывает, что в первые дни после публикации версии 1.29.1 количество активных пользователей с IAU превысило количество пользователей без этой функции. Поэтому можно утверждать, что пользователи с IAU быстрее обновляют приложение.
Диалог IAUs Flexible Flow в приложении Pandao.
Согласно нашим данным (см. график выше), пользователи больше всего кликают на кнопку подтверждения в диалоге IAU в первые дни после релиза, а затем конверсия постоянно снижается вплоть до публикации следующей версии приложения. То же самое наблюдается с кнопкой установки в диалоговом окне, которая инициирует установку скачанного обновления. Следовательно, можно сказать, что среднее значение конверсии в обоих случаях прямо пропорционально частоте релизов. В Pandao средняя конверсия в течение одного месяца достигает 35 % для клика на кнопку подтверждения и 7 % для клика на кнопку установки.
Мы предполагаем, что уменьшение доли подтверждений с течением времени — лишь проблема пользовательского опыта, потому что люди, которым интересна новая версия, будут обновляться довольно быстро, а те, кто не интересуются обновлением, так и не станут интересоваться. Исходя из этого предположения, мы решили не беспокоить тех, кому не интересно обновление, и не спрашивать их каждый день. Хорошей практикой будет использование другой логики запросов, которая основывается на «устаревании», то есть чтобы не беспокоить пользователей, мы оцениваем, насколько старые версии стоят у них и как часто мы уже предлагали им обновиться.
В целом IAUs продемонстрировала хорошие результаты в ходе A/B-тестирования, так что мы раскатили IAUs для всех пользователей.
Автор: Sergey Smetanin
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android-development/317825
Ссылки в тексте:
[1] Android Dev Summit: https://android-developers.googleblog.com/2018/11/unfolding-right-now-at-androiddevsummit.html
[2] опубликована: https://developer.android.com/guide/app-bundle/in-app-updates
[3] Pandao: https://play.google.com/store/apps/details?id=store.panda.client&hl=en
[4] Play Core: https://developer.android.com/guide/app-bundle/playcore#include_playcore
[5] Источник: https://habr.com/ru/post/452092/?utm_source=habrahabr&utm_medium=rss&utm_campaign=452092
Нажмите здесь для печати.