Dystrybucja w centrum aplikacji — aktualizacje w aplikacji dla systemu Android

Ważne

Program Visual Studio App Center ma zostać wycofany 31 marca 2025 r. Mimo że możesz nadal używać programu Visual Studio App Center do momentu jej pełnego wycofania, istnieje kilka zalecanych alternatyw, do których można rozważyć migrację.

Dowiedz się więcej o osiach czasu pomocy technicznej i alternatywach.

Usługa App Center Distribute pozwoli użytkownikom zainstalować nową wersję aplikacji podczas jej dystrybucji za pośrednictwem Centrum aplikacji. Po udostępnieniu nowej wersji aplikacji zestaw SDK wyświetli użytkownikowi okno dialogowe aktualizacji, aby pobrać lub odroczyć nową wersję. Po wybraniu aktualizacji zestaw SDK zacznie aktualizować aplikację.

Ostrzeżenie

Sklep Google Play traktuje kod aktualizacji w aplikacji jako złośliwe zachowanie, nawet jeśli nie jest używany w czasie wykonywania. Użyj wariantu zestawu SDK dystrybucji zgodnie z zaleceniami w tej sekcji lub całkowicie usuń zestaw SDK dystrybucji zawierający kod aktualizacji w aplikacji przed przesłaniem aplikacji do sklepu Google Play. Nie można tego zrobić, może prowadzić do niezgodności i usunięcia aplikacji ze sklepu Google Play.

Uwaga

Jeśli uruchamiasz testy zautomatyzowanego interfejsu użytkownika, włączone aktualizacje w aplikacji będą blokować zautomatyzowane testy interfejsu użytkownika, ponieważ spróbują uwierzytelnić się w zapleczu Centrum aplikacji. Zalecamy, aby nie włączyć usługi App Center Distribute dla testów interfejsu użytkownika.

Dodawanie aktualizacji w aplikacji do aplikacji

Postępuj zgodnie z sekcją Wprowadzenie , jeśli zestaw SDK nie został jeszcze skonfigurowany i uruchomiony w aplikacji.

1. Dodawanie modułu dystrybucji centrum aplikacji

Zestaw SDK centrum aplikacji został zaprojektowany z modułowym podejściem — deweloper musi zintegrować tylko moduły usług, których interesują.

  1. Otwórz plik build.gradle na poziomie aplikacji projektu (app/build.gradle) i dodaj następujące wiersze po apply plugin.

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

    Uwaga

    Jeśli wersja wtyczki Android Gradle jest niższa niż 3.0.0, należy zastąpić implementacjękompilacją.

  2. Zapisz plik build.gradle i upewnij się, że wyzwolisz synchronizację narzędzia Gradle w programie Android Studio.

  3. Narzędzie DownloadManager służy do pobierania aktualizacji. Zestaw SDK usługi App Center wymusza protokół TLS 1.2 w celu zwiększenia bezpieczeństwa.

2. Uruchamianie dystrybucji centrum aplikacji

Aby użyć usługi App Center, wybierz moduły, których chcesz użyć. Domyślnie żadne moduły nie są uruchamiane i podczas uruchamiania zestawu SDK należy jawnie wywołać każde z nich.

Dodaj klasę Distribute do metody, aby uruchomić usługę rozproszoną AppCenter.start() w usłudze App Center.

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

Upewnij się, że w powyższym przykładzie kodu zastąpiono {Your App Secret} wpis tajny aplikacji. Program Android Studio automatycznie sugeruje wymaganą instrukcję importu po dodaniu odwołania do klasy do Distributestart() metody, ale jeśli zobaczysz błąd, że nazwy klas nie są rozpoznawane, dodaj następujące wiersze do instrukcji importu w klasie aktywności:

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

Uwaga

System Android 10 lub nowszy ma ograniczenia dotyczące działania uruchamiania z poziomu tła. Zobacz artykuł dotyczący ograniczeń dotyczących uruchamiania działań w tle.

Uwaga

