Partager via


Distribution app Center : mises à jour dans l’application MAUI et Xamarin

Important

Visual Studio App Center doit être mis hors service le 31 mars 2025. Bien que vous puissiez continuer à utiliser Visual Studio App Center jusqu’à ce qu’il soit entièrement mis hors service, il existe plusieurs alternatives recommandées vers lesquelles vous pouvez envisager de migrer.

En savoir plus sur les chronologies et les alternatives de support.

App Center Distribute permet à vos utilisateurs d’installer une nouvelle version de l’application lorsque vous la distribuez via App Center. Une fois qu’une nouvelle version de l’application est disponible, le Kit de développement logiciel (SDK) présente une boîte de dialogue de mise à jour aux utilisateurs pour télécharger ou reporter la nouvelle version. Une fois qu’il choisit de mettre à jour, le KIT de développement logiciel (SDK) commence à mettre à jour votre application.

Avertissement

Google Play considère le code de mise à jour dans l’application comme un comportement malveillant, même s’il n’est pas utilisé au moment de l’exécution. Utilisez une variante du Kit de développement logiciel (SDK) Distribuer comme indiqué dans cette section avant de soumettre votre application à Google Play. Le fait de ne pas supprimer le code de mise à jour dans l’application peut entraîner la non-conformité et la suppression de l’application de Google Play.

Notes

Si vous exécutez des tests d’interface utilisateur automatisés, les mises à jour dans l’application activées bloquent vos tests d’interface utilisateur automatisés, car ils essaieront de s’authentifier auprès du back-end App Center. Nous vous recommandons de ne pas activer App Center Distribute pour vos tests d’interface utilisateur.

Ajouter des mises à jour dans l’application à votre application

Suivez la section Prise en main si vous n’avez pas encore configuré et démarré le Kit de développement logiciel (SDK) dans votre application.

1. Ajouter le module Distribuer App Center

Le Kit de développement logiciel (SDK) App Center est conçu avec une approche modulaire : un développeur doit uniquement intégrer les modules des services qui l’intéressent.

Visual Studio pour Mac

  • Ouvrez Visual Studio pour Mac.
  • Cliquez sur Ouvrir le fichier> et choisissez votre solution.
  • Dans le navigateur de solution, cliquez avec le bouton droit sur la section Packages , puis choisissez Ajouter des packages NuGet....
  • Recherchez App Center et installez App Center Distribute.
  • Cliquez sur Ajouter des packages.

Visual Studio pour Windows

  • Ouvrez Visual Studio pour Windows.
  • Cliquez sur Ouvrir le fichier> et choisissez votre solution.
  • Dans le navigateur de solution, cliquez avec le bouton droit sur Références et choisissez Gérer les packages NuGet.
  • Recherchez App Center et installez Microsoft.AppCenter.Distribute.

Console du Gestionnaire de package

  • Ouvrez la console dans Visual Studio. Pour ce faire, choisissez Outils>NuGet Package ManagerPackage Manager> Console.
  • Si vous travaillez dans Visual Studio pour Mac, vérifiez que vous avez installé les extensions de gestion de package NuGet. Pour cela, choisissezExtensionsVisual Studio>, recherchez NuGet et installez, si nécessaire.
  • Tapez la commande suivante dans la console :
Install-Package Microsoft.AppCenter.Distribute

Notes

Si vous utilisez le Kit de développement logiciel (SDK) App Center dans un projet portable (tel que Xamarin.Forms), vous devez installer les packages dans chacun des projets : portables, Android et iOS. Pour ce faire, vous devez ouvrir chaque sous-projet et suivre les étapes correspondantes décrites dans les sections Visual Studio pour Mac ou Visual Studio pour Windows.

Notes

Android 10 ou version ultérieure a des restrictions sur l’activité de lancement à partir de l’arrière-plan. Consultez l’article sur les restrictions relatives au démarrage d’activités en arrière-plan.

Notes

Les applications s’exécutant sur Android 10 (édition Go) ne peuvent pas recevoir l’autorisation SYSTEM_ALERT_WINDOW . Consultez l’article sur SYSTEM_ALERT_WINDOW sur les appareils Go.

Notes

À compter d’Android 11, ACTION_MANAGE_OVERLAY_PERMISSION les intentions amènent toujours l’utilisateur à l’écran Paramètres de niveau supérieur, où l’utilisateur peut accorder ou révoquer les SYSTEM_ALERT_WINDOW autorisations pour les applications. Consultez l’article sur les mises à jour des autorisations dans Android 11.

