Переход пользователей из веб-приложения с распаковки в упакованое приложение Store

Если приложение распространяется как в виде веб-загрузки (EXE /MSI), так и в Магазине как упакованое приложение (MSIX), возможно, потребуется запретить пользователям устанавливать обе версии или переносить пользователей из непакованной веб-версии в версию Магазина. В этом руководстве содержатся инструкции по плавному переходу пользователей из распаковаемой версии на упаковаемую.

Ниже описаны два сценария:

  1. Пользователь уже установил веб-версию распаковки, и вы хотите заменить ее пакетной версией Магазина.
  2. Пользователь уже установил обе версии, и вы хотите предоставить приоритет пакетной версии Store и удалить веб-версию распаковки.

Сценарий 1. Автоматическое обновление веб-распаковки приложения на упакованое приложение Store

Если вы стремитесь автоматически перенести пользователей из веб-распаковки приложения в упаковаемую версию Магазина, рекомендуется выполнить следующие действия.

  1. Чтобы приложение, упакованое в Магазин, использовало существующую панель задач и меню закрепление, обеспечивая сохранение ярлыков, когда приложение, упакованое в Магазин, заменяет веб-приложение без упаковки.
  2. Скачайте и установите автоматически версию Store из непакованной веб-версии.
  3. Укажите пользователям, что приложение перезагрузится для применения обновления
  4. После скачивания и установки запустите пакетную версию Store и закройте веб-распаковку версии.
  5. В упакованом приложении Store перенесите данные в новую папку данных приложения.
  6. Наконец, программно удалите распаковку веб-версию.

Сценарий 2. Удалите веб-приложение с распаковками, если пользователь установил обе версии.

Вы можете разрешить пользователям использовать обе версии приложения параллельно, но вам придется управлять конфликтами между приложением и отвечать за синхронизацию данных между 2 версиями.

Если вы предпочитаете использовать только 1 версию и приоритеты версии Магазина, ниже приведены некоторые рекомендации.

  1. Чтобы приложение, упакованое в Магазин, использовало существующую панель задач и меню закрепление, обеспечивая сохранение ярлыков, когда приложение, упакованое в Магазин, заменяет веб-приложение без упаковки.
  2. Приложение Store должно определить, присутствует ли непакованная версия и удалите ее при запуске.
  3. Когда пользователи запускают распаковку приложения, вы автоматически запустите упаковаемую версию.
  4. Потенциально перенести данные, если вы хотите
  5. Наконец, программно удалите распаковку веб-версию.

Технические рекомендации

Установка упаковаемого приложения Store из веб-приложения с распаковки

Чтобы инициировать скачивание и установку, необходимо знать идентификатор магазина приложения. Этот 12-символьный идентификатор можно получить из Центра партнеров, в частности в разделе "Удостоверение продукта", даже если ваше приложение еще не отправлено.

Впоследствии можно использовать следующий код для автоматического скачивания и установки приложения Store. Этот код будет:

  1. При наличии назначьте право текущему пользователю Магазина; в противном случае право будет связано с устройством.
  2. Инициируйте скачивание и установку продукта, не создавая всплывающие уведомления.
  3. Вы можете отслеживать ход загрузки и установки с помощью API событий.
    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;
            ...
        }

Запуск приложения Store из веб-приложения с распаковки

Чтобы запустить приложение Store, необходимо знать его AMUID, который состоит из семейства пакетов (найденных в разделе "Удостоверение продукта" Центра партнеров) и идентификатор приложения (от appxmanifest), разделенный восклицательным знаком (!).

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

Как определить, установлена ли пакетная версия Store и запустить ее.

Вы можете определить, установлена ли упаковаемая версия приложения с помощью API GetPackagesByPackageFamily win32 и передачи имени семейства пакетов упаковаемого приложения. Если значение счетчика выше нуля, оно указывает, что приложение установлено.

Удаление веб-приложения с распаковки из упаковаемого приложения

Чтобы получить абсолютный путь к средству удаления, вы можете получить доступ к реестру.

Сведения об удалении находятся в реестре по адресу:

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

Получите полную команду в значении UninstallString и выполните ее. Рекомендуется автоматически выполнить удаление или сообщить пользователю о переносе данных и удалении другого приложения.

Перенос данных

Ваше распаковка приложения, скорее всего, хранит локальные данные в:

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

Упакованные приложения имеют зарезервированное пространство для хранилища данных, которое автоматически удаляется при удалении приложения. Настоятельно рекомендуется (хотя и не обязательно) перенести данные в это пространство при первом запуске. Абсолютный путь к этой папке можно получить, вызвав Windows.Storage.ApplicationData.Current.LocalFolder.Path.

Перенос приобретений и покупок в приложении

Покупки из приложения

Для обеспечения оптимального взаимодействия с пользователем важно, чтобы пользователи могли легко получить доступ к содержимому, приобретенному в распаковке версии приложения. С этой целью Microsoft Store увеличил свою гибкость для издателей, разрешая использовать собственные или сторонние коммерческие платформы в дополнение к Microsoft с июня 2021 года.

Мы настоятельно рекомендуем издателям продолжать проверять права покупки в приложении, как выполнено в распаковке версии приложения, а также интегрировать с платформой Microsoft Commerce, чтобы пользователи могли легко приобрести содержимое с помощью нескольких щелчков в Windows.

Разрешить платным пользователям распаковки приложения перенестися в упаковаемую версию.

Если пользователи приобрели свой продукт на веб-сайте, им не придется платить еще раз, чтобы скачать упаковаемую версию из Магазина. Чтобы обеспечить простой переход, рекомендуется использовать следующие подходы:

  1. Предложить бесплатную или демонстрационную версию продукта, позволяя пользователям разблокировать полную версию с помощью покупок в приложении. Для пользователей, которые уже заплатили на веб-сайте, разрешите им получить доступ к полной версии, выполнив вход, чтобы проверить свои лицензии или ввести ключ лицензии в пользовательском интерфейсе приложения.
  2. Настройте приложение как платное предложение, но распределите код купона для существующих пользователей через собственные каналы. Эти коды позволят им скачать версию Магазина без дополнительных затрат. Дополнительные сведения см. в разделе "Создание рекламных кодов".

Как перенести существующие закрепленные панели задач и сочетания клавиш меню "Пуск"

Пользователи могут закрепить классическое приложение на панели задач или меню . Эти сочетания клавиш можно направлять в новое упаковаемое приложение, включив расширение windows.desktopAppMigration в манифест приложения.

Пример

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>

После установки приложения пин-коды на панели задач или в меню , а также плитки (для Windows 10) автоматически запускают приложение Store.

Перенос расширений файлов и сопоставлений протоколов

Если приложение поддерживает расширения файлов или сопоставления протоколов, а пользователи выбрали приложение в качестве приложения по умолчанию для определенных расширений и протоколов файлов, вы можете перенести эти связи в упаковаированное приложение Store. Эта миграция может быть достигнута путем обновления манифеста приложения с помощью следующего фрагмента кода.

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>

Просто укажите программные идентификаторы , в которые требуется перенести, и система автоматически переносит их в приложение после установки.