Aplikacje działające w systemie Android 10 (wersja Go) nie mogą otrzymać uprawnień SYSTEM_ALERT_WINDOW . Zobacz artykuł dotyczący SYSTEM_ALERT_WINDOW na urządzeniach Go.

Uwaga

Począwszy od systemu Android 11, ACTION_MANAGE_OVERLAY_PERMISSION intencje zawsze są wyświetlane użytkownikowi na ekranie Ustawienia najwyższego poziomu, na którym użytkownik może udzielić lub odwołać SYSTEM_ALERT_WINDOW uprawnienia dla aplikacji. Zobacz artykuł dotyczący aktualizacji uprawnień w systemie Android 11.

Przygotowywanie kompilacji ze sklepu Google Play

Sklep Google Play traktuje kod aktualizacji w aplikacji jako złośliwe zachowanie, nawet jeśli nie jest używany w czasie wykonywania. Użyj wariantu zestawu SDK dystrybucji zgodnie z zaleceniami w tej sekcji lub całkowicie usuń zestaw SDK dystrybucji zawierający kod aktualizacji w aplikacji przed przesłaniem aplikacji do sklepu Google Play. Nie można tego zrobić, może prowadzić do niezgodności i usunięcia aplikacji ze sklepu Google Play. Aby ułatwić, udostępniamy wersję zestawu APP Center Distribute SDK z stubbed API, więc jedyną zmianą dla Ciebie jest zamiana zależności.

  1. Otwórz plik build.gradle na poziomie aplikacji projektu (app/build.gradle).

  2. Skonfiguruj warianty kompilacji, dodając smaki produktów:

    android {
        flavorDimensions "distribute"
        productFlavors {
            appCenter {
                dimension "distribute"
            }
            googlePlay {
                dimension "distribute"
            }
        }
    }
    
  3. Zmodyfikuj blok zależności, aby korzystać z różnych zależności na podstawie smaku produktu:

    dependencies {
        def appCenterSdkVersion = "5.0.4"
        appCenterImplementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
        googlePlayImplementation "com.microsoft.appcenter:appcenter-distribute-play:${appCenterSdkVersion}"
    }
    
  4. Zapisz plik build.gradle i upewnij się, że wyzwolisz synchronizację narzędzia Gradle w programie Android Studio.

  5. Wariant kompilacji można zmienić w menu rozwijanym Build Select Build Variant (Wybieranie wariantu kompilacji>) lub Build Variant (Warianty kompilacji) na pasku okna narzędzi.

Więcej informacji na temat konfigurowania wariantów kompilacji można przeczytać w dokumentacji systemu Android.

Używanie prywatnej grupy dystrybucyjnej

Domyślnie usługa Distribute używa publicznej grupy dystrybucyjnej. Jeśli chcesz użyć prywatnej grupy dystrybucyjnej, musisz jawnie ustawić ją za pośrednictwem setUpdateTrack interfejsu API.

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

Uwaga

Wartość domyślna to UpdateTrack.PUBLIC. Tę metodę można wywołać tylko przed wywołaniem AppCenter.start metody. Zmiany w śledzeniu aktualizacji nie są utrwalane po ponownym uruchomieniu AppCenter.start procesu aplikacji, więc jeśli metoda nie zawsze jest wywoływana przed wywołaniem, będzie ona domyślnie publiczna.

Gdy aplikacja znajduje się na pierwszym planie (po Distribute.setUpdateTrack(UpdateTrack.PRIVATE); i AppCenter.start), zostanie otwarte okno przeglądarki w celu uwierzytelnienia użytkownika. Wszystkie kolejne testy aktualizacji otrzymają najnowszą wersję na prywatnej ścieżce.

Jeśli użytkownik znajduje się na prywatnej ścieżce, oznacza to, że po pomyślnym uwierzytelnieniu otrzyma najnowszą wersję z jakichkolwiek prywatnych grup dystrybucyjnych, których członkiem jest. Jeśli użytkownik znajduje się na publicznej ścieżce, oznacza to, że otrzyma najnowszą wersję z dowolnej publicznej grupy dystrybucyjnej.

Wyłączanie automatycznego sprawdzania aktualizacji

Domyślnie zestaw SDK automatycznie sprawdza nowe wersje:

  • Po uruchomieniu aplikacji.
  • Gdy aplikacja przejdzie na pierwszy plan po przejściu do tła.
  • Po włączeniu modułu Distribute (Dystrybucja), jeśli został wcześniej wyłączony.

Jeśli chcesz ręcznie sprawdzić dostępność nowych wersji, możesz wyłączyć automatyczne sprawdzanie aktualizacji. Aby to zrobić, wywołaj następującą metodę przed uruchomieniem zestawu SDK:

Distribute.disableAutomaticCheckForUpdate();
Distribute.disableAutomaticCheckForUpdate()

Uwaga

Ta metoda musi być wywoływana przed wywołaniem AppCenter.start metody.

Następnie możesz użyć interfejsu checkForUpdate API, który został opisany w poniższej sekcji.

Ręczne sprawdzanie aktualizacji

Distribute.checkForUpdate();
Distribute.checkForUpdate()

Spowoduje to wysłanie żądania do Centrum aplikacji i wyświetlenie okna dialogowego aktualizacji w przypadku, gdy jest dostępna nowa wersja.

Uwaga

Ręczne sprawdzanie wywołania aktualizacji działa nawet wtedy, gdy są włączone aktualizacje automatyczne. Ręczne sprawdzanie aktualizacji jest ignorowane, jeśli jest już wykonywane inne sprawdzanie. Ręczne sprawdzanie aktualizacji nie zostanie przetworzone, jeśli użytkownik odroczył aktualizacje (chyba że najnowsza wersja jest obowiązkową aktualizacją).

Dostosowywanie lub lokalizowanie okna dialogowego aktualizacji w aplikacji

1. Dostosowywanie lub lokalizowanie tekstu

Możesz łatwo podać własne ciągi zasobów, jeśli chcesz zmienić lub lokalizować tekst wyświetlany w oknie dialogowym aktualizacji. Przyjrzyj się plikom ciągów w tym pliku zasobu. Użyj tej samej nazwy/klucza ciągu i określ zlokalizowaną wartość, która ma zostać odzwierciedlona w oknie dialogowym we własnych plikach zasobów aplikacji.

2. Dostosowywanie okna dialogowego aktualizacji

Możesz dostosować wygląd domyślnego okna dialogowego DistributeListener aktualizacji, implementując interfejs. Przed wywołaniem AppCenter.start należy zarejestrować odbiornik, jak pokazano w poniższym przykładzie:

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

Oto przykład implementacji odbiornika, która zastępuje okno dialogowe zestawu SDK niestandardowym:

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()
    }
}

Jak pokazano w przykładzie, musisz wywołać metodę Distribute.notifyUpdateAction(UpdateAction.UPDATE); lub Distribute.notifyUpdateAction(UpdateAction.POSTPONE); jeśli odbiornik zwróci truewartość .

Jeśli nie wywołasz wywołania notifyUpdateAction, wywołanie zwrotne będzie powtarzane przy każdej zmianie działania.

Odbiornik można wywołać ponownie z tą samą wersją, jeśli działanie zmieni się przed powiadomieniem użytkownika o akcji zestawu SDK.

To zachowanie jest potrzebne do pokrycia następujących scenariuszy:

  • Aplikacja jest wysyłana do tła (na przykład naciśnięcie przycisku HOME), a następnie wznowiona w innym działaniu.
  • Twoje działanie jest objęte innym działaniem bez opuszczania aplikacji (na przykład kliknięcie niektórych powiadomień).
  • Inne podobne scenariusze.

W takim przypadku działanie hostujące okno dialogowe może zostać zastąpione bez interakcji z użytkownikiem. Dlatego zestaw SDK ponownie wywołuje odbiornik, aby można było przywrócić okno dialogowe niestandardowe.