2. Démarrer App Center Distribution

Configurez le Kit de développement logiciel (SDK) App Center en appelant AppCenter.Start(...) comme décrit dans le guide de prise en main.

Pour votre application iOS, ouvrez le AppDelegate.cs et ajoutez la ligne suivante avant l’appel à LoadApplication:

Distribute.DontCheckForUpdatesInDebug();

Cette étape n’est pas nécessaire sur Android où la configuration de débogage est détectée automatiquement au moment de l’exécution.

Pour activer les mises à jour dans l’application pour les builds de débogage sur Android, appelez la méthode suivante dans le fichier MainActivity.cs du projet, dans la OnCreate méthode et avant LoadApplication.

Distribute.SetEnabledForDebuggableBuild(true);

Notes

Cette méthode affecte uniquement les builds de débogage et n’a aucun impact sur les builds en version.

2.3 [Pour iOS uniquement] Modifier la liste Info.plist du projet

Le Kit de développement logiciel (SDK) App Center vérifie les URL qui redirigent vers l’application pour éviter le chargement indépendant. Par conséquent, pour que les mises à jour distribuées via le portail soient gérées correctement, vous devez spécifier CFBundleURLSchemes dans CFBundleURLTypes la section du Info.plist fichier :

Notes

Info.plist, ou un fichier de liste de propriétés d’informations est un fichier texte structuré qui contient des informations de configuration essentielles pour un exécutable groupé. Vous trouverez plus d’informations à ce sujet dans la documentation des développeurs Apple.

  1. Ajoutez une nouvelle clé pour URL types ou CFBundleURLTypes dans votre fichier Info.plist (au cas où Xcode affiche votre Info.plist en tant que code source).
  2. Remplacez la clé du premier élément enfant par URL Schemes ou CFBundleURLSchemes.
  3. Entrez comme schéma d’URL et remplacez appcenter-${APP_SECRET} par ${APP_SECRET} le secret d’application de votre application.

Conseil

Si vous souhaitez vérifier que vous avez correctement modifié info.plist, ouvrez-le en tant que code source. Il doit contenir l’entrée suivante avec votre secret d’application au lieu de ${APP_SECRET}:

<key>CFBundleURLTypes</key>
  <array>
      <dict>
          <key>CFBundleURLSchemes</key>
          <array>
              <string>appcenter-${APP_SECRET}</string>
          </array>
      </dict>
  </array>

Supprimer les mises à jour dans l’application pour les builds Google Play

Google Play considère le code de mise à jour dans l’application comme un comportement malveillant, même s’il n’est pas utilisé au moment de l’exécution. Le fait de ne pas supprimer le code de mise à jour dans l’application peut entraîner la non-conformité et la suppression de l’application de Google Play. Pour faciliter la tâche, nous fournissons la version du KIT de développement logiciel (SDK) App Center Distribute avec des API stoubées. La seule modification pour vous est donc un échange de dépendances.

  1. Ajoutez une nouvelle configuration de build nommée GooglePlay pour vos projets Xamarin.Android et partagés. Assurez-vous que la configuration de build des projets est correctement mappée à la configuration de solution appropriée. Pour plus d’informations, consultez Visual Studio ou Visual Studio pour Mac instructions.

  2. Ouvrez Xamarin.Android et les projets partagés' .csproj dans n’importe quel éditeur de texte et déplacez la référence de distribution dans le groupe d’éléments conditionnel :

    <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>
    

    Notes

    Si vous utilisez l’ancien format packages.config pour gérer les références NuGet, vous pouvez migrer vers un format PackageReference , suivez les instructions de migration.

  3. Enregistrez vos modifications et restaurez les packages NuGet.

  4. Vous pouvez modifier la configuration dans la barre de commandes en haut de l’IDE.

Utiliser un groupe de distribution privé

Par défaut, Distribute utilise un groupe de distribution public. Si vous souhaitez utiliser un groupe de distribution privé, vous devez le définir explicitement via UpdateTrack la propriété.

Distribute.UpdateTrack = UpdateTrack.Private;

Notes

La valeur par défaut est UpdateTrack.Public. Cette propriété ne peut être mise à jour qu’avant l’appel de méthode AppCenter.Start . Les modifications apportées à la piste de mise à jour ne sont pas conservées lorsque le processus d’application redémarre. Par conséquent, si la propriété n’est pas toujours mise à jour avant l’appel AppCenter.Start , elle sera publique, par défaut.

