У меня есть приложение, написанное на expo, и я не могу понять, как запустить новую сборку. На сайте выставки, если я запускаю приложение из QR-кода, приложение правильное, но собственное приложение из магазина приложений не обновляется.
Шаги, которые я использовал, 1) Exp build: android 2) exp опубликовать
Как сделать так, чтобы приложение действительно обновлялось?
Насколько я понимаю, expo делает обновления OTA: docs.expo.io/versions/latest/guides/configuring-ota-updates
Вы создаете сборки с одной и той же версией expo?
TL; DR: обновления OTA принудительно применяются по умолчанию. Обновления App Store можно принудительно применить, добавив код для проверки версии вашего приложения при запуске и, если есть новая версия, откройте App Store на странице вашего приложения.
Есть два способа обновить автономное приложение Expo:
expo-cli publishУ обоих этих методов есть достоинства и недостатки.
Это обычный способ доставки обновлений для приложений Expo. OTA выполняются через инструмент командной строки expo и доставляют новый код Javascript на основе ваших настроек package.json. Этот параметр также предлагает возможность публикации кода с использованием освободить каналы, что означает, что вы можете сначала отправить обновления в свою промежуточную среду, проверить обновление, а затем отправить его в производство через CLI следующим образом:
expo-cli publish -release-channel staging # pushes and update to the staging channel
expo-cli publish -release-channel production # pushes an update to the production channel
Если вы публикуете, но ваше автономное приложение не обновляется, возможно, вы отправляете код не в тот канал выпуска. Вы можете узнать больше о каналах выпуска здесь.
OTA применяются по умолчанию:
By default, Expo will check for updates automatically when your app is launched and will try to fetch the latest published version. If a new bundle is available, Expo will attempt to download it before launching the experience.
Однако можно отключить это поведение, установив для updates.enabled значение false в app.json, а затем реализовать свою собственную логику (или ее вообще не использовать), как показано в их документах:
try {
const update = await Expo.Updates.checkForUpdateAsync();
if (update.isAvailable) {
await Expo.Updates.fetchUpdateAsync();
// ... notify user of update ...
Expo.Updates.reloadFromCache();
}
} catch (e) {
// handle or log error
}
Эта система действительно отлично подходит для продвижения нового JS-кода для ваших пользователей, она действительно помогает при тестировании в реальном времени, поскольку вы можете протестировать свое приложение с вашим пользователем, найти недостаток, исправить его и опубликовать новый код, который будет почти мгновенно доступен для загрузки.
Тем не менее, у этого метода есть свои ограничения, например: вы не можете обновить версию Expo SDK таким образом, вы должны создать новое автономное приложение и распространить его через магазин приложений (или любым другим методом по вашему выбору).
Это наиболее распространенный способ распространения файлов .apk и .ipa. Эти файлы могут быть созданы с помощью expo-cli build:android и expo-cli build:ios для Android и iOS соответственно.
Похоже, что тестируется Android API, чтобы заставить приложения обновляться с помощью этого метода (SO поток, статья), но я не думаю, что он еще доступен.
Одним из возможных решений для принудительного обновления с помощью этого метода является проверка версии вашего приложения при запуске и, если в магазине доступна новая версия, откройте страницу магазина приложения через глубокие ссылки, чтобы пользователь мог ее загрузить. Пример ниже должен помочь вам понять, что я имею в виду.
componentDidMount {
const hasNewVersion = isStoreUpdateAvailable(); // Checks the store for a new app update
if (hasNewVersion) {
Linking.openURL("market://details?id=<>"); // Opens the app's store page so the user can download the update
}
}
Вот документы о ссылка на Google Play.
Надеюсь, это ответит на все ваши вопросы, если не оставьте комментарий, и я отредактирую ответ.
Можно ли этот Linking.openURL("market://details?id=<>"); отправить в AppStore из iOS? В моем приложении он работает только на Android
Это только для Android, да. Правильно не знаю, как добиться аналогичного результата на iOS.
Поскольку принятый ответ был опубликован, Expo внесла изменения в [Updates API] [1].
Вот критическое изменение.
Updates.reloadFromCache has been renamed to Updates.reloadAsync, and Updates.reload has been removed.
import * as Updates from 'expo-updates' // Updates*
try {
const update = await Updates.checkForUpdateAsync()
if (update.isAvailable) {
await Updates.fetchUpdateAsync()
// NOTIFY USER HERE
Updates.reloadAsync()
}
} catch (e) {
// HANDLE ERROR HERE
}
Тем, кто задается вопросом, где запустить этот код, советую вставить его в метод componentDidMount / useEffect (). [1]: https://docs.expo.io/guides/configuring-ota-updates/
Этот код полезен для получения обновления и обновления приложения, но где это обновление будет загружено, и для разработчика, как предоставить обновления пользователям. Пожалуйста, помогите мне с этими вопросами.
Expo сделает это за вас. Когда вы создаете сборку своего приложения, она автоматически загружает сборку в сервис Amazon Expo (он также дает вам URL-адрес для проверки). Вам просто нужно вставить приведенный выше код, и Expo обновит приложение OTA (по воздуху).
Спасибо. Это было очень полезно
загрузите магазин приложений для каждой сборки.