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

Важно!

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

    Примечание

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

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

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

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

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

Добавьте класс Distribute в AppCenter.start() метод , чтобы запустить службу распространения центра приложений.

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

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

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

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

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

  5. Вариант сборки можно изменить в раскрывающемся меню Build > Select Build Variant (Выбор варианта сборки ) или Build Variants (Варианты сборки ) на панели окна инструментов.

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

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

По умолчанию для распространения используется общедоступная группа рассылки. Если вы хотите использовать частную группу рассылки, необходимо явно задать ее с помощью 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 вызов интерфейса from DistributeListener . Это позволяет выполнять пользовательский код в таких сценариях. В приведенном выше примере показано, как отображать всплывающее сообщение, если обновления не найдены.

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

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

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

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

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

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

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

Примечание

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

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

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

Distribute.isEnabled();
Distribute.isEnabled()

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

Примечание

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

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

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

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

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

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

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

Совет

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