앱의 평가판 구현하기

평가판 기간에 고객이 앱을 무료로 사용할 수 있도록 파트너 센터에서 무료 평가판으로 앱을 구성하면 평가판 기간 동안 일부 기능을 제외하거나 제한하여 고객이 앱 정식 버전으로 업그레이드하도록 유도할 수 있습니다. 코딩을 시작하기 전에 제한해야 하는 기능을 결정한 다음 전체 라이선스를 구매한 경우에만 앱에서 작동하도록 허용해야 합니다. 고객이 앱을 구입하기 전에 평가판 중에만 표시되는 배너 또는 워터마크와 같은 기능을 사용하도록 설정할 수도 있습니다.

이 문서는 Windows.Services.Store 네임스페이스에서 StoreContext 클래스의 멤버를 사용하여 사용자에게 앱의 평가판 라이선스가 있는지 확인하고 앱이 실행되는 동안 라이선스 상태가 변경되면 알림을 받는 방법을 설명합니다.

참고

Windows.Services.Store 네임스페이스는 Windows 10 버전 1607에 도입되었으며 Windows 10 Anniversary Edition(10.0, 빌드 14393) 또는 Visual Studio의 최신 릴리스를 대상으로 하는 프로젝트에만 사용할 수 있습니다. 앱이 이전 버전의 Windows 10을 대상으로 하는 경우에는 Windows.Services.Store 네임스페이스 대신 Windows.ApplicationModel.Store 네임스페이스를 사용해야 합니다. 자세한 정보는 이 문서를 참조하세요.

평가판 버전을 구현하기 위한 지침

앱의 현재 라이선스 상태는 StoreAppLicense 클래스의 속성으로 저장됩니다. 일반적으로 다음 단계에서 설명한 대로 라이선스 상태에 따라 달라지는 함수를 조건부 블록에 배치합니다. 이러한 기능을 고려할 때 모든 라이선스 상태에서 작동하는 방식으로 구현할 수 있는지 확인합니다.

또한 앱이 실행되는 동안 앱 라이선스의 변경 내용을 처리하는 방법을 결정합니다. 평가판 앱은 전체 기능을 사용할 수 있지만 유료 버전에는 없는 앱 내 광고 배너가 있습니다. 또는 평가판 앱은 특정 기능을 사용하지 않도록 설정하거나 사용자에게 구입하도록 요청하는 일반 메시지를 표시할 수 있습니다.

만드는 앱의 유형과 좋은 평가판 또는 만료 전략이 무엇인지 생각해 보세요. 게임 평가판의 경우에는 사용자가 플레이할 수 있는 게임 콘텐츠의 양을 제한하는 것이 좋습니다. 유틸리티의 평가판 버전의 경우에는 만료 날짜를 설정하거나 잠재적 구매자가 사용할 수 있는 기능을 제한하는 것이 좋습니다.

대부분의 비게임 앱의 경우에는 사용자가 전체 앱을 잘 이해할 수 있으므로 만료 날짜를 설정하는 것이 좋습니다. 다음은 몇 가지 일반적인 만료 시나리오와 이를 처리하기 위한 옵션입니다.

  • 앱이 실행 중일 때 체험 라이선스 만료

    앱이 실행되는 동안 평가판이 만료되면 앱은 다음을 수행할 수 있습니다.

    • 아무 작업도 수행하지 않습니다.
    • 고객에게 메시지를 표시합니다.
    • 앱을 닫습니다.
    • 고객에게 앱을 구입하라는 메시지를 표시합니다.

    가장 좋은 방법은 앱을 구매하라는 프롬프트가 포함된 메시지를 표시하고 고객이 앱을 구매하는 경우 모든 기능을 사용하도록 설정된 상태로 계속 진행하는 것입니다. 사용자가 앱을 구입하지 않기로 결정한 경우 앱을 닫거나 앱을 구입하도록 정기적으로 알려 줍니다.

  • 앱을 실행하기 전에 체험 라이선스 만료

    사용자가 앱을 시작하기 전에 평가판이 만료되면 앱이 시작되지 않습니다. 대신 Store에서 앱을 구매할 수 있는 옵션을 제공하는 대화 상자가 표시됩니다.

  • 앱이 실행 중일 때 고객이 앱을 구입

    고객이 앱을 실행하는 동안 구매하는 경우, 앱이 수행할 수 있는 몇 가지 작업은 다음과 같습니다.

    • 아무 것도 하지 않으며 앱을 다시 시작할 때까지 평가판 모드에서 계속 진행하도록 합니다.
    • 구입에 감사하거나 메시지를 표시합니다.
    • 정식 라이선스에서 사용할 수 있는 기능을 자동으로 사용하도록 설정합니다(또는 평가판 전용 알림을 사용하지 않도록 설정함).