W przypadkach, gdy zestaw SDK sprawdza dostępność aktualizacji i nie znajdzie żadnych dostępnych aktualizacji nowszych niż obecnie używany, onNoReleaseAvailable wywoływana jest wywołana funkcja wywołania zwrotnego z DistributeListener interfejsu. Umożliwia to wykonywanie niestandardowego kodu w takich scenariuszach. W powyższym przykładzie pokazano, jak wyświetlić wyskakujące komunikaty po znalezieniu aktualizacji.

Włączanie lub wyłączanie dystrybucji usługi App Center w czasie wykonywania

Usługę App Center można włączać i wyłączać w czasie wykonywania. Jeśli ją wyłączysz, zestaw SDK nie udostępni żadnych funkcji aktualizacji w aplikacji, ale nadal będzie można używać usługi distribute service w portalu App Center.

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

Aby ponownie włączyć usługę App Center Distribute, użyj tego samego interfejsu API, ale przekaż true go jako parametr.

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

Stan jest utrwalany w magazynie urządzenia w przypadku uruchamiania aplikacji.

Ten interfejs API jest asynchroniczny. Więcej informacji na ten temat można przeczytać w przewodniku asynchronicznych interfejsów API centrum aplikacji .

Uwaga

Ta metoda musi być używana tylko po Distribute uruchomieniu.

Sprawdzanie, czy włączono dystrybucję usługi App Center

Możesz również sprawdzić, czy usługa App Center Distribute jest włączona, czy nie:

Distribute.isEnabled();
Distribute.isEnabled()

Ten interfejs API jest asynchroniczny. Więcej informacji na ten temat można przeczytać w przewodniku asynchronicznych interfejsów API centrum aplikacji .

Uwaga

Ta metoda musi być używana tylko po Distribute uruchomieniu. Zawsze będzie ona zwracana false przed rozpoczęciem.

Włączanie aktualizacji w aplikacji dla kompilacji debugowania

Domyślnie usługa App Center włącza aktualizacje w aplikacji tylko dla kompilacji wydań.

Aby włączyć aktualizacje w aplikacji w kompilacjach debugowania, wywołaj następującą metodę przed poleceniem AppCenter.start:

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

Uwaga

Ta metoda ma wpływ tylko na kompilacje debugowania i nie ma wpływu na kompilacje wydania. Kompilacja debugowania oznacza, że flaga android:debuggable jest ustawiona na true (zwykle jest automatycznie ustawiana przez wstępnie zdefiniowane warianty kompilacji debugowania narzędzia Gradle). W przeciwnym razie jest to kompilacja wydania.

Jak działają aktualizacje w aplikacji?

Uwaga

Aby aktualizacje w aplikacji działały, należy pobrać kompilację aplikacji z linku. Nie będzie działać, jeśli jest zainstalowany z poziomu środowiska IDE lub ręcznie.

Funkcja aktualizacji w aplikacji działa w następujący sposób:

  1. Ta funkcja działa tylko z kompilacjami RELEASE (domyślnie), które są dystrybuowane przy użyciu usługi rozproszonej Centrum aplikacji .

  2. Po zintegrowaniu zestawu SDK skompiluj wersję wydania aplikacji i przekażesz do Centrum aplikacji, użytkownicy w tej grupie dystrybucyjnej będą powiadamiani o nowej wersji za pośrednictwem poczty e-mail.

  3. Gdy każdy użytkownik otworzy link w wiadomości e-mail, aplikacja zostanie zainstalowana na swoim urządzeniu. Ważne jest, aby zainstalować link poczty e-mail — nie obsługujemy ładowania bezpośredniego. Po pobraniu aplikacji z linku zestaw SDK zapisuje ważne informacje z plików cookie w celu późniejszego sprawdzania dostępności aktualizacji. W przeciwnym razie zestaw SDK nie ma tych kluczowych informacji.

  4. Jeśli aplikacja ustawi ścieżkę na prywatną, zostanie otwarta przeglądarka w celu uwierzytelnienia użytkownika i włączenia aktualizacji w aplikacji. Przeglądarka nie zostanie ponownie otwarta, o ile informacje o uwierzytelnianiu pozostaną prawidłowe, nawet po ponownym przełączeniu do publicznej ścieżki i powrotu do prywatności później. Jeśli uwierzytelnianie przeglądarki zakończy się pomyślnie, użytkownik zostanie automatycznie przekierowany z powrotem do aplikacji. Jeśli utwór jest publiczny (co jest ustawieniem domyślnym), następny krok odbywa się bezpośrednio.

  5. W nowej wersji aplikacji jest wyświetlane okno dialogowe aktualizacji w aplikacji z prośbą o zaktualizowanie aplikacji, jeśli jest to:

    • wyższa wartość lub versionCode
    • równej wartości , versionCode ale innej wartości .versionName

