App Center Distributed – Android-In-App-Updates

Wichtig

Visual Studio App Center wird am 31. März 2025 eingestellt. Sie können Visual Studio App Center zwar weiterhin verwenden, bis es vollständig eingestellt ist, es gibt jedoch mehrere empfohlene Alternativen, zu denen Sie möglicherweise eine Migration in Erwägung ziehen.

Erfahren Sie mehr über Supportzeitpläne und Alternativen.

App Center Distribute ermöglicht es Ihren Benutzern, eine neue Version der App zu installieren, wenn Sie sie über App Center verteilen. Wenn eine neue Version der App verfügbar ist, stellt das SDK den Benutzern ein Updatedialogfeld bereit, um die neue Version herunterzuladen oder zu verschieben. Sobald sie sich für die Aktualisierung entschieden haben, beginnt das SDK mit der Aktualisierung Ihrer Anwendung.

Warnung

Google Play betrachtet den In-App-Updatecode als schädliches Verhalten, auch wenn er zur Laufzeit nicht verwendet wird. Verwenden Sie eine Variante des Distribute SDK, wie in diesem Abschnitt beschrieben, oder entfernen Sie das Distribute SDK, das In-App-Updatecode enthält, vollständig, bevor Sie Ihre App an Google Play übermitteln. Wenn dies nicht geschieht, kann dies dazu führen, dass die App nicht konform ist und die App aus Google Play entfernt wird.

Hinweis

Wenn Sie automatisierte Benutzeroberflächentests ausführen, blockieren aktivierte In-App-Updates Ihre automatisierten Ui-Tests, da sie versuchen, sich beim App Center-Back-End zu authentifizieren. Es wird empfohlen, App Center Distribute nicht für Ihre Benutzeroberflächentests zu aktivieren.

Hinzufügen von In-App-Updates zu Ihrer App

Folgen Sie dem Abschnitt Erste Schritte , wenn Sie das SDK in Ihrer Anwendung noch nicht eingerichtet und gestartet haben.

1. Hinzufügen des App Center-Moduls "Verteilen"

Das App Center SDK ist mit einem modularen Ansatz konzipiert. Entwickler müssen nur die Module der Dienste integrieren, an denen sie interessiert sind.

  1. Öffnen Sie die Datei build.gradle () auf App-Ebene des Projekts,app/build.gradle und fügen Sie die folgenden Zeilen nach apply pluginhinzu.

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

    Hinweis

    Wenn die Version Ihres Android Gradle-Plug-Ins niedriger als 3.0.0 ist, müssen Sie die Implementierung durch compile ersetzen.

  2. Speichern Sie Die Datei build.gradle , und lösen Sie eine Gradle-Synchronisierung in Android Studio aus.

  3. DownloadManager wird zum Herunterladen von Updates verwendet. Das App Center SDK erzwingt TLS 1.2, um die Sicherheit zu verbessern.

2. Starten von App Center Distribute

Um App Center zu verwenden, wählen Sie die Module aus, die Sie verwenden möchten. Standardmäßig werden keine Module gestartet, und sie müssen beim Starten des SDK explizit aufgerufen werden.

Fügen Sie ihrer AppCenter.start() Methode die Distribute-Klasse hinzu, um den App Center Distribute-Dienst zu starten.

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

Stellen Sie sicher, dass Sie im codebeispiel oben durch Ihr App Secret ersetzt {Your App Secret} haben. Android Studio schlägt automatisch die erforderliche Import-Anweisung vor, sobald Sie der -Methode einen Verweis auf die Distribute -Klasse start() hinzufügen. Wenn jedoch ein Fehler angezeigt wird, dass die Klassennamen nicht erkannt werden, fügen Sie den Importanweisungen in Ihrer Aktivitätsklasse die folgenden Zeilen hinzu:

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

Hinweis

Android 10 oder höher hat Einschränkungen für die Startaktivität im Hintergrund. Weitere Informationen finden Sie im Artikel zu Einschränkungen beim Starten von Aktivitäten im Hintergrund.

Hinweis

Apps, die unter Android 10 (Go Edition) ausgeführt werden, können nicht die berechtigung SYSTEM_ALERT_WINDOW erhalten. Weitere Informationen finden Sie im Artikel SYSTEM_ALERT_WINDOW für Go-Geräte.

Hinweis

Ab Android 11 ACTION_MANAGE_OVERLAY_PERMISSION bringen Absichten den Benutzer immer zum Bildschirm "Einstellungen auf oberster Ebene", wo der Benutzer die SYSTEM_ALERT_WINDOW Berechtigungen für Apps erteilen oder widerrufen kann. Weitere Informationen finden Sie im Artikel zu Berechtigungsupdates in Android 11.

Vorbereiten Ihres Google Play-Builds

Google Play betrachtet den In-App-Updatecode als schädliches Verhalten, auch wenn er zur Laufzeit nicht verwendet wird. Verwenden Sie eine Variante des Distribute SDK, wie in diesem Abschnitt beschrieben, oder entfernen Sie das Distribute SDK, das In-App-Updatecode enthält, vollständig, bevor Sie Ihre App an Google Play übermitteln. Wenn dies nicht geschieht, kann dies dazu führen, dass die App nicht konform ist und die App aus Google Play entfernt wird. Um dies zu vereinfachen, stellen wir die Version des App Center Distribute SDK mit stubbed-APIs bereit, sodass die einzige Änderung für Sie ein Abhängigkeitstausch ist.

  1. Öffnen Sie die Datei build.gradle (app/build.gradle) auf App-Ebene des Projekts.

  2. Konfigurieren Sie Buildvarianten durch Hinzufügen von Produktvarianten:

    android {
        flavorDimensions "distribute"
        productFlavors {
            appCenter {
                dimension "distribute"
            }
            googlePlay {
                dimension "distribute"
            }
        }
    }
    
  3. Ändern Sie den Abhängigkeitsblock, um verschiedene Abhängigkeiten basierend auf dem Produkttyp zu nutzen:

    dependencies {
        def appCenterSdkVersion = "5.0.4"
        appCenterImplementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
        googlePlayImplementation "com.microsoft.appcenter:appcenter-distribute-play:${appCenterSdkVersion}"
    }
    
  4. Speichern Sie Die Datei build.gradle , und lösen Sie eine Gradle-Synchronisierung in Android Studio aus.

  5. Sie können die Buildvariante im Dropdownmenü Build > select Build Variant oder Build Variants in der Symbolleiste ändern.

Weitere Informationen zum Konfigurieren von Buildvarianten finden Sie in der Android-Dokumentation.

Verwenden einer privaten Verteilergruppe

Standardmäßig verwendet Distribute eine öffentliche Verteilergruppe. Wenn Sie eine private Verteilergruppe verwenden möchten, müssen Sie diese explizit über setUpdateTrack die API festlegen.

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

Hinweis

Standardwert: UpdateTrack.PUBLIC. Diese Methode kann nur vor dem AppCenter.start Methodenaufruf aufgerufen werden. Änderungen an der Updateverfolgung werden nicht beibehalten, wenn der Anwendungsprozess neu gestartet wird. Wenn die Methode also nicht immer vor dem AppCenter.start Aufruf aufgerufen wird, ist sie standardmäßig öffentlich.

Wenn sich die App im Vordergrund (nach Distribute.setUpdateTrack(UpdateTrack.PRIVATE); und AppCenter.start) befindet, wird ein Browserfenster zur Authentifizierung des Benutzers geöffnet. Alle nachfolgenden Updateprüfungen erhalten die neueste Version auf der privaten Spur.

Wenn sich ein Benutzer im privaten Bereich befindet, bedeutet dies, dass er nach der erfolgreichen Authentifizierung die neueste Version von allen privaten Verteilergruppen erhält, denen er angehört. Wenn sich ein Benutzer auf dem öffentlichen Pfad befindet, bedeutet dies, dass er die neueste Version von jeder öffentlichen Verteilergruppe erhält.

Deaktivieren der automatischen Überprüfung auf Update

Standardmäßig sucht das SDK automatisch nach neuen Releases:

  • Wenn die Anwendung gestartet wird.
  • Wenn die Anwendung nach dem Wechsel zum Hintergrund in den Vordergrund wechselt.
  • Wenn Sie das Modul Verteilen aktivieren, wenn sie zuvor deaktiviert sind.

Wenn Sie manuell nach neuen Releases suchen möchten, können Sie die automatische Überprüfung auf Updates deaktivieren. Rufen Sie hierzu die folgende Methode auf, bevor Sie das SDK starten:

Distribute.disableAutomaticCheckForUpdate();
Distribute.disableAutomaticCheckForUpdate()

Hinweis

Diese Methode muss vor dem AppCenter.start Methodenaufruf aufgerufen werden.

Anschließend können Sie die checkForUpdate API verwenden, die im folgenden Abschnitt beschrieben wird.

Manuelle Überprüfung auf Update

Distribute.checkForUpdate();
Distribute.checkForUpdate()

Dadurch wird eine Anforderung an App Center gesendet und ein Updatedialogfeld angezeigt, falls ein neues Release verfügbar ist.

Hinweis

Eine manuelle Überprüfung auf Updateaufrufe funktioniert auch dann, wenn automatische Updates aktiviert sind. Eine manuelle Überprüfung auf Aktualisierung wird ignoriert, wenn bereits eine andere Überprüfung durchgeführt wird. Die manuelle Überprüfung auf Updates wird nicht verarbeitet, wenn der Benutzer Updates verschoben hat (es sei denn, die neueste Version ist ein obligatorisches Update).

Anpassen oder Lokalisieren des In-App-Updatedialogfelds

1. Anpassen oder Lokalisieren von Text

Sie können ganz einfach Eigene Ressourcenzeichenfolgen bereitstellen, wenn Sie den im Dialogfeld "Aktualisieren" angezeigten Text ändern oder lokalisieren möchten. Sehen Sie sich die Zeichenfolgendateien in dieser Ressourcendatei an. Verwenden Sie denselben Zeichenfolgennamen/-schlüssel, und geben Sie den lokalisierten Wert an, der im Dialogfeld in Ihren eigenen App-Ressourcendateien angezeigt werden soll.

2. Anpassen des Aktualisierungsdialogfelds

Sie können die Darstellung des Standardupdatedialogfelds anpassen, indem Sie die DistributeListener Schnittstelle implementieren. Sie müssen den Listener registrieren, bevor Sie aufrufen AppCenter.start , wie im folgenden Beispiel gezeigt:

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

Hier sehen Sie ein Beispiel für die Listenerimplementierung, die das SDK-Dialogfeld durch einen benutzerdefinierten ersetzt:

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

Wie im Beispiel gezeigt, müssen Sie entweder aufrufen Distribute.notifyUpdateAction(UpdateAction.UPDATE); oder Distribute.notifyUpdateAction(UpdateAction.POSTPONE); , wenn Ihr Listener zurückgibt true.

Wenn Sie nicht aufrufen notifyUpdateAction, wiederholt sich der Rückruf bei jeder Aktivitätsänderung.

Der Listener kann mit derselben Version erneut aufgerufen werden, wenn sich die Aktivität ändert, bevor die Benutzeraktion an das SDK benachrichtigt wird.

Dieses Verhalten ist erforderlich, um die folgenden Szenarien abzudecken:

  • Ihre Anwendung wird an den Hintergrund gesendet (z. B. durch Drücken von HOME), und dann in einer anderen Aktivität fortgesetzt.
  • Ihre Aktivität wird von einer anderen Aktivität abgedeckt, ohne die Anwendung zu verlassen (z. B. auf einige Benachrichtigungen klicken).
  • Andere ähnliche Szenarien.

