App Center Distribute - Aggiornamenti di MAUI e Xamarin In-app
Importante
Visual Studio App Center è previsto per il ritiro il 31 marzo 2025. Anche se è possibile continuare a usare Visual Studio App Center fino a quando non viene completamente ritirato, esistono diverse alternative consigliate che è possibile considerare la migrazione a.
Altre informazioni sulle sequenze temporali di supporto e sulle alternative.
App Center Distribute consente agli utenti di installare una nuova versione dell'app quando la si distribuisce tramite App Center. Con una nuova versione dell'app disponibile, l'SDK presenterà una finestra di dialogo di aggiornamento agli utenti per scaricare o rinviare la nuova versione. Dopo aver scelto di aggiornare, l'SDK inizierà ad aggiornare l'applicazione.
Avviso
Google Play considera il codice di aggiornamento in-app come comportamento dannoso anche se non viene usato in fase di esecuzione. Usare una variante dell'SDK di distribuzione come indicato in questa sezione prima di inviare l'app a Google Play. Non è possibile rimuovere il codice di aggiornamento in-app può causare la mancata conformità e la rimozione dell'app da Google Play.
Nota
Se si eseguono test automatizzati dell'interfaccia utente, gli aggiornamenti in-app abilitati bloccano i test automatici dell'interfaccia utente man mano che tenteranno di eseguire l'autenticazione nel back-end di App Center. È consigliabile non abilitare App Center Distribute per i test dell'interfaccia utente.
Aggiungere aggiornamenti in-app all'app
Seguire la sezione Introduzione se non è ancora stato configurato e avviato l'SDK nell'applicazione.
1. Aggiungere il modulo Distribuzione di App Center
App Center SDK è progettato con un approccio modulare: uno sviluppatore deve integrare solo i moduli dei servizi interessati.
Visual Studio per Mac
- Aprire Visual Studio per Mac.
- Fare clic su Apri file> e scegliere la soluzione.
- Nel navigatore della soluzione fare clic con il pulsante destro del mouse sulla sezione Pacchetti e scegliere Aggiungi pacchetti NuGet....
- Cercare App Center e installare App Center Distribute.
- Fare clic su Aggiungi pacchetti.
Visual Studio per Windows
- Aprire Visual Studio per Windows.
- Fare clic su Apri file> e scegliere la soluzione.
- Nel navigatore della soluzione fare clic con il pulsante destro del mouse su Riferimenti e scegliere Gestisci pacchetti NuGet.
- Cercare App Center e installare Microsoft.AppCenter.Distribute.
Console di Gestione pacchetti
- Aprire la console in Visual Studio. A tale scopo, scegliere Strumenti>di Gestione pacchetti NuGetPackage Manager> Console.
- Se si lavora in Visual Studio per Mac, assicurarsi di aver installato le estensioni di gestione pacchetti NuGet. Per questo motivo, scegliere Estensioni di Visual Studio>, cercare NuGet e installare, se necessario.
- Digitare il comando seguente nella console:
Install-Package Microsoft.AppCenter.Distribute
Nota
Se si usa App Center SDK in un progetto portatile (ad esempio Xamarin.Forms), è necessario installare i pacchetti in ognuno dei progetti: quelli portatili, Android e iOS. A tale scopo, è necessario aprire ogni sottoprogetto e seguire i passaggi corrispondenti descritti nelle sezioni Visual Studio per Mac o Visual Studio per Windows.
Nota
Android 10 o versione successiva ha restrizioni per l'attività di avvio in background. Vedere l'articolo sulle restrizioni sull'avvio di attività in background.
Nota
Le app in esecuzione in Android 10 (edizione Go) non possono ricevere l'autorizzazione di SYSTEM_ALERT_WINDOW . Vedere l'articolo relativo alle SYSTEM_ALERT_WINDOW nei dispositivi Go.
Nota
A partire da Android 11, ACTION_MANAGE_OVERLAY_PERMISSION
le finalità portano sempre l'utente alla schermata Impostazioni di primo livello, in cui l'utente può concedere o revocare le SYSTEM_ALERT_WINDOW
autorizzazioni per le app. Vedere l'articolo sugli aggiornamenti delle autorizzazioni in Android 11.
2. Avviare App Center Distribute
Configurare App Center SDK chiamando AppCenter.Start(...)
come descritto nella Guida introduttiva.
Per l'applicazione iOS aprire e AppDelegate.cs
aggiungere la riga seguente prima della chiamata a LoadApplication
:
Distribute.DontCheckForUpdatesInDebug();
Questo passaggio non è necessario in Android in cui la configurazione di debug viene rilevata automaticamente in fase di esecuzione.
Per abilitare gli aggiornamenti in-app per le build di debug in Android, chiamare il metodo seguente nel file di MainActivity.cs del progetto, nel OnCreate
metodo e prima LoadApplication
di .
Distribute.SetEnabledForDebuggableBuild(true);
Nota
Questo metodo influisce solo sulle build di debug e non ha alcun impatto sulle build di versione.
2.3 [Solo per iOS] Modificare l'info.plist del progetto
App Center SDK controlla il reindirizzamento degli URL all'applicazione per evitare il sideload, quindi per poter gestire correttamente gli aggiornamenti distribuiti tramite il portale, è necessario specificare CFBundleURLSchemes
nella CFBundleURLTypes
sezione del Info.plist
file:
Nota
Info.plist
o un file di elenco di proprietà informazioni è un file di testo strutturato che contiene informazioni di configurazione essenziali per un eseguibile in bundle.
Per altre informazioni, vedere la documentazione per sviluppatori Apple.
- Aggiungere una nuova chiave per
URL types
oCFBundleURLTypes
nel file Info.plist (nel caso in cui Xcode visualizzi info.plist come codice sorgente). - Modificare la chiave del primo elemento figlio in
URL Schemes
oCFBundleURLSchemes
. - Immettere
appcenter-${APP_SECRET}
come schema URL e sostituire${APP_SECRET}
con il segreto app dell'app.
Suggerimento
Se si vuole verificare che l'info.plist sia stato modificato correttamente, aprirlo come codice sorgente. Deve contenere la voce seguente con il segreto dell'app anziché ${APP_SECRET}
:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>appcenter-${APP_SECRET}</string>
</array>
</dict>
</array>
Rimuovere gli aggiornamenti in-app per le compilazioni di Google Play
Google Play considera il codice di aggiornamento in-app come comportamento dannoso anche se non viene usato in fase di esecuzione. Non è possibile rimuovere il codice di aggiornamento in-app può causare la mancata conformità e la rimozione dell'app da Google Play. Per semplificare, è possibile fornire la versione di App Center Distribute SDK con API sbbed, quindi l'unica modifica per l'utente è uno scambio di dipendenze.
Aggiungere una nuova configurazione di compilazione denominata
GooglePlay
per i progetti Xamarin.Android e condivisi. Assicurarsi che la configurazione della compilazione dei progetti sia mappata correttamente alla configurazione della soluzione appropriata. Per altre informazioni, vedere Visual Studio o Visual Studio per Mac istruzioni.Aprire Xamarin.Android e progetti condivisi in
.csproj
qualsiasi editor di testo e spostare i riferimenti distribuiti nel gruppo di elementi condizionali:<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>
Nota
Se si usa un formato di packages.config precedente per gestire i riferimenti NuGet, è possibile eseguire la migrazione a un formato PackageReference , seguire l'istruzione di migrazione.
Salvare le modifiche e ripristinare i pacchetti NuGet.
È possibile modificare la configurazione nella barra dei comandi nella parte superiore dell'IDE.
Usare il gruppo di distribuzione privato
Per impostazione predefinita, Distribute usa un gruppo di distribuzione pubblico. Se si vuole usare un gruppo di distribuzione privato, è necessario impostarlo in modo esplicito tramite UpdateTrack
la proprietà.
Distribute.UpdateTrack = UpdateTrack.Private;
Nota
Il valore predefinito è UpdateTrack.Public
. Questa proprietà può essere aggiornata solo prima della chiamata al AppCenter.Start
metodo. Le modifiche apportate alla traccia di aggiornamento non vengono mantenute quando il processo dell'applicazione viene riavviato e quindi se la proprietà non viene sempre aggiornata prima della AppCenter.Start
chiamata, sarà pubblica, per impostazione predefinita.
Dopo questa chiamata, verrà aperta una finestra del browser per autenticare l'utente. Tutti i controlli di aggiornamento successivi otterranno la versione più recente sulla traccia privata. La traccia di aggiornamento non viene mantenuta nell'SDK tra i lanci dell'app.
Se un utente si trova sulla traccia privata, significa che dopo l'autenticazione completata, otterranno la versione più recente da tutti i gruppi di distribuzione privati di cui sono membri. Se un utente si trova sulla traccia pubblica, significa che otterrà la versione più recente da qualsiasi gruppo di distribuzione pubblico.
Disabilita controllo automatico per l'aggiornamento
Per impostazione predefinita, l'SDK controlla automaticamente le nuove versioni:
- All'avvio dell'applicazione.
- Quando l'applicazione entra in background, in primo piano di nuovo.
- Quando si abilita il modulo Distribuisci se in precedenza è disabilitato.
Se si vuole verificare manualmente la disponibilità di nuove versioni, è possibile disabilitare il controllo automatico per l'aggiornamento. A tale scopo, chiamare il metodo seguente prima dell'avvio dell'SDK:
Distribute.DisableAutomaticCheckForUpdate();
Nota
Questo metodo deve essere chiamato prima della chiamata al AppCenter.Start
metodo.
È quindi possibile usare l'API CheckForUpdate
descritta nella sezione seguente.
Controllare manualmente la disponibilità di aggiornamenti
Distribute.CheckForUpdate();
Nota
Un controllo manuale della chiamata di aggiornamento funziona anche quando sono abilitati gli aggiornamenti automatici. Un controllo manuale per l'aggiornamento viene ignorato se è già in corso un altro controllo. Il controllo manuale per l'aggiornamento non verrà elaborato se l'utente ha posticipato gli aggiornamenti (a meno che la versione più recente non sia un aggiornamento obbligatorio).
Personalizzare o localizzare la finestra di dialogo di aggiornamento in-app
1. Personalizzare o localizzare il testo
È possibile specificare facilmente stringhe di risorse personalizzate se si vuole localizzare il testo visualizzato nella finestra di dialogo di aggiornamento. Esaminare i file di stringa per iOS in questo file di risorse e quelli per Android in questo file di risorse. Usare la stessa stringa nome/chiave e specificare il valore localizzato da riflettere nella finestra di dialogo nei propri file di risorse dell'app.
2. Personalizzare la finestra di dialogo di aggiornamento
È possibile personalizzare l'aspetto della finestra di dialogo di aggiornamento predefinita implementando il ReleaseAvailable
callback. È necessario registrare il callback prima di chiamare AppCenter.Start
come illustrato nell'esempio seguente:
// In this example OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;
AppCenter.Start(...);
Di seguito è riportato un esempio dell'implementazione del callback che sostituisce la finestra di dialogo SDK con una versione personalizzata:
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;
}
Note sull'implementazione per Xamarin.Android:
Come illustrato nell'esempio, è necessario chiamare Distribute.NotifyUpdateAction(UpdateAction.UPDATE);
o Distribute.NotifyUpdateAction(UpdateAction.POSTPONE);
se il callback restituisce true
.
Se non si chiama NotifyUpdateAction
, il callback verrà ripetuto in ogni modifica dell'attività.
Il callback può essere chiamato di nuovo con la stessa versione se l'attività cambia prima che l'azione dell'utente venga notificata all'SDK.
Questo comportamento è necessario per coprire gli scenari seguenti:
- L'applicazione viene inviata in background (ad esempio premendo HOME) e quindi ripresa in un'attività diversa.
- L'attività è coperta da un'altra senza uscire dall'applicazione (ad esempio facendo clic su alcune notifiche).
- Altri scenari simili.
In tal caso, l'attività che ospita il dialogo potrebbe essere sostituita senza l'interazione dell'utente. L'SDK chiama di nuovo il listener in modo da poter ripristinare la finestra di dialogo personalizzata.
3. Eseguire il codice se non vengono trovati aggiornamenti
Nei casi in cui l'SDK controlla la disponibilità di aggiornamenti e non trova aggiornamenti disponibili più recenti di quelli attualmente usati, viene richiamato un NoReleaseAvailable
callback. In questo modo è possibile eseguire codice personalizzato in tali scenari.
È necessario registrare il callback prima di chiamare AppCenter.Start
come illustrato nell'esempio seguente:
// 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.");
}
Abilitare o disabilitare App Center Distribute in fase di esecuzione
È possibile abilitare e disabilitare App Center Distribute in fase di esecuzione. Se la si disabilita, l'SDK non fornirà alcuna funzionalità di aggiornamento in-app, ma è comunque possibile usare il servizio Distribuisci nel portale di App Center.
Distribute.SetEnabledAsync(false);
Per abilitare di nuovo App Center Distribute, usare la stessa API ma passare true
come parametro.
Distribute.SetEnabledAsync(true);
Non è necessario attendere questa chiamata per rendere coerenti altre chiamate API ( ad esempio IsEnabledAsync
).
Lo stato viene salvato in modo permanente nella risorsa di archiviazione del dispositivo tra i lanci dell'applicazione.
Nota
Questo metodo deve essere utilizzato solo dopo Distribute
l'avvio.
Controllare se App Center Distribute è abilitato
È anche possibile controllare se App Center Distribute è abilitato o meno:
bool enabled = await Distribute.IsEnabledAsync();
Nota
Questo metodo deve essere utilizzato solo dopo Distribute
l'avvio, ma restituirà false
sempre prima dell'avvio.
Eseguire la pulizia subito prima della chiusura dell'app per l'aggiornamento (solo iOS)
Registrare il callback come illustrato nell'esempio seguente:
// In this example, OnWillExitApp is a method name in same class
Distribute.WillExitApp = OnWillExitApp;
void OnWillExitApp()
{
// Perform clean up here
}
A questo scopo, OnWillExitApp()
verrà richiamato quando Distribute sta per chiudersi.
Come funzionano gli aggiornamenti in-app?
Nota
Per il funzionamento degli aggiornamenti in-app, è necessario scaricare una compilazione dell'app dal collegamento. Non funzionerà se installato da un IDE o manualmente.
La funzionalità aggiornamenti in-app funziona come segue:
Questa funzionalità funziona solo con le build RELEASE (per impostazione predefinita) distribuite con il servizio App Center Distribute . Non funzionerà se la funzionalità accesso guidato iOS è attivata.
Dopo aver integrato l'SDK, la versione di rilascio della build dell'app e il caricamento in App Center, gli utenti del gruppo di distribuzione riceveranno una notifica per la nuova versione tramite un messaggio di posta elettronica.
Quando ogni utente apre il collegamento nel messaggio di posta elettronica, l'applicazione verrà installata nel dispositivo. È importante che usino il collegamento di posta elettronica per l'installazione. Non è supportato il sideload. Quando un'applicazione viene scaricata dal collegamento, l'SDK salva informazioni importanti dai cookie per verificare la disponibilità di aggiornamenti in un secondo momento, altrimenti l'SDK non dispone di tali informazioni chiave.
Se l'applicazione imposta la traccia su privata, verrà aperto un browser per autenticare l'utente e abilitare gli aggiornamenti in-app. Il browser non si riaprirà finché le informazioni di autenticazione rimangono valide anche quando si torna alla traccia pubblica e si torna nuovamente a privato in un secondo momento. Se l'autenticazione del browser ha esito positivo, l'utente viene reindirizzato automaticamente all'applicazione. Se la traccia è pubblica (ovvero l'impostazione predefinita), il passaggio successivo viene eseguito direttamente.
- In iOS 9 e 10, un'istanza di
SFSafariViewController
verrà aperta all'interno dell'app per autenticare l'utente. Si chiuderà automaticamente dopo l'esito positivo dell'autenticazione. - In iOS 11 l'esperienza utente è simile a iOS 10, ma iOS 11 chiederà all'utente l'autorizzazione per accedere alle informazioni di accesso. Si tratta di una finestra di dialogo a livello di sistema che non può essere personalizzata. Se l'utente annulla la finestra di dialogo, può continuare a usare la versione che sta testando, ma non otterrà gli aggiornamenti in-app. Verrà chiesto di accedere di nuovo alle informazioni di accesso quando avviano l'app la volta successiva.
- In iOS 9 e 10, un'istanza di
Una nuova versione dell'app mostra la finestra di dialogo di aggiornamento in-app che chiede agli utenti di aggiornare l'applicazione se è:
iOS:
- un valore superiore di
CFBundleShortVersionString
o - un valore uguale di
CFBundleShortVersionString
ma un valore superiore diCFBundleVersion
. - le versioni sono uguali, ma l'identificatore univoco della compilazione è diverso.
- un valore superiore di
Android:
- un valore superiore di
versionCode
o - un valore uguale a
versionCode
ma un valore diverso diversionName
.
- un valore superiore di
Suggerimento
Se si carica lo stesso apk/ipa una seconda volta, la finestra di dialogo NON verrà visualizzata come i file binari sono identici. In iOS, se si carica una nuova build con le stesse proprietà della versione, verrà visualizzata la finestra di dialogo di aggiornamento. Il motivo è che si tratta di un file binario diverso . In Android i file binari vengono considerati uguali se entrambe le proprietà della versione sono uguali.
Ricerca per categorie testare gli aggiornamenti in-app?
È necessario caricare le build di versione (che usano il modulo Distribuisci di App Center SDK) nel portale di App Center per testare gli aggiornamenti in-app, aumentando i numeri di versione ogni volta.
- Creare l'app nel portale di App Center, se non è già stato fatto.
- Creare un nuovo gruppo di distribuzione e denominarlo, in modo da poterlo riconoscere per testare la funzionalità di aggiornamento in-app.
- Aggiungi te stesso (o tutte le persone che vuoi includere nel test della funzionalità di aggiornamento in-app). Usare un indirizzo di posta elettronica nuovo o eliminato per questo, che non è stato usato per l'app in App Center. Ciò garantisce che l'esperienza sia vicina all'esperienza dei tester reali.
- Creare una nuova build dell'app che include App Center Distribute e contiene la logica di configurazione, come descritto di seguito. Se il gruppo è privato, non dimenticare di impostare la traccia di aggiornamento in-app privata prima di iniziare a usare la
UpdateTrack
proprietà . - Fare clic sul pulsante Distribuisci nuova versione nel portale e caricare la compilazione dell'app.
- Al termine del caricamento, fare clic su Avanti e selezionare il gruppo di distribuzione creato come Destinazione della distribuzione dell'app.
- Esaminare la distribuzione e distribuire la compilazione nel gruppo di test in-app.
- Persone in tale gruppo riceverà un invito a essere tester dell'app. Dopo aver accettato l'invito, può scaricare l'app dal portale di App Center dal dispositivo mobile. Dopo aver installato gli aggiornamenti in-app, si è pronti per testare gli aggiornamenti in-app.
- Aggiornare la versione dell'app (
CFBundleShortVersionString
oCFBundleVersion
per iOS,versionCode
per Android) - Compilare la versione di rilascio dell'app e caricare una nuova build dell'app come nel passaggio precedente e distribuirla al gruppo di distribuzione creato in precedenza. I membri del gruppo di distribuzione verranno richiesti per una nuova versione al successivo avvio dell'app.
Suggerimento
Esaminare le informazioni su come usare App Center Distribute per informazioni più dettagliate sui gruppi di distribuzione e così via. Anche se è possibile usare App Center Distribute per distribuire una nuova versione dell'app senza aggiungere codice, l'aggiunta di App Center Distribute al codice dell'app comporterà un'esperienza più semplice per i tester e gli utenti man mano che ottengono l'esperienza di aggiornamento in-app.
Disabilitare l'inoltro automatico dei metodi del delegato dell'applicazione ai servizi di App Center
App Center usa swizzling per inoltrare automaticamente i metodi del delegato dell'applicazione ai servizi di App Center per migliorare l'integrazione dell'SDK. Esiste una possibilità di conflitti con altre librerie di terze parti o il delegato dell'applicazione stesso. In questo caso, è possibile disabilitare l'inoltro del delegato dell'applicazione app Center per tutti i servizi di App Center seguendo la procedura seguente:
- Aprire il file Info.plist del progetto.
- Aggiungere
AppCenterAppDelegateForwarderEnabled
la chiave e impostare il valore su0
. Ciò disabilita l'inoltro del delegato dell'applicazione per tutti i servizi di App Center. - Aggiungere
OpenUrl
il callback nelAppDelegate.cs
file.
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
Distribute.OpenUrl(url);
return true;
}