Поделиться через


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

Это важно

Центр приложений Visual Studio был прекращен 31 марта 2025 г., за исключением функций аналитики и диагностики, которые будут поддерживаться до 30 июня 2026 г. Подробнее.

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

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

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

Замечание

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

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

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

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

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

  1. Откройте файл build.gradle на уровне приложения проекта и добавьте следующие строки после app/build.gradle.

    dependencies {
       def appCenterSdkVersion = '5.0.6'
       implementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
    }
    

    Замечание

    Если версия вашего подключаемого модуля Android Gradle ниже 3.0.0, необходимо заменить implementation на compile.

  2. Сохраните файл build.gradle и обязательно активируйте синхронизацию Gradle в Android Studio.

  3. DownloadManager используется для скачивания обновлений. Пакет SDK Центра приложений применяет tls 1.2 для повышения безопасности.

2. Запустите функцию Distribute в App Center

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

Добавьте класс Distribute в метод AppCenter.start(), чтобы запустить службу Distribute в App Center.

AppCenter.start(getApplication(), "{Your App Secret}", Distribute.class);
AppCenter.start(application, "{Your App Secret}", Distribute::class.java)

Убедитесь, что вы заменили {Your App Secret} в приведенном выше примере кода секретом приложения. Android Studio автоматически предлагает требуемую инструкцию импорта после добавления ссылки на Distribute класс к start() методу, но если вы видите ошибку, что имена классов не распознаны, добавьте следующие строки в инструкции импорта в классе действий:

import com.microsoft.appcenter.AppCenter;
import com.microsoft.appcenter.distribute.Distribute;
import com.microsoft.appcenter.AppCenter
import com.microsoft.appcenter.distribute.Distribute

Замечание

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 считает код обновления в приложении вредоносным поведением, даже если он не используется во время выполнения. Используйте вариант пакета SDK Distribute, как указано в этом разделе, или полностью удалите пакет SDK Distribute, содержащий код обновления в приложении, перед отправкой приложения в Google Play. Невыполнение этого может привести к несоблюдению требований и удалению приложения из Google Play. Чтобы упростить работу, мы предоставляем версию SDK App Center Distribute с заглушенными API, поэтому единственным изменением для вас является замена зависимости.

  1. Откройте файл build.gradle на уровне приложения проекта (app/build.gradle).

  2. Настройте варианты сборки путем добавления вкусов продукта:

    android {
        flavorDimensions "distribute"
        productFlavors {
            appCenter {
                dimension "distribute"
            }
            googlePlay {
                dimension "distribute"
            }
        }
    }
    
  3. Измените блок зависимостей, чтобы использовать различные зависимости в зависимости от варианта продукта.

    dependencies {
        def appCenterSdkVersion = "5.0.6"
        appCenterImplementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
        googlePlayImplementation "com.microsoft.appcenter:appcenter-distribute-play:${appCenterSdkVersion}"
    }
    
  4. Сохраните файл build.gradle и обязательно активируйте синхронизацию Gradle в Android Studio.

  5. Вариант сборки можно изменить в раскрывающемся меню "Выбор варианта сборки>" или "Варианты сборки" в строке окна инструментов.

Дополнительные сведения о настройке вариантов сборки см. в документации по Android.

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

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

Distribute.setUpdateTrack(UpdateTrack.PRIVATE);
Distribute.setUpdateTrack(UpdateTrack.PRIVATE)

Замечание

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

Когда приложение находится на переднем плане (после Distribute.setUpdateTrack(UpdateTrack.PRIVATE); и AppCenter.start), откроется окно браузера для проверки подлинности пользователя. Все последующие проверки обновлений получат самый последний выпуск в частном канале.

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

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

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

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

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

Distribute.disableAutomaticCheckForUpdate();
Distribute.disableAutomaticCheckForUpdate()

Замечание

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

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

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

Distribute.checkForUpdate();
Distribute.checkForUpdate()

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

Замечание

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

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

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

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

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

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

Distribute.setListener(new MyDistributeListener());
AppCenter.start(...);
Distribute.setListener(MyDistributeListener())
AppCenter.start(...)

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

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.net.Uri;

import com.microsoft.appcenter.distribute.Distribute;
import com.microsoft.appcenter.distribute.DistributeListener;
import com.microsoft.appcenter.distribute.ReleaseDetails;
import com.microsoft.appcenter.distribute.UpdateAction;

public class MyDistributeListener implements DistributeListener {

    @Override
    public boolean onReleaseAvailable(Activity activity, ReleaseDetails releaseDetails) {

        // Look at releaseDetails public methods to get version information, release notes text or release notes URL
        String versionName = releaseDetails.getShortVersion();
        int versionCode = releaseDetails.getVersion();
        String releaseNotes = releaseDetails.getReleaseNotes();
        Uri releaseNotesUrl = releaseDetails.getReleaseNotesUrl();

        // Build our own dialog title and message
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity);
        dialogBuilder.setTitle("Version " + versionName + " available!"); // you should use a string resource instead, this is just a simple example
        dialogBuilder.setMessage(releaseNotes);

