Как принудительно обновить приложение expo

У меня есть приложение, написанное на expo, и я не могу понять, как запустить новую сборку. На сайте выставки, если я запускаю приложение из QR-кода, приложение правильное, но собственное приложение из магазина приложений не обновляется.

Шаги, которые я использовал, 1) Exp build: android 2) exp опубликовать

Как сделать так, чтобы приложение действительно обновлялось?

загрузите магазин приложений для каждой сборки.

Aboobakkar P S 03.07.2018 14:05

Насколько я понимаю, expo делает обновления OTA: docs.expo.io/versions/latest/guides/configuring-ota-updates

Joel Jackson 03.07.2018 17:26

Вы создаете сборки с одной и той же версией expo?

Andrew 27.01.2019 00:05
15
3
13 439
2

Ответы 2

TL; DR: обновления OTA принудительно применяются по умолчанию. Обновления App Store можно принудительно применить, добавив код для проверки версии вашего приложения при запуске и, если есть новая версия, откройте App Store на странице вашего приложения.

Есть два способа обновить автономное приложение Expo:

  1. Обновление OTA с помощью expo-cli publish
  2. Использование Google Play / App Store

У обоих этих методов есть достоинства и недостатки.

OTA-обновления

Это обычный способ доставки обновлений для приложений 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

rafaelmorais 24.09.2019 10:25

Это только для Android, да. Правильно не знаю, как добиться аналогичного результата на iOS.

Bruno Eduardo 24.09.2019 15:50

ОБНОВЛЕННЫЙ ОТВЕТ

Поскольку принятый ответ был опубликован, 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/

Этот код полезен для получения обновления и обновления приложения, но где это обновление будет загружено, и для разработчика, как предоставить обновления пользователям. Пожалуйста, помогите мне с этими вопросами.

Ferin Patel 13.07.2020 15:05

Expo сделает это за вас. Когда вы создаете сборку своего приложения, она автоматически загружает сборку в сервис Amazon Expo (он также дает вам URL-адрес для проверки). Вам просто нужно вставить приведенный выше код, и Expo обновит приложение OTA (по воздуху).

Gilson Viana 15.07.2020 16:53

Спасибо. Это было очень полезно

Ferin Patel 15.07.2020 17:59

Другие вопросы по теме