При разработке и сопровождении корпоративных мобильных приложений на платформе 1С разработчики нередко сталкиваются с необходимостью доставлять обновления пользователям напрямую, минуя официальный каталог Google Play. Это актуально для закрытых корпоративных контуров, терминалов сбора данных (ТСД), распределенных филиалов или в случаях, когда регистрация и публикация приложения в публичных сервисах нецелесообразна или недоступна. Разберем по шагам, как выстроить надежный процесс доставки и запуска обновления собственного мобильного приложения средствами встроенного языка 1С и механизмов операционной системы Android.
Когда мы отказываемся от внешнего магазина приложений, вся логика отслеживания релизов ложится на плечи самого приложения и корпоративного веб-сервера. Проанализируем типовой алгоритм автоматического обновления:
.apk. Рядом с ним обычно размещается легкий текстовый манифест (например, в формате JSON или XML), где указаны номер актуальной версии сборки, описание изменений и контрольная сумма..apk загружается во внутреннее файловое хранилище мобильного устройства.Рассмотрим подробнее реализацию этого механизма на встроенном языке 1С. Для взаимодействия с удаленным сервером задействуем объекты HTTPСоединение и HTTPЗапрос. Сохранение файла выполняем в каталог, доступный мобильному приложению, после чего инициируем установку с помощью метода ЗапуститьПриложение().
Обратим внимание на важный нюанс: метод ЗапуститьПриложение() выполняется в контексте мобильного клиента. Передача полного пути к загруженному APK-файлу активирует стандартное системное намерение (Intent) Android на установку пакета.
Посмотрим на пример практической реализации загрузки и запуска обновления:
&НаКлиенте
Процедура ЗагрузитьИУстановитьОбновление(АдресСервера, ПутьКФайлуНаСервере)
// Определяем путь для сохранения APK во временную папку приложения
ИмяФайла = "update.apk";
ПутьКЛокальномуФайлу = КаталогВременныхФайлов() + ИмяФайла;
// Создаем защищенное HTTP-соединение
Соединение = Новый HTTPСоединение(
АдресСервера,
443,
,
,
,
30,
Новый ЗащищенноеСоединениеOpenSSL()
);
Запрос = Новый HTTPЗапрос(ПутьКФайлуНаСервере);
Попытка
// Получаем файл и записываем его на устройство
Ответ = Соединение.Получить(Запрос, ПутьКЛокальномуФайлу);
Если Ответ.КодСостояния = 200 Тогда
// Инициируем вызов системного установщика Android
ЗапуститьПриложение(ПутьКЛокальномуФайлу);
Иначе
ВызватьИсключение "Ошибка загрузки: сервер вернул код " + Ответ.КодСостояния;
КонецЕсли;
Исключение
ИнформацияОбОшибке = ОписаниеОшибки();
Сообщить("Не удалось обновить приложение: " + ИнформацияОбОшибке);
КонецПопытки;
КонецПроцедуры
После вызова ЗапуститьПриложение() операционная система перехватывает управление, проверяет содержимое пакета и предлагает пользователю подтвердить установку новой версии поверх существующей.
Для того чтобы обновление прошло гладко и без ошибок, необходимо строго соблюдать правила безопасности и архитектурные ограничения платформы Android. Выясним причину возможных сбоев и меры по их предотвращению:
package name) и должен быть подписан тем же сертификатом разработчика (файлом хранилища ключей keystore), что и текущая установленная сборка. Если ключи подписи различаются, Android выдаст критическую ошибку INSTALL_FAILED_UPDATE_INCOMPATIBLE и заблокирует установку. В этом случае обновиться поверх невозможно: придется удалять старое приложение, что приведет к безвозвратной утере всех локальных данных и таблиц информационной базы 1С.versionCode): целочисленный идентификатор версии в манифесте сборщика мобильных приложений 1С для новой сборки обязан быть строго больше текущего. Попытка установить пакет с таким же или меньшим versionCode будет отклонена системой Android.КаталогВременныхФайлов(). Попытка записать APK в произвольные публичные папки накопителя без настройки специальных разрешений приведет к ошибке доступа при попытке запуска установщика.Помимо прямой перезаписи APK-файла, проанализируем другие подходы к распространению доработок в мобильных решениях 1С: