Распространение в Центре приложений — обновления Unity в приложении

Важно!

Прекращение поддержки Центра приложений Visual Studio запланировано на 31 марта 2025 г. Хотя вы можете продолжать использовать Центр приложений Visual Studio до полного прекращения его использования, существует несколько рекомендуемых вариантов, на которые можно перейти.

Узнайте больше о сроках поддержки и альтернативных вариантах.

Распространение в Центре приложений позволяет пользователям и тестировщикам устанавливать новые версии приложения после его распространения через Центр приложений. После включения пакета SDK откроется диалоговое окно обновления для пользователей, чтобы скачать или отложить установку последнего обновления. После обновления пакет SDK начнет обновлять приложение.

Важно!

Пакет SDK для распространения для Unity не поддерживает UWP. Инструкции на этой странице охватывают только Android и iOS.

Предупреждение

Google Play рассматривает код обновления из приложения как вредоносное поведение, даже если он не используется во время выполнения. Удалите этот код, как описано в этом разделе , перед отправкой приложения в Google Play. Если не удалить код обновления из приложения, это может привести к несоответствию и удалению приложения из Google Play.

Примечание

Если вы запускаете автоматические тесты пользовательского интерфейса, включенные обновления в приложении заблокируют автоматические тесты пользовательского интерфейса, так как они будут пытаться пройти проверку подлинности в серверной части Центра приложений. Мы рекомендуем отключить обновления из приложения для тестов пользовательского интерфейса.

Добавление обновлений из приложения в приложение

Добавление модуля распространения в Центре приложений

Пакет SDK центра приложений разработан с использованием модульного подхода. Разработчику нужно интегрировать только модули служб, которые его интересуют.

Если вы еще не настроили и не запустили пакет SDK в приложении, следуйте инструкциям в документации по началу работы с Unity . Обязательно импортируйте пакет распространения в Центре приложений. Его имя должно быть в формате AppCenterDistribute-v{version}.unitypackage.

Примечание

Android 10 или более поздней версии имеет ограничения на действия запуска в фоновом режиме. См. статью об ограничениях на запуск действий в фоновом режиме.

Примечание

Приложения, работающие на Android 10 (выпуск Go), не могут получить разрешение SYSTEM_ALERT_WINDOW . См. статью о SYSTEM_ALERT_WINDOW на устройствах Go.

Примечание

Начиная с Android 11, ACTION_MANAGE_OVERLAY_PERMISSION намерения всегда переносят пользователя на экран параметров верхнего уровня, где пользователь может предоставлять или отзывать SYSTEM_ALERT_WINDOW разрешения для приложений. См. статью об обновлениях разрешений в Android 11.

Удаление обновлений из приложения для сборок Google Play

Google Play рассматривает код обновления из приложения как вредоносное поведение, даже если он не используется во время выполнения. Удалите этот код перед отправкой приложения в Google Play. Если не удалить код обновления из приложения, это может привести к несоответствию и удалению приложения из Google Play. Чтобы удалить собственный код обновлений из приложения, снимите флажок Использовать распространение в разделе Распространение объекта игры с присоединенным AppCenterBehavior .

Использование частной группы рассылки

По умолчанию для распространения используется общедоступная группа рассылки. Если вы хотите использовать частную группу рассылки, необходимо изменить UpdateTrack ее на Частная. Для этого выберите Частный в раскрывающемся списке Обновить трек в разделе Распространение игрового объекта с присоединенным AppCenterBehavior .

При использовании закрытой дорожки откроется окно браузера для проверки подлинности пользователя. Все последующие проверки обновления будут получать последний выпуск в закрытой дорожке.

Если пользователь находится на закрытом пути, это означает, что после успешной проверки подлинности он получит последний выпуск от любых частных групп рассылки, в которые он входит. Если пользователь находится на общедоступном пути, это означает, что он получит последний выпуск из любой общедоступной группы рассылки.

Отключение автоматической проверки обновлений

По умолчанию пакет SDK автоматически проверяет наличие новых выпусков:

  • При запуске приложения.
  • Когда приложение переходит в фоновый режим, снова на переднем плане.
  • При включении модуля "Распространение", если он был отключен ранее.

Если вы хотите проверка для новых выпусков вручную, можно отключить автоматический проверка для обновления.

Для этого снимите флажок Автоматическая проверка обновлений в разделе Распространение для игрового объекта с присоединенным AppCenterBehavior .

Затем можно использовать CheckForUpdate API, описанный в следующем разделе.

Проверка наличия обновлений вручную

Distribute.CheckForUpdate();

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

Примечание

Ручной проверка для вызова обновления работает, даже если включены автоматические обновления. Если уже выполняется другая проверка, то проверка для обновления игнорируется вручную. Ручная проверка обновления не будет обрабатываться, если пользователь отложил обновления (если последняя версия не является обязательным обновлением).

Настройка или локализация диалогового окна обновления в приложении

1. Настройка или локализация текста