        // Mimic default SDK buttons
        dialogBuilder.setPositiveButton(com.microsoft.appcenter.distribute.R.string.appcenter_distribute_update_dialog_download, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                // This method is used to tell the SDK what button was clicked
                Distribute.notifyUpdateAction(UpdateAction.UPDATE);
            }
        });

        // We can postpone the release only if the update isn't mandatory
        if (!releaseDetails.isMandatoryUpdate()) {
            dialogBuilder.setNegativeButton(com.microsoft.appcenter.distribute.R.string.appcenter_distribute_update_dialog_postpone, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    // This method is used to tell the SDK what button was clicked
                    Distribute.notifyUpdateAction(UpdateAction.POSTPONE);
                }
            });
        }
        dialogBuilder.setCancelable(false); // if it's cancelable you should map cancel to postpone, but only for optional updates
        dialogBuilder.create().show();

        // Return true if you're using your own dialog, false otherwise
        return true;
    }
    
    @Override
    public void onNoReleaseAvailable(Activity activity) {
        Toast.makeText(activity, activity.getString(R.string.no_updates_available), Toast.LENGTH_LONG).show();
    }
}
import android.app.Activity
import android.app.AlertDialog
import com.microsoft.appcenter.distribute.Distribute
import com.microsoft.appcenter.distribute.DistributeListener
import com.microsoft.appcenter.distribute.ReleaseDetails
import com.microsoft.appcenter.distribute.UpdateAction

class MyDistributeListener : DistributeListener {

    override fun onReleaseAvailable(activity: Activity, releaseDetails: ReleaseDetails): Boolean {

        // Look at releaseDetails public methods to get version information, release notes text or release notes URL
        val versionName = releaseDetails.shortVersion
        val versionCode = releaseDetails.version
        val releaseNotes = releaseDetails.releaseNotes
        val releaseNotesUrl = releaseDetails.releaseNotesUrl

        // Build our own dialog title and message
        val dialogBuilder = AlertDialog.Builder(activity)
        dialogBuilder.setTitle("Version $versionName available!") // you should use a string resource instead, this is just a simple example
        dialogBuilder.setMessage(releaseNotes)

        // Mimic default SDK buttons
        dialogBuilder.setPositiveButton(
            com.microsoft.appcenter.distribute.R.string.appcenter_distribute_update_dialog_download
        ) { dialog, which ->
            // This method is used to tell the SDK what button was clicked
            Distribute.notifyUpdateAction(UpdateAction.UPDATE)
        }

        // We can postpone the release only if the update isn't mandatory
        if (!releaseDetails.isMandatoryUpdate) {
            dialogBuilder.setNegativeButton(
                com.microsoft.appcenter.distribute.R.string.appcenter_distribute_update_dialog_postpone
            ) { dialog, which ->
                // This method is used to tell the SDK what button was clicked
                Distribute.notifyUpdateAction(UpdateAction.POSTPONE)
            }
        }
        dialogBuilder.setCancelable(false) // if it's cancelable you should map cancel to postpone, but only for optional updates
        dialogBuilder.create().show()

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

    override fun onNoReleaseAvailable(activity: Activity) {
        Toast.makeText(activity, activity.getString(R.string.no_updates_available), Toast.LENGTH_LONG).show()
    }
}

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

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

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

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

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

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

В случаях, когда SDK проверяет наличие обновлений и не находит доступных обновлений, более новых, чем используемый в данный момент, вызывается интерфейсный обратный вызов onNoReleaseAvailable из DistributeListener. Это позволяет выполнять пользовательский код в таких сценариях. В приведенном выше примере показано, как отображать уведомление toast при отсутствии обновлений.

Включить или отключить App Center Distribute в режиме выполнения

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

Distribute.setEnabled(false);
Distribute.setEnabled(false)

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

Distribute.setEnabled(true);
Distribute.setEnabled(true)

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

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

Замечание

Этот метод должен использоваться только после того, как Distribute был запущен.

Проверьте, включен ли App Center Distribute

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

Distribute.isEnabled();
Distribute.isEnabled()

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

Замечание

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

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

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

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

Distribute.setEnabledForDebuggableBuild(true);
Distribute.setEnabledForDebuggableBuild(true)

Замечание

Этот метод влияет только на отладочные сборки и не влияет на сборки выпуска. Отладочная сборка означает, что для флага android:debuggable установлено значение true (обычно оно автоматически задается заранее определенными вариантами сборки отладки в gradle). В противном случае, это версия сборки релиза.

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

Замечание

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

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

  1. Эта функция работает только со сборками RELEASE (по умолчанию), распределенными с помощью службы распространения Центра приложений .

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

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

  4. Если приложение устанавливает для отслеживания частный режим, браузер откроется для проверки подлинности пользователя и включения обновлений в приложении. Браузер не откроется снова, пока информация об аутентификации остается действительной, даже при возврате на общедоступный режим и позднее обратно на частный. Если проверка подлинности браузера выполнена успешно, пользователь перенаправляется обратно в приложение. Если трек является общедоступным (по умолчанию), следующий шаг происходит напрямую.

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

    • более высокое значение versionCode или
    • равное значение versionCode, но другое значение versionName.

Подсказка

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

Как протестировать обновления в приложении?

Вам необходимо загрузить релизные сборки (использующие распространение App Center SDK) на портал Центра приложений для тестирования обновлений внутри приложения, увеличивая номера версий каждый раз.

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

Подсказка

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