Après cet appel, une fenêtre de navigateur s’ouvre pour authentifier l’utilisateur. Toutes les vérifications de mise à jour suivantes obtiennent la dernière version sur la voie privée. La piste de mise à jour n’est pas conservée dans le KIT de développement logiciel (SDK) entre les lancements d’application.

Si un utilisateur est sur la piste privée, cela signifie qu’une fois l’authentification réussie, il obtient la dernière version de tous les groupes de distribution privés dont il est membre. Si un utilisateur est sur la voie publique, cela signifie qu’il obtiendra la dernière version de n’importe quel groupe de distribution public.

Désactiver la vérification automatique de la mise à jour

Par défaut, le Kit de développement logiciel (SDK) recherche automatiquement les nouvelles versions :

  • Lorsque l’application démarre.
  • Lorsque l’application passe en arrière-plan, puis au premier plan à nouveau.
  • Lors de l’activation du module Distribuer s’il était précédemment désactivé.

Si vous souhaitez case activée pour les nouvelles versions manuellement, vous pouvez désactiver les case activée automatiques pour la mise à jour. Pour ce faire, appelez la méthode suivante avant le démarrage du Kit de développement logiciel (SDK) :

Distribute.DisableAutomaticCheckForUpdate();

Notes

Cette méthode doit être appelée avant l’appel de méthode AppCenter.Start .

Vous pouvez ensuite utiliser l’API CheckForUpdate décrite dans la section suivante.

Rechercher manuellement la mise à jour

Distribute.CheckForUpdate();

Notes

Une case activée manuelle pour l’appel de mise à jour fonctionne même lorsque les mises à jour automatiques sont activées. Une case activée manuelle pour la mise à jour est ignorée si une autre case activée est déjà effectuée. La case activée manuelle pour la mise à jour ne sera pas traitée si l’utilisateur a différé les mises à jour (sauf si la dernière version est une mise à jour obligatoire).

Personnaliser ou localiser la boîte de dialogue de mise à jour dans l’application

1. Personnaliser ou localiser du texte

Vous pouvez facilement fournir vos propres chaînes de ressources si vous souhaitez localiser le texte affiché dans la boîte de dialogue de mise à jour. Examinez les fichiers de chaîne pour iOS dans ce fichier de ressources et ceux pour Android dans ce fichier de ressources. Utilisez le même nom/clé de chaîne et spécifiez la valeur localisée à refléter dans la boîte de dialogue dans vos propres fichiers de ressources d’application.

2. Personnaliser la boîte de dialogue de mise à jour

Vous pouvez personnaliser l’apparence de la boîte de dialogue de mise à jour par défaut en implémentant le ReleaseAvailable rappel. Vous devez inscrire le rappel avant d’appeler AppCenter.Start , comme indiqué dans l’exemple suivant :

// In this example OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;
AppCenter.Start(...);

Voici un exemple d’implémentation de rappel qui remplace la boîte de dialogue sdk par une boîte de dialogue personnalisée :

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;
}

Remarques d’implémentation pour Xamarin.Android :

Comme indiqué dans l’exemple, vous devez appeler Distribute.NotifyUpdateAction(UpdateAction.UPDATE); ou Distribute.NotifyUpdateAction(UpdateAction.POSTPONE); si votre rappel retourne true.

Si vous n’appelez NotifyUpdateActionpas , le rappel se répète à chaque modification d’activité.

Le rappel peut être appelé à nouveau avec la même version si l’activité change avant que l’action utilisateur ne soit avertie au SDK.

Ce comportement est nécessaire pour couvrir les scénarios suivants :

  • Votre application est envoyée à l’arrière-plan (par exemple en appuyant sur ACCUEIL) puis reprise dans une autre activité.
  • Votre activité est couverte par une autre sans quitter l’application (par exemple, cliquer sur certaines notifications).
  • Autres scénarios similaires.

Dans ce cas, l’activité hébergeant la boîte de dialogue peut être remplacée sans intervention de l’utilisateur. Par conséquent, le Kit de développement logiciel (SDK) appelle à nouveau l’écouteur afin que vous puissiez restaurer la boîte de dialogue personnalisée.

3. Exécuter du code si aucune mise à jour n’est trouvée

Dans les cas où le Kit de développement logiciel (SDK) recherche les mises à jour et ne trouve aucune mise à jour disponible plus récente que celle actuellement utilisée, un NoReleaseAvailable rappel est appelé. Cela vous permet d’exécuter du code personnalisé dans de tels scénarios. Vous devez inscrire le rappel avant d’appeler AppCenter.Start , comme indiqué dans l’exemple suivant :

