Comment faire passer les utilisateurs de votre application Web non packagée à une application packagée dans le Store ?

Si vous distribuez votre application à la fois en téléchargement sur le web (EXE/MSI) et dans le Store en tant qu’application packagée (MSIX), vous voudrez peut-être empêcher les utilisateurs d’installer les deux versions ou les faire migrer de la version web non packagée vers la version dans le Store. Ce guide fournit des instructions sur la manière de faire passer facilement les utilisateurs de la version non packagée à la version packagée.

Deux scénarios sont décrits ci-dessous :

  1. L’utilisateur a déjà installé la version web non packagée et vous souhaitez la remplacer par la version packagée du Store.
  2. L’utilisateur a déjà installé les deux versions et vous souhaitez accorder la priorité à la version packagée du Store et désinstaller la version web non packagée.

Scénario 1 : mettre automatiquement à jour l’application web non packagée vers l’application packagée du Store

Si vous souhaitez migrer automatiquement vos utilisateurs de l’application web non packagée vers la version packagée du Store, nous vous recommandons de suivre les étapes ci-dessous :

  1. Activez votre application packagée dans le Store pour utiliser les éléments épinglés du menu Démarrer et de barre des tâches, afin que les utilisateurs conservent leurs raccourcis lorsque l’application packagée dans le Store remplace l’application web non packagée.
  2. Téléchargez et installez en mode silencieux la version du Store à partir de votre version web non packagée.
  3. Indiquer aux utilisateurs que l’application va redémarrer pour appliquer une mise à jour
  4. Une fois téléchargée et installée, lancez la version packagée du Store et fermez la version web non packagée.
  5. Dans l’application packagée du Store, migrez les données vers le nouveau dossier de données d’application.
  6. Enfin, désinstallez par programmation la version web non packagée.

Scénario 2: désinstaller l’application web non packagée si l’utilisateur a installé les deux versions.

Vous pouvez permettre à vos utilisateurs d’utiliser les deux versions de votre application côte à côte, mais vous devrez gérer les conflits et prendre en charge la synchronisation des données entre elles.

Si vous préférez que vos utilisateurs n’utilisent qu’une seule version et donnent la priorité à la version Store, voici quelques recommandations :

  1. Activez votre application packagée dans le Store pour utiliser les éléments épinglés du menu Démarrer et de barre des tâches, afin que les utilisateurs conservent leurs raccourcis lorsque l’application packagée dans le Store remplace l’application web non packagée.
  2. L’application du Store doit détecter si la version non packagée est présente et la désinstaller au lancement
  3. Lorsque les utilisateurs lancent l’application non packagée, vous devez lancer automatiquement la version packagée
  4. Vous pouvez éventuellement migrer les données si vous le souhaitez
  5. Enfin, désinstallez par programmation la version web non packagée.

Recommandations techniques

Comment installer l’application packagée du Store à partir de votre application web non packagée

Pour lancer le téléchargement et l’installation, vous devez connaître l’ID du Store de votre application. Cet ID de 12 caractères peut être obtenu à partir de l’Espace partenaires, plus précisément dans la section « Identité du produit », même si votre application n’a pas encore été soumise.

