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

Важно!

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

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

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

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

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

Примечание

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

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

Если вы еще не настроили и не запустили пакет SDK в приложении, следуйте инструкциям в разделе Начало работы .

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

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

Visual Studio для Mac

  • Откройте Visual Studio для Mac.
  • Щелкните Файл>Открыть и выберите решение.
  • В навигаторе решения щелкните правой кнопкой мыши раздел Пакеты и выберите пункт Добавить пакеты NuGet....
  • Выполните поиск по запросу Центр приложений и установите распространение Центра приложений.
  • Щелкните Добавить пакеты.

Visual Studio для Windows

  • Откройте Visual Studio для Windows.
  • Щелкните Файл>Открыть и выберите решение.
  • В навигаторе решения щелкните правой кнопкой мыши ссылки и выберите Управление пакетами NuGet.
  • Найдите Центр приложений и установите Microsoft.AppCenter.Distribute.

Консоль диспетчера пакетов

  • Откройте консоль в Visual Studio. Для этого выберите Инструменты> Диспетчер >пакетов NuGetКонсоль диспетчера пакетов.
  • Если вы работаете в Visual Studio для Mac, убедитесь, что установлены расширения управления пакетами NuGet. Для этого выберитеРасширенияVisual Studio>, найдите NuGet и при необходимости установите.
  • Введите следующую команду в консоли:
Install-Package Microsoft.AppCenter.Distribute

Примечание

Если вы используете пакет SDK центра приложений в переносимом проекте (например , Xamarin.Forms), необходимо установить пакеты в каждом из проектов: переносимых, Android и iOS. Для этого необходимо открыть каждый подпроект и выполнить соответствующие действия, описанные в разделах Visual Studio для Mac или Visual Studio для Windows.

Примечание

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

Примечание

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

Примечание

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

2. Запуск распространения в Центре приложений

Настройте пакет SDK центра приложений, вызвав вызов AppCenter.Start(...) , как описано в руководстве по началу работы.

Для приложения iOS откройте AppDelegate.cs и добавьте следующую строку перед вызовом LoadApplication:

Distribute.DontCheckForUpdatesInDebug();

Этот шаг не является обязательным в Android, где конфигурация отладки обнаруживается автоматически во время выполнения.

Чтобы включить обновления из приложения для отладочных сборок в Android, вызовите следующий метод в файле MainActivity.cs проекта, в методе OnCreate и перед LoadApplication.

Distribute.SetEnabledForDebuggableBuild(true);

Примечание

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

2.3 [Только для iOS] Изменение info.plist проекта

Пакет SDK центра приложений проверяет URL-адреса, перенаправленные в приложение, чтобы избежать загрузки неопубликованных приложений, поэтому для правильной Info.plist обработки обновлений, распространяемых через портал, необходимо указать CFBundleURLSchemes в CFBundleURLTypes разделе файла:

Примечание

Info.plist, или файл списка информационных свойств — это структурированный текстовый файл, содержащий важные сведения о конфигурации для пакетного исполняемого файла. Дополнительные сведения см. в документации для разработчиков Apple.

  1. Добавьте новый ключ для URL types или CFBundleURLTypes в файл Info.plist (если Xcode отображает info.plist в качестве исходного кода).
  2. Измените ключ первого дочернего элемента на URL Schemes или CFBundleURLSchemes.
  3. Введите appcenter-${APP_SECRET} в качестве схемы URL-адресов и замените ${APP_SECRET} секретом приложения.

Совет

Если вы хотите убедиться, что вы правильно изменили файл Info.plist, откройте его как исходный код. Он должен содержать следующую запись с секретом приложения вместо ${APP_SECRET}:

<key>CFBundleURLTypes</key>
  <array>
      <dict>
          <key>CFBundleURLSchemes</key>
          <array>
              <string>appcenter-${APP_SECRET}</string>
          </array>
      </dict>
  </array>

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

Google Play рассматривает код обновления из приложения как вредоносное поведение, даже если он не используется во время выполнения. Если не удалить код обновления из приложения, это может привести к несоответствию и удалению приложения из Google Play. Чтобы упростить эту задачу, мы предоставляем версию пакета SDK для распространения центра приложений с api-интерфейсами с заглушкой, поэтому единственным изменением для вас является переключение зависимостей.

  1. Добавьте новую конфигурацию сборки с именем GooglePlay для Xamarin.Android и общих проектов. Убедитесь, что конфигурация сборки проектов правильно сопоставлена с соответствующей конфигурацией решения. Дополнительные сведения см. в разделе Visual Studio или Visual Studio для Mac инструкции.

  2. Откройте Xamarin.Android и общие проекты в .csproj любом текстовом редакторе и переместите ссылку на распространение в группу условных элементов:

    <ItemGroup Condition=" '$(Configuration)' != 'GooglePlay' ">
        <PackageReference Include="Microsoft.AppCenter.Distribute" Version="3.3.0" />
    </ItemGroup>
    <ItemGroup Condition=" '$(Configuration)' == 'GooglePlay' ">
        <PackageReference Include="Microsoft.AppCenter.DistributePlay" Version="3.3.0" />
    </ItemGroup>
    

    Примечание

    Если вы используете старый формат packages.config для управления ссылками NuGet, можно выполнить миграцию в формат PackageReference , следуя инструкциям по миграции.

  3. Сохраните изменения и восстановите пакеты NuGet.

  4. Конфигурацию можно изменить на панели команд в верхней части интегрированной среды разработки.

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

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