// 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.");
}

Activer ou désactiver App Center Distribuer au moment de l’exécution

Vous pouvez activer et désactiver La distribution d’App Center au moment de l’exécution. Si vous le désactivez, le Kit de développement logiciel (SDK) ne fournit aucune fonctionnalité de mise à jour dans l’application, mais vous pouvez toujours utiliser le service Distribuer dans le portail App Center.

Distribute.SetEnabledAsync(false);

Pour réactiver App Center Distribute, utilisez la même API, mais passez true en tant que paramètre.

Distribute.SetEnabledAsync(true);

Vous n’avez pas besoin d’attendre cet appel pour rendre d’autres appels d’API (tels que IsEnabledAsync) cohérents.

L’état est conservé dans le stockage de l’appareil entre les lancements d’application.

Notes

Cette méthode ne doit être utilisée qu’après Distribute le démarrage.

Vérifier si App Center Distribute est activé

Vous pouvez également case activée si App Center Distribute est activé ou non :

bool enabled = await Distribute.IsEnabledAsync();

Notes

Cette méthode ne doit être utilisée qu’après Distribute avoir démarré. Elle sera toujours retournée false avant le début.

Effectuez propre juste avant la fermeture de l’application pour la mise à jour (iOS uniquement)

Inscrivez le rappel comme indiqué dans l’exemple suivant :

// In this example, OnWillExitApp is a method name in same class
Distribute.WillExitApp = OnWillExitApp;
void OnWillExitApp()
{
    // Perform clean up here
}

Avec cela, OnWillExitApp() sera appelé lorsque Distribution est sur le point de se fermer.

Comment fonctionnent les mises à jour dans l’application ?

Notes

Pour que les mises à jour dans l’application fonctionnent, une build d’application doit être téléchargée à partir du lien. Il ne fonctionnera pas s’il est installé à partir d’un IDE ou manuellement.

La fonctionnalité de mises à jour dans l’application fonctionne comme suit :

  1. Cette fonctionnalité fonctionne uniquement avec les builds RELEASE (par défaut) qui sont distribuées à l’aide du service De distribution App Center . Cela ne fonctionnera pas si la fonctionnalité d’accès guidé iOS est activée.

  2. Une fois que vous avez intégré le Kit de développement logiciel (SDK), généré la version de votre application et que vous avez téléchargé dans App Center, les utilisateurs de ce groupe de distribution sont avertis de la nouvelle version par e-mail.

  3. Lorsque chaque utilisateur ouvre le lien dans son e-mail, l’application est installée sur son appareil. Il est important qu’ils utilisent le lien d’e-mail pour installer. Nous ne prenons pas en charge le chargement latéral. Lorsqu’une application est téléchargée à partir du lien, le KIT de développement logiciel (SDK) enregistre des informations importantes à partir des cookies pour case activée pour les mises à jour ultérieures. Sinon, le KIT de développement logiciel (SDK) n’a pas ces informations clés.

  4. Si l’application définit la piste sur privée, un navigateur s’ouvre pour authentifier l’utilisateur et activer les mises à jour dans l’application. Le navigateur ne s’ouvre pas à nouveau tant que les informations d’authentification restent valides, même lors du basculement vers la voie publique et de revenir à la voie privée ultérieurement. Si l’authentification du navigateur réussit, l’utilisateur est redirigé automatiquement vers l’application. Si la piste est publique (ce qui est la valeur par défaut), l’étape suivante se produit directement.

    • Sur iOS 9 et 10, une instance de s’ouvre SFSafariViewController dans l’application pour authentifier l’utilisateur. Il se ferme automatiquement une fois l’authentification réussie.
    • Sur iOS 11, l’expérience utilisateur est similaire à iOS 10, mais iOS 11 demande à l’utilisateur son autorisation d’accéder aux informations de connexion. Il s’agit d’une boîte de dialogue au niveau du système qui ne peut pas être personnalisée. Si l’utilisateur annule la boîte de dialogue, il peut continuer à utiliser la version qu’il teste, mais il n’obtient pas de mises à jour dans l’application. Ils seront invités à accéder à nouveau aux informations de connexion lorsqu’ils lanceront l’application la prochaine fois.
  5. Une nouvelle version de l’application affiche la boîte de dialogue de mise à jour dans l’application demandant aux utilisateurs de mettre à jour votre application s’il s’agit des éléments suivants :

    • iOS :

      • une valeur plus élevée de CFBundleShortVersionString ou
      • une valeur égale de CFBundleShortVersionString mais une valeur supérieure de CFBundleVersion.
      • les versions sont identiques, mais l’identificateur unique de build est différent.
    • Android :

      • une valeur plus élevée de versionCode ou
      • une valeur égale de versionCode , mais une valeur différente de versionName.

