다음을 통해 공유


웹 패키지되지 않은 앱에서 패키지된 스토어 앱으로 사용자를 전환하는 방법

애플리케이션을 웹 다운로드(EXE /MSI) 및 스토어에서 패키지된 애플리케이션(MSIX)으로 배포하는 경우 사용자가 두 버전을 모두 설치하지 못하도록 하거나 패키지되지 않은 웹 버전에서 Store 버전으로 사용자를 마이그레이션하지 않도록 할 수 있습니다. 이 가이드에서는 패키지되지 않은 버전에서 패키지된 버전으로 사용자를 원활하게 전환하는 방법에 대한 지침을 제공합니다.

아래에서 두 가지 시나리오를 설명합니다.

  1. 사용자가 이미 웹 기반의 패키지되지 않은 버전을 설치했으며 이를 스토어의 패키지된 버전으로 바꾸려고 합니다.
  2. 사용자가 이미 두 버전을 모두 설치했으며 Store 패키지 버전에 우선 순위를 부여하고 웹 기반 패키지되지 않은 버전을 제거하려고 합니다.

시나리오 1: 패키지되지 않은 웹 애플리케이션을 Microsoft Store 패키지 애플리케이션으로 자동으로 업데이트

웹 패키지되지 않은 애플리케이션에서 패키지된 스토어 버전으로 사용자를 자동으로 마이그레이션하려는 경우 다음 단계를 수행하는 것이 좋습니다.

  1. 스토어 패키지 애플리케이션에서 기존 작업 표시줄 및 시작 메뉴 핀을 사용하도록 설정하여 스토어 패키지 애플리케이션이 웹 패키지되지 않은 애플리케이션을 대체할 때 사용자가 바로 가기를 유지할 수 있도록 합니다.
  2. 패키지되지 않은 웹 버전에서 스토어 버전을 자동으로 다운로드하여 설치합니다.
  3. 업데이트를 적용하기 위해 애플리케이션이 다시 시작되도록 사용자에게 표시
  4. 다운로드하여 설치한 후에는 Store 패키지 버전을 시작하고 패키지되지 않은 웹 버전을 닫습니다.
  5. Microsoft Store 패키지 애플리케이션에서 데이터를 새 앱 데이터 폴더로 마이그레이션합니다.
  6. 마지막으로 패키지되지 않은 웹 버전을 프로그래밍 방식으로 제거합니다.

시나리오 2: 사용자가 두 버전을 모두 설치한 경우 웹 기반의 패키지되지 않은 애플리케이션을 제거합니다.

사용자가 두 버전의 애플리케이션을 함께 사용하도록 허용할 수 있지만 애플리케이션 간의 충돌을 관리해야 하며 2개 버전 간에 데이터를 동기화해야 합니다.

사용자가 1개 버전만 사용하고 Store 버전의 우선 순위를 지정하는 것을 선호하는 경우 몇 가지 권장 사항은 다음과 같습니다.

  1. 스토어 패키지 애플리케이션에서 기존 작업 표시줄 및 시작 메뉴 핀을 사용하도록 설정하여 스토어 패키지 애플리케이션이 웹 패키지되지 않은 애플리케이션을 대체할 때 사용자가 바로 가기를 유지할 수 있도록 합니다.
  2. 스토어 애플리케이션은 패키지되지 않은 버전이 있는지 감지하고 시작 시 제거해야 합니다.
  3. 사용자가 패키지되지 않은 애플리케이션을 시작할 때 패키지된 버전을 자동으로 시작해야 합니다.
  4. 원하는 경우 데이터를 마이그레이션할 수 있습니다.
  5. 마지막으로 패키지되지 않은 웹 버전을 프로그래밍 방식으로 제거합니다.

기술 권장 사항

웹 패키지되지 않은 애플리케이션에서 Store 패키지 애플리케이션을 설치하는 방법

다운로드 및 설치를 시작하려면 애플리케이션의 스토어 ID를 알고 있어야 합니다. 이 12자 ID는 애플리케이션이 아직 제출되지 않은 경우에도 파트너 센터, 특히 "제품 ID" 섹션에서 가져올 수 있습니다.

그런 다음 다음 코드를 사용하여 스토어 애플리케이션을 자동으로 다운로드하고 설치할 수 있습니다. 이 코드는 다음 작업을 수행합니다.

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

웹 패키지되지 않은 앱에서 스토어 애플리케이션을 시작하는 방법

스토어 애플리케이션을 시작하려면 패키지 패밀리 이름(파트너 센터의 "제품 ID" 섹션에 있음)과 애플리케이션 ID(appxmanifest에서)로 구성된 AMUID를 느낌표(!)로 구분해야 합니다.

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

스토어 패키지 버전이 설치되어 있는지 감지하고 시작하는 방법

GetPackagesByPackageFamily win32 API를 사용하고 패키지된 앱의 패키지 패밀리 이름을 전달하여 패키지된 버전의 애플리케이션이 설치되어 있는지 여부를 확인할 수 있습니다. 개수 값이 0보다 높은 경우 애플리케이션이 설치되었음을 나타냅니다.

패키지된 애플리케이션에서 웹 패키지되지 않은 애플리케이션을 제거하는 방법

제거자의 절대 경로를 검색하려면 레지스트리에 액세스할 수 있습니다.

제거기 정보는 다음의 레지스트리에 있습니다.

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

UninstallString 값에서 전체 명령을 검색하고 실행합니다. 자동으로 제거를 수행하거나 데이터를 마이그레이션하고 다른 애플리케이션을 제거한다고 사용자에게 알리는 것이 좋습니다.

데이터 마이그레이션 방법

패키지되지 않은 애플리케이션은 로컬 데이터를 다음 위치에 저장할 가능성이 높습니다.

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

패키지된 애플리케이션에는 데이터 스토리지를 위한 예약된 공간이 있으며 애플리케이션을 제거할 때 자동으로 삭제됩니다. 첫 번째 시작 시 데이터를 이 공간으로 마이그레이션하는 것이 좋습니다(필수는 아님). Windows.Storage.ApplicationData.Current.LocalFolder.Path를 호출하여 이 폴더의 절대 경로를 검색할 수 있습니다.

구입 및 앱 내 구매를 마이그레이션하는 방법

앱 내 구매

최적의 사용자 환경을 보장하려면 사용자가 패키지되지 않은 버전의 애플리케이션에서 구입한 콘텐츠에 원활하게 액세스할 수 있어야 합니다. 이 목표를 통해 Microsoft Store는 2021년 6월부터 Microsoft 외에도 자체 또는 타사 상거래 플랫폼의 사용을 허용함으로써 게시자에 대한 유연성을 향상시켰습니다.

퍼블리셔는 애플리케이션의 비패키지 버전에서 수행한 인앱 구매 자격을 계속 확인하고, 사용자가 Windows에서 몇 번의 클릭만으로 콘텐츠를 손쉽게 구매할 수 있도록 Microsoft Commerce 플랫폼과 통합할 것을 강력히 권장합니다.

패키지되지 않은 애플리케이션의 유료 사용자가 패키지된 버전으로 마이그레이션할 수 있도록 허용

사용자가 웹 사이트에서 제품을 구매한 경우 스토어에서 패키지된 버전을 다운로드하기 위해 다시 지불할 필요가 없습니다. 원활한 전환을 보장하려면 다음 방법을 사용하는 것이 좋습니다.

  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용)이 자동으로 스토어 애플리케이션을 시작합니다.

파일 확장명 & 프로토콜 연결을 마이그레이션하는 방법

애플리케이션이 파일 확장자 또는 프로토콜 연결을 지원하고 사용자가 특정 파일 확장자 및 프로토콜에 대한 기본 애플리케이션으로 앱을 선택한 경우 이러한 연결을 스토어 패키지 애플리케이션으로 마이그레이션할 수 있는 옵션이 있습니다. 이 마이그레이션은 다음 코드 조각을 사용하여 앱 매니페스트를 업데이트하여 수행할 수 있습니다.

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>

마이그레이션하려는 프로그래밍 방식 식별자를 나열하기만 하면 시스템에서 설치 후 자동으로 애플리케이션으로 마이그레이션됩니다.