Distribute.UpdateTrack = UpdateTrack.Private;

Примечание

Значение по умолчанию — UpdateTrack.Public. Это свойство можно обновить только перед вызовом AppCenter.Start метода . Изменения в отслеживании обновления не сохраняются при перезапуске процесса приложения, поэтому, если свойство не всегда обновляется до AppCenter.Start вызова, оно будет общедоступным по умолчанию.

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

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

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

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

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

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

Distribute.DisableAutomaticCheckForUpdate();

Примечание

Этот метод должен вызываться перед вызовом AppCenter.Start метода .

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

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

Distribute.CheckForUpdate();

Примечание

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

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

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

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

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

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

// In this example OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;
AppCenter.Start(...);

Ниже приведен пример реализации обратного вызова, которая заменяет диалоговое окно пакета 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;

    // custom dialog
    var title = "Version " + versionName + " available!";
    Task answer;

    // On mandatory update, user can't postpone
    if (releaseDetails.MandatoryUpdate)
    {
        answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install");
    }
    else
    {
        answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install", "Maybe tomorrow...");
    }
    answer.ContinueWith((task) =>
    {
        // If mandatory or if answer was positive
        if (releaseDetails.MandatoryUpdate || (task as Task<bool>).Result)
        {
            // Notify SDK that user selected update
            Distribute.NotifyUpdateAction(UpdateAction.Update);
        }
        else
        {
            // Notify SDK that user selected postpone (for 1 day)
            // This method call is ignored by the SDK if the update is mandatory
            Distribute.NotifyUpdateAction(UpdateAction.Postpone);
        }
    });

    // Return true if you're using your own dialog, false otherwise
    return true;
}

Примечания о реализации для Xamarin.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.");
}

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

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

Distribute.SetEnabledAsync(false);

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

Distribute.SetEnabledAsync(true);

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

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

Примечание

Этот метод следует использовать только после Distribute запуска.

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

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

bool enabled = await Distribute.IsEnabledAsync();

Примечание

Этот метод следует использовать только после Distribute запуска. Он всегда возвращается false перед запуском.

Выполните очистку непосредственно перед закрытием приложения для обновления (только для 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. Если приложение задает для дорожки закрытый режим, откроется браузер для проверки подлинности пользователя и включения обновлений из приложения. Браузер не будет открываться снова, если сведения о проверке подлинности остаются действительными, даже если вернуться к общедоступной дорожке и вернуться к закрытому режиму позже. Если проверка подлинности браузера прошла успешно, пользователь автоматически перенаправляется обратно в приложение. Если дорожка является общедоступной (по умолчанию), следующий шаг выполняется напрямую.

    • В iOS 9 и 10 экземпляр SFSafariViewController откроется в приложении для проверки подлинности пользователя. После успешной проверки подлинности он закроется автоматически.
    • В iOS 11 взаимодействие с пользователем аналогично iOS 10, но iOS 11 запрашивает у пользователя разрешение на доступ к данным для входа. Это диалоговое окно системного уровня, и его невозможно настроить. Если пользователь отменит диалоговое окно, он может продолжать использовать тестируемую версию, но не получит обновления в приложении. При следующем запуске приложения им будет предложено снова получить доступ к данным для входа.
  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. Создайте версию выпуска приложения и отправьте новую сборку приложения, как на предыдущем шаге, и разопубликуйте ее в созданную ранее группу рассылки . Участникам группы рассылки будет предложено ввести новую версию при следующем запуске приложения.

Совет

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

Отключение автоматической пересылки методов делегата приложения в службы Центра приложений

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

  1. Откройте файл Info.plist проекта.
  2. Добавьте AppCenterAppDelegateForwarderEnabled ключ и присвойте ей 0значение . Это отключает перенаправление делегатов приложений для всех служб Центра приложений.
  3. Добавьте OpenUrl обратный вызов в AppDelegate.cs файл.
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
    Distribute.OpenUrl(url);
    return true;
}