Conseil

Si vous chargez le même fichier apk/ipa une deuxième fois, la boîte de dialogue n’apparaîtra PAS , car les fichiers binaires sont identiques. Sur iOS, si vous chargez une nouvelle build avec les mêmes propriétés de version, la boîte de dialogue de mise à jour s’affiche. La raison en est qu’il s’agit d’un binaire différent . Sur Android, les fichiers binaires sont considérés comme identiques si les deux propriétés de version sont identiques.

Comment faire tester les mises à jour dans l’application ?

Vous devez charger les builds de mise en production (qui utilisent le module Distribuer du Kit de développement logiciel (SDK) App Center) sur le portail App Center pour tester les mises à jour dans l’application, ce qui augmente le nombre de versions à chaque fois.

  1. Créez votre application dans le portail App Center si ce n’est déjà fait.
  2. Créez un groupe de distribution et nommez-le afin de reconnaître qu’il est destiné à tester la fonctionnalité de mise à jour dans l’application.
  3. Ajoutez vous-même (ou toutes les personnes que vous souhaitez inclure dans votre test de la fonctionnalité de mise à jour dans l’application). Utilisez une nouvelle adresse e-mail ou une adresse e-mail qui n’a pas été utilisée pour cette application sur App Center. Cela garantit que votre expérience est proche de celle de vos vrais testeurs.
  4. Créez une build de votre application qui inclut App Center Distribute et contient la logique d’installation comme décrit ci-dessous. Si le groupe est privé, n’oubliez pas de définir la piste de mise à jour privée dans l’application avant de commencer à utiliser la UpdateTrack propriété .
  5. Cliquez sur le bouton Distribuer la nouvelle version dans le portail et chargez votre build de l’application.
  6. Une fois le chargement terminé, cliquez sur Suivant et sélectionnez le groupe de distribution que vous avez créé comme destination de cette distribution d’application.
  7. Passez en revue la distribution et distribuez la build à votre groupe de test dans l’application.
  8. Personnes de ce groupe recevront une invitation à être testeurs de l’application. Une fois qu’ils ont accepté l’invitation, ils peuvent télécharger l’application à partir du portail App Center à partir de leur appareil mobile. Une fois les mises à jour dans l’application installées, vous êtes prêt à tester les mises à jour dans l’application.
  9. Appuyez sur la version de votre application (CFBundleShortVersionString ou CFBundleVersion pour iOS, versionCode pour Android)
  10. Générez la version de mise en production de votre application et chargez une nouvelle build de votre application comme vous l’avez fait à l’étape précédente et distribuez-la au groupe de distribution que vous avez créé précédemment. Les membres du groupe de distribution seront invités à entrer une nouvelle version lors du prochain démarrage de l’application.

Conseil

Consultez les informations sur l’utilisation d’App Center Distribute pour obtenir des informations plus détaillées sur les groupes de distribution , etc. Bien qu’il soit possible d’utiliser App Center Distribute pour distribuer une nouvelle version de votre application sans ajouter de code, l’ajout d’App Center Distribute au code de votre application entraînera une expérience plus transparente pour vos testeurs et utilisateurs à mesure qu’ils obtiennent l’expérience de mise à jour dans l’application.

Désactiver le transfert automatique des méthodes du délégué d’application vers les services App Center

App Center utilise le swizzling pour transférer automatiquement les méthodes de votre délégué d’application aux services App Center afin d’améliorer l’intégration du SDK. Il existe un risque de conflit avec d’autres bibliothèques tierces ou le délégué d’application lui-même. Dans ce cas, vous pouvez désactiver le transfert du délégué d’application App Center pour tous les services App Center en suivant les étapes ci-dessous :

  1. Ouvrez le fichier Info.plist du projet.
  2. Ajoutez AppCenterAppDelegateForwarderEnabled la clé et définissez la valeur sur 0. Cela désactive le transfert des délégués d’application pour tous les services App Center.
  3. Ajoutez un OpenUrl rappel dans votre AppDelegate.cs fichier.
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
    Distribute.OpenUrl(url);
    return true;
}