Разработка
Управление встроенным обновлением в приложении для Android
В этой статье я расскажу, как управлять таким типом обновлений.
Недавно мы столкнулись с проблемой, когда наше приложение медленно обновлялось и добиралось до устройств пользователей. Это становится большой проблемой, например, если вы хотите выпустить какое-то крупное обновление фич или серьезное исправление ошибки, а оно не достигает целевой аудитории. Это раздражает.
Чтобы решить эту проблему, мы захотели реализовать стандартное обновление в самом приложении, что доступно в стандартной библиотеке в Android. Я не буду описывать всю реализацию, поскольку она довольно проста и прекрасно объяснена на сайте Android. В этой статье я расскажу, как управлять таким типом обновлений.
Согласно документации и примерно 100 различным статьям и учебным пособиям на YouTube, единственный способ управлять им — через Publishing API от Google, который является частью Google Play Developer API. Эта конкретная библиотека должна быть реализована в облачном проекте Google, который обычно связан с проектом приложения в Firebase. Это создало для нас препятствие, поскольку ни один из членов нашей команды не был знаком с Google Cloud (мы используем AWS 😋). Это вызвало серьезную проблему.
Ранее мы реализовали обратную связь в приложении и опубликовали наше приложение в Play Store только для того, чтобы обнаружить, что по ошибке вызвали сбой, который возникает каждый раз, когда приложение получает уведомление. Это вызвало огромный скачок в количестве наших сбоев и мы ударились в панику. Мы немедленно исправили ошибку и опубликовали исправление только для того, чтобы понять, что это обновление по разному накатывается на устройства пользователей. Всем пользователям потребовалось около пары недель, чтобы перейти на последнюю версию приложения и покончить с кошмарным сбоем.
Этот случай заставил нас придумать какой-то обходной путь. Существует очень жизнеспособное решение, которое показывает всплывающее диалоговое окно, которое нельзя закрыть, с кнопкой для перенаправления в Play Store, но, честно говоря, это выглядит плохо, так как прерывает поток пользователя.
Постановка проблемы теперь заключалась в том, чтобы найти решение для обновления внутри приложения, которое позволяет нам запускать немедленные обновления без использования Publishing API.
Сначала мы поняли, что даже без использования Publishing API мы можем выпускать НЕМЕДЛЕННЫЕ обновления. Нам просто нужно было изменить AppUpdateType, который отправляется в AppUpdateManager.
Это изменение в коде, которое означает, что если мы установим его в “flexible”, все обновления будут рассматриваться как ГИБКИЕ, а если установить в “immediate”, то все обновления будут рассматриваться как НЕМЕДЛЕННЫЕ. Но это только половина требуемого решения,
Нам понадобилось значение, которое можно изменить удаленно, что направило нас, как вы могли догадаться, на удаленный конфиг Firebase. Мы создали логическое значение и назвали его forceUpdate. Мы получаем значение в нашей activity от Firebase и выполняем проверку.
Этот код работает, получая значение из удаленной конфигурации Firebase, а затем запускает функцию checkUpdate. Таким образом, мы можем контролировать, хотим ли мы, чтобы наш новый выпуск был немедленным обновлением или фиксированным. Единственный недостаток этого метода — нет возможности устанавливать приоритет для каждого релиза, что, впрочем, не влияет на наш вариант использования.