Ensuite, vous pouvez utiliser le code suivant pour télécharger et installer en mode silencieux l’application du Store. Ce code :

  1. Attribue un droit à l’utilisateur du Store actuel s’il est présent ; sinon, le droit sera associé à l’appareil.
  2. Lance le téléchargement et l’installation du produit sans générer de toasts de notification.
  3. Vous pouvez surveiller la progression du téléchargement et de l’installation à l’aide des API d’événement.
    private async Task<bool> DownloadStoreVersionAsync()
    {
        var productId = "<Product Id from Partner Center>";
        var applicationName = "<name of your application>";

        var appInstallManager = new AppInstallManager();
        var entitlement = await appInstallManager.GetFreeUserEntitlementAsync(productId, string.Empty, string.Empty);
        if (entitlement.Status is GetEntitlementStatus.NoStoreAccount)
        {
            entitlement = await appInstallManager.GetFreeDeviceEntitlementAsync(productId, string.Empty, string.Empty);
        }
        if (entitlement.Status is not GetEntitlementStatus.Succeeded)
        {
            return false;
        }

        var options = new AppInstallOptions()
        {
            LaunchAfterInstall = true,
            CompletedInstallToastNotificationMode = AppInstallationToastNotificationMode.NoToast
        };
        var items = await appInstallManager.StartProductInstallAsync(productId, string.Empty, applicationName, string.Empty, options);
        var firstItem = items.FirstOrDefault();
        if(firstItem is null)
        {
            return false;
        }
        firstItem.StatusChanged += StoreInstallation_StatusChanged;
        firstItem.Completed += StoreInstallation_Completed;
        return true;
    }

    private void StoreInstallation_Completed(AppInstallItem sender, object args)
    {
        // Launch the new Store version when ready and close this application
        // The Store version will then be responsible of migrating the data and uninstall the unpackaged version
    }

    private void StoreInstallation_StatusChanged(AppInstallItem sender, object args)
    {
        var status = sender.GetCurrentStatus();
        switch(status.InstallState)
        {
            case AppInstallState.Installing:
                {
                    // Show installing status
                }
                break;
            case AppInstallState.Downloading:
                {
                    // Show download progress using status.PercentComplete
                }
                break;
            ...
        }

Comment lancer l’application du Store à partir de votre application web non packagée

Pour lancer une application du Store, il faut connaître son AMUID, qui se compose du nom de la famille du package (dans la section « Identité du produit » de l’Espace partenaires) et de l’ID d’application (de votre appxmanifest), séparés par une marque d’exclamation (!).

        Process.Start(
            "explorer.exe",
            "shell:AppsFolder\\Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
        );

Comment détecter si la version packagée du Store est installée et comment la lancer

Vous pouvez déterminer si votre version packagée de l’application est installée à l’aide de l’API win32 GetPackagesByPackageFamily et en passant le nom de famille du package de votre application packagée. Si le chiffre est supérieur à zéro, cela signifie que l’application est installée.

Comment désinstaller votre application web non packagée à partir de celle packagée

Pour récupérer le chemin absolu de votre désinstalleur, vous pouvez accéder au Registre.

Vos informations de désinstallation se trouvent dans le Registre à l’adresse suivante :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<your product code GUID\>

Récupérez la commande complète dans la valeur UninstallString et exécutez-la. Il est recommandé d’effectuer la désinstallation en mode silencieux ou d’informer l’utilisateur que vous migrez des données et désinstallez l’autre application.

Comment migrer des données

Votre application non package stocke probablement ses données locales dans :

%localAppData%/<YourPublisherName\>/<YourAppName\>

Les applications packagées disposent d’un espace réservé pour le stockage des données, lequel est automatiquement supprimé lors de la désinstallation de l’application. Il est vivement recommandé (mais pas obligatoire) de migrer les données vers cet espace lors du premier lancement. Vous pouvez récupérer le chemin absolu de ce dossier en appelant Windows.Storage.ApplicationData.Current.LocalFolder.Path.

Comment migrer des acquisitions et des achats dans l’application

Achats in-app

Pour garantir une expérience optimale aux utilisateurs, il est essentiel que ces derniers puissent accéder de manière transparente au contenu qu’ils ont acheté dans la version non packagée de votre application. C’est dans cette optique que le Microsoft Store a amélioré sa flexibilité pour les éditeurs en autorisant, depuis juin 2021, l’utilisation de leurs propres plateformes de commerce ou de plateformes tierces en plus de celle de Microsoft.

Nous encourageons fortement les éditeurs à continuer à vérifier les droits d’achat dans l’application tels qu’ils sont effectués dans la version non packagée de leur application et à s’intégrer à la plateforme Microsoft Commerce pour permettre aux utilisateurs d’acheter leur contenu sans effort et en quelques clics sur Windows.

Autoriser les utilisateurs payants de l’application non packagée à migrer vers la version packagée

Si les utilisateurs ont acheté votre produit sur votre site web, ils ne devraient pas être obligés de payer à nouveau pour télécharger la version packagée à partir du Store. Pour garantir une transition transparente, nous vous recommandons les approches suivantes :

  1. Offrez une version gratuite/de démonstration de votre produit, afin que les utilisateurs puissent déverrouiller la version complète via des achats dans l’application. Pour les utilisateurs qui ont déjà payé sur votre site web, permettez-leur d’accéder à la version complète en se connectant pour vérifier leurs licences ou en saisissant leur clé de licence dans l’interface utilisateur de l’application.
  2. Configurez votre application comme une offre payante, mais distribuez des codes de réduction à vos utilisateurs existants via vos propres canaux. Ces codes leur permettront de télécharger la version du Store sans frais supplémentaires. Vous trouverez plus d’informations dans Générer des codes promotionnels.

Comment migrer des raccourcis épinglés à la barre des tâches et du menu Démarrer

Vos utilisateurs peuvent avoir épinglé votre application de bureau à la barre des tâches ou au menu Démarrer. Vous pouvez diriger ces raccourcis vers votre nouvelle application packagée en incluant l’extension « windows.desktopAppMigration » dans le manifeste de votre application.

Exemple

xmlns:rescap3="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities/3"
...
<Extensions>
<rescap3:Extension Category="windows.desktopAppMigration">
<rescap3:DesktopAppMigration>
<rescap3:DesktopApp AumId="[your_app_aumid]" />
<rescap3:DesktopApp ShortcutPath="%USERPROFILE%\Desktop\[my_app].lnk" />
<rescap3:DesktopApp ShortcutPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\[my_app].lnk" />
<rescap3:DesktopApp ShortcutPath="%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\[my_app_folder]\[my_app].lnk"/>
</rescap3:DesktopAppMigration>
</rescap3:Extension>
</Extensions>

Après l’installation de votre application, les éléments épinglés à la barre des tâches ou au menu Démarrer, ainsi que les tuiles (pour Windows 10) lancent automatiquement l’application du Store.

Comment migrer des associations d’extension de fichier & de protocoles

Si votre application prend en charge l’extension de fichier ou les associations de protocoles et que les utilisateurs ont sélectionné votre application comme application par défaut pour des extensions de fichiers et des protocoles spécifiques, vous pouvez migrer ces associations vers votre application packagée du Store. Cette migration peut être effectuée en mettant à jour votre manifeste d’application avec l’extrait de code suivant.

xmlns:rescap3="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities/3"
...
<Extensions>
<uap:Extension Category="windows.fileTypeAssociation">
<uap3:FileTypeAssociation Name=".foo">
<rescap3:MigrationProgIds>
<rescap3:MigrationProgId>Foo.Bar.1</rescap3:MigrationProgId>
</rescap3:MigrationProgIds>
…
</uap3:FileTypeAssociation>
</uap:Extension>
</Extensions>

Répertoriez simplement les identificateurs de programmation vers lesquels vous souhaitez migrer, et le système les migrera automatiquement vers votre application après l’installation.