평가판 기간 도중 및 이후에 앱이 어떻게 동작하는지 설명하여 고객이 앱의 동작에 놀라지 않도록 해야 합니다. 앱 설명에 대한 자세한 정보는 앱 설명 만들기를 참조하세요.

필수 조건

이 예시에는 다음과 같은 필수 조건이 있습니다.

  • Windows 10 Anniversary Edition(10.0, 빌드 14393) 이상 릴리스를 대상으로 하는 UWP(유니버설 Windows 플랫폼) 앱에 대한 Visual Studio 프로젝트입니다.
  • 파트너 센터에서 시간 제한이 없는 평가판으로 구성된 앱을 만들었으며 이 앱은 Store에 게시되었습니다. 테스트하는 동안 Store에서 검색이 되지 않도록 앱을 구성할 수도 있습니다. 자세한 정보는 테스트 지침을 참조하세요.

이 예시의 코드는 다음을 가정합니다.

  • 코드는 workingProgressRing(이)라고 이름이 지정된 ProgressRingtextBlock(이)라고 이름이 지정된 TextBlock을 포함하는 페이지의 컨텍스트에서 실행됩니다. 이러한 개체는 각각 비동기 작업의 발생을 나타내며 출력 메시지를 표시하는 데 사용됩니다.
  • 코드 파일에는 Windows.Services.Store 네임스페이스에 대한 using 문이 있습니다.
  • 이 앱은 단일 사용자 앱으로, 해당 앱을 실행한 사용자의 컨텍스트에서만 실행됩니다. 자세한 정보는 앱 내 구매 및 평가판을 참조하세요.

참고

데스크톱 브리지를 사용하는 데스크톱 애플리케이션이 있는 경우 이 예시에서 표시되지 않는 별도의 코드를 추가하여 StoreContext 개체를 구성해야 할 수도 있습니다. 자세한 정보는 데스크톱 브리지를 사용하는 데스크톱 애플리케이션에서 StoreContext 클래스 사용하기를 참조하세요.

코드 예시

앱을 초기화할 때 앱에 대한 StoreAppLicense 개체를 가져오고 OfflineLicensesChanged 이벤트를 처리하여 앱을 실행하는 동안 라이선스가 변경될 때 알림을 수신하도록 합니다. 예를 들어, 앱의 라이선스는 평가판 기간이 만료되거나 고객이 Store를 통해 앱을 구매하는 경우 변경됩니다. 라이선스가 변경되면 새 라이선스를 가져와서 그에 따라 앱의 기능을 사용하거나 사용하지 않도록 설정합니다.

이 시점에서 사용자가 앱을 구입한 경우, 사용자에게 라이선스 상태가 변경되었다는 피드백을 제공하는 것이 좋습니다. 그렇게 코딩한 경우, 사용자에게 앱을 다시 시작하도록 요청해야 할 수 있습니다. 그러나 이러한 전환을 가능한 원활하고 손쉽게 만들어야 합니다.

private StoreContext context = null;
private StoreAppLicense appLicense = null;

// Call this while your app is initializing.
private async void InitializeLicense()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    workingProgressRing.IsActive = true;
    appLicense = await context.GetAppLicenseAsync();
    workingProgressRing.IsActive = false;

    // Register for the licenced changed event.
    context.OfflineLicensesChanged += context_OfflineLicensesChanged;
}

private async void context_OfflineLicensesChanged(StoreContext sender, object args)
{
    // Reload the license.
    workingProgressRing.IsActive = true;
    appLicense = await context.GetAppLicenseAsync();
    workingProgressRing.IsActive = false;

    if (appLicense.IsActive)
    {
        if (appLicense.IsTrial)
        {
            textBlock.Text = $"This is the trial version. Expiration date: {appLicense.ExpirationDate}";

            // Show the features that are available during trial only.
        }
        else
        {
            // Show the features that are available only with a full license.
        }
    }
}

전체 샘플 애플리케이션은 Store 샘플을 참조하세요.