In diesem Fall kann die Aktivität, die das Dialogfeld hosten, ohne Benutzerinteraktion ersetzt werden. Daher ruft das SDK den Listener erneut auf, damit Sie das benutzerdefinierte Dialogfeld wiederherstellen können.

In Fällen, in dem das SDK nach Updates sucht und keine Updates findet, die neuer verfügbar sind als die aktuell verwendete, wird ein onNoReleaseAvailable Rückruf von DistributeListener der Schnittstelle aufgerufen. Dadurch können Sie benutzerdefinierten Code in solchen Szenarien ausführen. Das obige Beispiel zeigt, wie Popupmeldungen angezeigt werden, wenn keine Updates gefunden werden.

Aktivieren oder Deaktivieren von App Center Distribute zur Laufzeit

Sie können App Center Distribute zur Laufzeit aktivieren und deaktivieren. Wenn Sie es deaktivieren, stellt das SDK keine In-App-Updatefunktionen bereit, Sie können jedoch weiterhin den Verteilungsdienst im App Center-Portal verwenden.

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

Um App Center Distribute erneut zu aktivieren, verwenden Sie dieselbe API, übergeben true sie aber als Parameter.

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

Der Zustand wird im Speicher des Geräts bei allen Anwendungsstarts beibehalten.

Diese API ist asynchron. Weitere Informationen hierzu finden Sie in unserem Leitfaden für asynchrone App Center-APIs .

Hinweis

Diese Methode darf erst nach dem Distribute Start verwendet werden.

Überprüfen, ob App Center Distributed aktiviert ist

Sie können auch überprüfen, ob App Center Distribute aktiviert ist oder nicht:

Distribute.isEnabled();
Distribute.isEnabled()

Diese API ist asynchron. Weitere Informationen hierzu finden Sie in unserem Leitfaden für asynchrone App Center-APIs .

Hinweis

Diese Methode darf erst nach dem Distribute Start verwendet werden. Sie wird immer vor dem Start zurückgegeben false .

Aktivieren von In-App-Updates für Debugbuilds

App Center aktiviert standardmäßig In-App-Updates nur für Releasebuilds.

Um In-App-Updates in Debugbuilds zu aktivieren, rufen Sie die folgende Methode vor AppCenter.startauf:

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

Hinweis

Diese Methode wirkt sich nur auf Debugbuilds aus und hat keine Auswirkungen auf Releasebuilds. Debugbuild bedeutet, dass das Flag auf true festgelegt ist (was in der android:debuggable Regel automatisch durch gradle vordefinierte Debugbuildvarianten festgelegt wird). Andernfalls handelt es sich um einen Releasebuild.

Wie funktionieren In-App-Updates?

Hinweis

Damit In-App-Updates funktionieren, sollte ein App-Build über den Link heruntergeladen werden. Es funktioniert nicht, wenn es über eine IDE oder manuell installiert wird.

Das Feature für In-App-Updates funktioniert wie folgt:

  1. Dieses Feature funktioniert nur mit RELEASE-Builds (standardmäßig), die mithilfe des App Center-Verteilungsdiensts verteilt werden.

  2. Nachdem Sie das SDK integriert haben, die Releaseversion Ihrer App erstellen und in App Center hochladen, werden die Benutzer in dieser Verteilergruppe per E-Mail über das neue Release benachrichtigt.

  3. Wenn jeder Benutzer den Link in seiner E-Mail öffnet, wird die Anwendung auf dem Gerät installiert. Es ist wichtig, dass sie den E-Mail-Link für die Installation verwenden. Das Querladen wird nicht unterstützt. Wenn eine Anwendung über den Link heruntergeladen wird, speichert das SDK wichtige Informationen aus Cookies, um später nach Updates zu suchen, andernfalls verfügt das SDK nicht über diese Schlüsselinformationen.

  4. Wenn die Anwendung die Spur auf privat festlegt, wird ein Browser geöffnet, um den Benutzer zu authentifizieren und In-App-Updates zu aktivieren. Der Browser wird nicht wieder geöffnet, solange die Authentifizierungsinformationen auch dann gültig bleiben, wenn sie wieder zur öffentlichen Spur und später wieder zurück zu privat wechseln. Wenn die Browserauthentifizierung erfolgreich ist, wird der Benutzer automatisch zurück zur Anwendung weitergeleitet. Wenn die Spur öffentlich ist (dies ist die Standardeinstellung), erfolgt der nächste Schritt direkt.

  5. Eine neue Version der App zeigt das In-App-Updatedialogfeld an, in dem Benutzer aufgefordert werden, Ihre Anwendung zu aktualisieren, wenn es sich um folgendes handelt:

    • einen höheren Wert von versionCode oder
    • ein gleicher Wert von, versionCode aber ein anderer Wert von versionName.