Вы можете указать собственные строки ресурсов, если хотите локализовать текст, отображаемый в диалоговом окне обновления. Просмотрите строковые файлы для iOS в этом файле ресурсов iOS и для Android в этом файле ресурсов Android. Используйте то же имя строки или ключ и укажите локализованное значение, которое будет отражено в диалоговом окне в файлах ресурсов приложения.

2. Настройка диалогового окна обновления

Внешний вид диалогового окна обновления по умолчанию можно настроить, реализовав обратный ReleaseAvailable вызов.

Предупреждение

Необходимо зарегистрировать обратный вызов в Awake методе MonoBehaviour в первой сцене, которую загружает приложение, чтобы избежать отсутствия вызовов обратного вызова выпуска.

// In this example, OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;

Ниже приведена реализация обратного вызова, которая заменяет диалоговое окно пакета SDK пользовательской логикой:

bool OnReleaseAvailable(ReleaseDetails releaseDetails)
{
    // Look at releaseDetails public properties to get version information, release notes text or release notes URL
    string versionName = releaseDetails.ShortVersion;
    string versionCodeOrBuildNumber = releaseDetails.Version;
    string releaseNotes = releaseDetails.ReleaseNotes;
    Uri releaseNotesUrl = releaseDetails.ReleaseNotesUrl;

    // (Do something with the values if you want)

    // On mandatory update, user can't postpone
    if (releaseDetails.MandatoryUpdate)
    {
        // Force user to update (you should probably show some custom UI here)
        Distribute.NotifyUpdateAction(UpdateAction.Update);
    }
    else
    {
        // Allow user to update or postpone (you should probably show some custom UI here)
        // "GetUserUpdateAction()" isn't part of the SDK; it just represents a way of getting user response.
        // This blocks the thread while awaiting the user's response! This example shouldn't be used literally
        UpdateAction updateAction = GetUserUpdateAction();
        Distribute.NotifyUpdateAction(updateAction);
    }
    // Return true if you're using your own UI to get user response, false otherwise
    return true;
}

Примечания о реализации для Android:

Как показано в примере, необходимо вызвать или Distribute.NotifyUpdateAction(UpdateAction.UPDATE);Distribute.NotifyUpdateAction(UpdateAction.POSTPONE); , если обратный вызов возвращает true.

Если вы не вызываете NotifyUpdateAction, обратный вызов будет повторяться при каждом изменении действия.

Обратный вызов может быть вызван снова в том же выпуске, если действие изменится до того, как действие пользователя будет уведомлено в пакет SDK.

Это поведение необходимо для охвата следующих сценариев:

  • Приложение отправляется в фоновый режим (например, нажатие кнопки HOME), а затем возобновляется в другом действии.
  • Ваши действия охватываются другим действием, не выходя из приложения (например, нажимая на некоторые уведомления).
  • Аналогичные сценарии, описанные выше.

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

3. Выполнение кода, если обновления не найдены

В случаях, когда пакет SDK проверяет наличие обновлений и не находит обновления, доступные новее текущего, вызывается обратный NoReleaseAvailable вызов. Это позволяет выполнять пользовательский код в таких сценариях. Перед вызовом AppCenter.Start необходимо зарегистрировать обратный вызов, как показано в следующем примере:

// In this example OnNoReleaseAvailable is a method name in same class
Distribute.NoReleaseAvailable = OnNoReleaseAvailable;
AppCenter.Start(...);
void OnNoReleaseAvailable()
{
    AppCenterLog.Info(LogTag, "No release available callback invoked.");
}

## Enable or disable App Center Distribute at runtime

You can enable and disable App Center Distribute at runtime. If you disable it, the SDK won't provide any in-app update functionality but you can still use the Distribute service in the App Center portal.

To disable the Distribute service, use the following code:

```csharp
Distribute.SetEnabledAsync(false);

Чтобы снова включить распространение в Центре приложений, используйте тот же API, но передайте true его в качестве параметра.

Distribute.SetEnabledAsync(true);

Этот API является асинхронным. Дополнительные сведения см. в руководстве по асинхронным API Центра приложений .

Вам не нужно ждать этого вызова, чтобы другие вызовы API (например, IsEnabledAsync) были согласованы.

Состояние сохраняется в хранилище устройства при запусках приложений.

Проверка включения распространения в Центре приложений

Вы также можете проверка, включена ли рассылка в Центре приложений:

Distribute.IsEnabledAsync();

Этот API является асинхронным. Дополнительные сведения см. в руководстве по асинхронным API Центра приложений .

Включение обновлений из приложения для отладочных сборок

По умолчанию обновления в приложении включены только для выпускных сборок.

Чтобы включить обновления из приложения для отладочных сборок в Android и iOS, проверка флажок Включить распространение в отладке в разделе Распространение объекта игры с присоединенным AppCenterBehavior.

Поведение Центра приложений

В Unity отлаживаемая сборка — это сборка с флажом "Разработка сборки ".

Выполните очистку непосредственно перед закрытием приложения для обновления

Примечание

Этот обратный вызов работает только в iOS.

Зарегистрируйте обратный вызов, как показано в следующем примере:

// In this example, OnWillExitApp is a method name in same class
Distribute.WillExitApp = OnWillExitApp;
void OnWillExitApp()
{
    // Perform clean up here
}

При этом будет вызываться при OnWillExitApp() закрытии распространения.

Как работают обновления из приложения

Примечание

Чтобы обновления из приложения работали, сборку приложения необходимо скачать по ссылке. Он не будет работать, если установлен из интегрированной среды разработки или вручную.

Функция обновления в приложении работает следующим образом:

  1. Эта функция работает только со сборками RELEASE (по умолчанию), которые распространяются с помощью службы распространения Центра приложений . Он не будет работать, если включена функция интерактивного доступа iOS.
  2. После интеграции пакета SDK создайте версию выпуска приложения и отправьте ее в Центр приложений. Пользователи в группе рассылки получают уведомления о новом выпуске по электронной почте.
  3. Когда каждый пользователь открывает ссылку в своем сообщении электронной почты, приложение будет установлено на его устройстве. Важно, чтобы они использовали ссылку электронной почты для установки . Мы не поддерживаем загрузку неопубликованных приложений. При скачивании приложения по ссылке пакет SDK сохраняет важные сведения из файлов cookie, чтобы проверка для последующего обновления, в противном случае пакет SDK не содержит этих сведений о ключе.
  4. Если приложение задает для дорожки закрытый режим, откроется браузер для проверки подлинности пользователя и включения обновлений из приложения. Браузер не будет открываться снова, если сведения о проверке подлинности остаются действительными, даже если вернуться к общедоступной дорожке и вернуться к закрытому режиму позже. Если проверка подлинности браузера прошла успешно, пользователь автоматически перенаправляется обратно в приложение. Если дорожка является общедоступной (по умолчанию), следующий шаг выполняется напрямую.
  5. В новом выпуске приложения отображается диалоговое окно обновления в приложении с запросом на обновление приложения, если оно:
    • iOS:
      • более высокое значение или CFBundleShortVersionString
      • равное значение , CFBundleShortVersionString но большее значение CFBundleVersion.
      • версии одинаковы, но уникальный идентификатор сборки отличается.
    • Android:
      • более высокое значение или versionCode
      • равное значение , versionCode но другое значение versionName.

Совет

Если вы отправите один и тот же .apk/.ipa во второй раз, диалоговое окно не будет отображаться, так как двоичные файлы идентичны. В iOS при отправке новой сборки с теми же свойствами версии отобразится диалоговое окно обновления. Это связано с тем, что это другой двоичный файл. В Android двоичные файлы считаются одинаковыми, если оба свойства версии одинаковы.

Разделы справки проверить обновления из приложения?

Необходимо отправить сборки выпуска (которые используют модуль Распространение пакета SDK центра приложений) на портал Центра приложений, чтобы тестировать обновления в приложении, каждый раз увеличивая количество версий.

  1. Создайте приложение на портале Центра приложений, если вы еще этого не сделали.
  2. Создайте новую группу рассылки и присвойте ей имя.
  3. Добавьте себя (или всех пользователей, которых вы хотите включить в тест функции обновления в приложении). Используйте для этого шага новый адрес электронной почты или адрес электронной почты, который еще не использовался с этим приложением. Это гарантирует, что ваш опыт будет близок к опыту реальных тестировщиков.
  4. Создайте новую сборку приложения, которая включает распространение в Центре приложений и содержит логику установки, как описано ниже. Если группа является частной, не забудьте задать частную дорожку обновления в приложении, прежде чем приступать к использованию UpdateTrack свойства .
  5. Нажмите кнопку Распространить новый выпуск на портале и отправьте сборку приложения.
  6. После завершения отправки нажмите кнопку Далее и выберите созданную ранее группу рассылки в качестве назначения для этого дистрибутива приложения.
  7. Просмотрите раздел Распространение и распространение сборки в группу тестирования в приложении.
  8. Люди в этой группе получит приглашение быть тестировщиками приложения. Приняв приглашение, они могут скачать приложение с портала центра приложений со своего мобильного устройства. После установки обновлений из приложения можно приступать к тестированию обновлений из приложения.
  9. Укажите версию приложения (CFBundleShortVersionString или CFBundleVersion для iOS для versionCode Android).
  10. Создайте версию выпуска приложения и отправьте новую сборку, как это было на предыдущем шаге. Распространение в созданную ранее группу рассылки . Участникам группы рассылки будет предложено ввести новую версию при следующем запуске приложения.

Совет

Ознакомьтесь со сведениями о том, как использовать распространение Центра приложений , чтобы получить более подробные сведения о группах рассылки и т. д. Несмотря на то, что можно использовать распространение центра приложений для распространения новой версии приложения, не добавляя код, добавление в код приложения распространения центра приложений приведет к более эффективному взаимодействию с тестировщиками и пользователями по мере того, как они получают возможность обновления в приложении.