В последние месяцы я работал с корпоративными мобильными приложениями. Эти приложения не распространяются на каком-либо рынке, поэтому мне нужно справиться с процессом распространения. С Android вы можете компилировать свои приложения, создавать APK-файлы и распространять их. Вы можете отправлять файлы по электронной почте, использовать ссылку для скачивания, отправить файл через Bluetooth или что-то еще. С iOS все немного по-другому. Вам необходимо приобрести одну лицензию Enterprise, скомпилировать приложение и распространять файлы IPA, используя стандарты Apple.
Хорошо, но этот пост не о том, как распространять приложения за пределами рынков. Этот пост посвящен одной большой проблеме, которая возникает, когда нам нужно обновить наши приложения. Как пользователь узнает, что есть новая версия приложения, и ему нужно обновить? Когда мы работаем в Google Play Store, нам не нужно об этом беспокоиться, но если мы распространяем наши приложения вручную, нам нужно что-то делать. Мы можем отправить push-уведомления или электронное письмо пользователю, чтобы сообщить о новой версии. Позвольте мне показать вам, как я это делаю.
Моя проблема не только в том, чтобы сообщить пользователю о новой версии. Иногда мне также нужно убедиться, что пользователь запускает последнюю версию приложения. Представьте себе критическую ошибку (решенную в последнем выпуске), но пользователь не обновляется.
Сначала нам нужно создать статическую HTML-страницу, где пользователь может скачать APK-файл. Представьте, что это URL, по которому пользователь может загрузить последнюю версию приложения:
http://192.168.1.1:8888/app.apk
Мы можем проверять версию приложения на сервере каждый раз, когда пользователь открывает приложение, но эта проверка означает связь по сети, и она медленная. Нам нужно уменьшить связь между клиентом и сервером до минимального выражения и только тогда, когда это строго необходимо. Проверка версии каждый раз может быть полезной в настольном приложении, но это снижает удобство работы с мобильными приложениями. Мой подход немного отличается. Обычно мы используем аутентификацию на основе токенов в мобильных приложениях. Это означает, что мы должны отправить наш токен со всеми запросами. Если мы отправляем токен, мы также можем отправить версию.
В угловом приложении мы можем определить версию и путь нашего apk, используя хранилище значений ключей.
.value('config', { version: 4, androidAPK: "http://192.168.1.1:8888/app.apk" })
Теперь нам нужно добавить параметр версии к каждому запросу (мы можем легко создать пользовательский http-сервис для автоматического добавления этого параметра к каждому запросу)
$http.get('http://192.168.1.1:8888/api/doSomething', {params: {_version: config.version}}) .success(function (data) { alert("OK"); }) .error(function (err, status) { switch (status) { case 410: $state.go('upgrade'); break; } });
Мы можем создать простой бэкэнд, чтобы заботиться о версии и генерировать исключение HTTP (например, одну ошибку 410 HTTP), если версии не совпадают. Здесь вы можете увидеть простой пример Silex:
<?php include __DIR__ . "/../vendor/autoload.php"; use Silex\Application; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpException; $app = new Application([ 'debug' => true, 'version' => 4, ]); $app->after(function (Request $request, Response $response) { $response->headers->set('Access-Control-Allow-Origin', '*'); }); $app->get('/api/doSomething', function (Request $request, Application $app) { if ($request->get('_version') != $app['version']) { throw new HttpException(410, "Wrong version"); } else { return $app->json('hello'); } }); $app->run();
Как видите, нам нужно позаботиться о CORS
С помощью этого простого примера мы можем понять, имеет ли пользователь неверную версию в каждом запросе к серверу. Если версия не совпадает, мы можем, например, перенаправить на определенный маршрут, чтобы сообщить, что пользователь должен обновить приложение, и предоставить ссылку для выполнения действия.
С Android мы не можем создать ссылку на файл APK. Не работает Нам нужно скачать APK (с помощью плагина FileTransfer ) и открыть файл с помощью плагина webintent .
Код очень прост:
var fileTransfer = new FileTransfer(); fileTransfer.download(encodeURI(androidUrl), "cdvfile://localhost/temporary/app.apk", function (entry) { window.plugins.webintent.startActivity({ action: window.plugins.webintent.ACTION_VIEW, url: entry.toURL(), type: 'application/vnd.android.package-archive' }, function () { }, function () { alert('Failed to open URL via Android Intent.'); console.log("Failed to open URL via Android Intent. URL: " + entry.fullPath); }); }, function (error) { console.log("download error source " + error.source); console.log("download error target " + error.target); console.log("upload error code" + error.code); }, true);
И в основном это все. Когда пользователь самостоятельно обновляет приложение, оно закрывается автоматически, и ему нужно открыть его снова, но теперь с правильной версией.