Tipp

Wenn Sie dasselbe APK ein zweites Mal hochladen, wird das Dialogfeld NICHT angezeigt, da die Versionen identisch sind.

Gewusst wie In-App-Updates testen?

Sie müssen Releasebuilds (die das Verteilungsmodul des App Center SDK verwenden) in das App Center-Portal hochladen, um In-App-Updates zu testen und die Versionszahlen jedes Mal zu erhöhen.

  1. Erstellen Sie Ihre App im App Center-Portal, falls noch nicht geschehen.
  2. Erstellen Sie eine neue Verteilergruppe, und benennen Sie sie, damit Sie erkennen können, dass sie zum Testen der In-App-Updatefunktion bestimmt ist.
  3. Fügen Sie sich selbst hinzu (oder alle Personen, die Sie in Ihren Test des In-App-Updatefeatures einbeziehen möchten). Verwenden Sie hierfür eine neue E-Mail-Adresse oder eine E-Mail-Adresse, die nicht für diese App im App Center verwendet wurde. Dadurch wird sichergestellt, dass Ihre Erfahrung nahe an der Erfahrung Ihrer echten Tester liegt.
  4. Erstellen Sie einen neuen Build Ihrer App, der App Center Distributed enthält und die Oben beschriebene Setuplogik enthält. Wenn die Gruppe privat ist, vergessen Sie nicht, die private In-App-Updatespur festzulegen, bevor Sie die setUpdateTrack-API verwenden.
  5. Klicken Sie im Portal auf die Schaltfläche Neues Release verteilen , und laden Sie Ihren Build der App hoch.
  6. Klicken Sie nach Abschluss des Uploads auf Weiter , und wählen Sie die Verteilergruppe aus, die Sie als Ziel dieser App-Verteilung erstellt haben.
  7. Überprüfen Sie die Verteilung, und verteilen Sie den Build an Ihre In-App-Testgruppe.
  8. Personen in dieser Gruppe erhalten eine Einladung, Tester der App zu sein. Sobald sie die Einladung angenommen haben, können sie die App aus dem App Center-Portal von ihrem mobilen Gerät herunterladen. Sobald In-App-Updates installiert sind, können Sie In-App-Updates testen.
  9. Stoßen Sie die versionCode Ihrer App.
  10. Erstellen Sie die Releaseversion Ihrer App, laden Sie wie im vorherigen Schritt einen neuen Build Ihrer App hoch, und verteilen Sie sie an die zuvor erstellte Verteilergruppe . Mitglieder der Verteilergruppe werden beim nächsten Start der App zur Eingabe einer neuen Version aufgefordert.

Tipp

Sehen Sie sich die Informationen zur Verwendung von App Center Distribute an, um ausführlichere Informationen zu Verteilergruppen usw. zu erhalten. Es ist zwar möglich, App Center Distribute zu verwenden, um eine neue Version Ihrer App zu verteilen, ohne Code hinzuzufügen, aber das Hinzufügen von App Center Distribute zum Code Ihrer App führt zu einer nahtloseren Benutzeroberfläche für Ihre Tester und Benutzer, wenn sie die In-App-Update-Erfahrung erhalten.