Porada

Jeśli przekażesz ten sam plik APK po raz drugi, okno dialogowe NIE będzie wyświetlane, ponieważ wersje są identyczne.

Jak mogę testowanie aktualizacji w aplikacji?

Należy przekazać kompilacje wydania (korzystające z modułu Distribute of the App Center SDK) do portalu Centrum aplikacji w celu testowania aktualizacji w aplikacji, zwiększając liczbę wersji za każdym razem.

  1. Utwórz aplikację w portalu Centrum aplikacji, jeśli jeszcze tego nie zrobiono.
  2. Utwórz nową grupę dystrybucyjną i nadaj jej nazwę, aby móc rozpoznać, że jest przeznaczona do testowania funkcji aktualizacji w aplikacji.
  3. Dodaj siebie (lub wszystkie osoby, które chcesz dołączyć do testu funkcji aktualizacji w aplikacji). Użyj nowego lub odrzuconego adresu e-mail, który nie był używany dla tej aplikacji w Centrum aplikacji. Dzięki temu twoje doświadczenie jest zbliżone do doświadczenia rzeczywistych testerów.
  4. Utwórz nową kompilację aplikacji, która obejmuje dystrybucję usługi App Center i zawiera logikę konfiguracji zgodnie z powyższym opisem. Jeśli grupa jest prywatna, nie zapomnij ustawić prywatnej ścieżki aktualizacji w aplikacji przed rozpoczęciem korzystania z interfejsu API setUpdateTrack.
  5. Kliknij przycisk Rozpowszechnij nową wersję w portalu i przekaż swoją kompilację aplikacji.
  6. Po zakończeniu przekazywania kliknij przycisk Dalej i wybierz grupę dystrybucyjną utworzoną jako miejsce docelowe dystrybucji aplikacji.
  7. Przejrzyj sekcję Dystrybucja i rozpowszechnij kompilację do grupy testowania w aplikacji.
  8. Osoby w tej grupie otrzyma zaproszenie do testerów aplikacji. Po zaakceptowaniu zaproszenia użytkownicy mogą pobrać aplikację z portalu Centrum aplikacji z urządzenia przenośnego. Po zainstalowaniu aktualizacji w aplikacji możesz przystąpić do testowania aktualizacji w aplikacji.
  9. Podnieś poziom versionCode aplikacji.
  10. Skompiluj wersję wydania aplikacji i przekaż nową kompilację aplikacji, tak jak w poprzednim kroku, i przekaż ją do utworzonej wcześniej grupy dystrybucyjnej . Członkowie grupy dystrybucyjnej będą monitowani o nową wersję przy następnym uruchomieniu aplikacji.

Porada

Zapoznaj się z informacjami na temat sposobu korzystania z usługi App Center Distribute w celu uzyskania bardziej szczegółowych informacji na temat grup dystrybucyjnych itp. Chociaż można użyć usługi App Center Distribute do dystrybucji nowej wersji aplikacji bez dodawania kodu, dodanie usługi App Center Distribute do kodu aplikacji spowoduje bardziej bezproblemowe środowisko dla testerów i użytkowników w miarę uzyskiwania środowiska aktualizacji w aplikacji.