Получение информации о продукте для приложений и надстроек

В этой статье рассказывается, как использовать методы класса StoreContext из пространства имен Windows.Services.Store для получения информации, связанной с Microsoft Store, для текущего приложения или одной из его надстроек.

Полный пример приложения см. в разделе Пример для Магазина.

Примечание

Пространство имен Windows.Services.Store впервые появилось в Windows 10 версии 1607 и может использоваться только в проектах, предназначенных для Windows 10 Anniversary Edition (10.0; сборка 14393) или более поздней версии в Visual Studio. Если приложение предназначено для предыдущих версий Windows 10, необходимо использовать пространство имен Windows.ApplicationModel.Store, а не пространство имен Windows.Services.Store. Дополнительные сведения см. в этой статье.

Предварительные требования

Для этих примеров необходимо выполнение следующих предварительных условий.

  • Создан проект Visual Studio для приложения универсальной платформы Windows (UWP), предназначенный для Windows 10 Anniversary Edition (10.0; сборка 14393) и более поздних выпусков.
  • Вы создали отправку приложения в Центре партнеров, и это приложение опубликовано в Магазине. При необходимости можно настроить приложение, чтобы его нельзя было найти в Магазине, пока вы его тестируете. Подробнее см. в нашем руководстве по тестированию.
  • Если вы хотите получить сведения о продукте для надстройки для приложения, необходимо также создать надстройку в Центре партнеров.

В коде из этих примеров предполагается следующее:

  • Код выполняется в контексте страницы Page, которая содержит ProgressRing с именем workingProgressRing и TextBlock с именем textBlock. Эти объекты используются для индикации выполнения асинхронной операции и отображения выводимых сообщений, соответственно.
  • Файл кода содержит оператор using для пространства имен Windows.Services.Store.
  • Приложение — однопользовательское и выполняется только в контексте пользователя, запустившего его. Подробнее см. в разделе Покупки из приложения и пробные версии.

Примечание

Если у вас есть классическое приложение, которое использует мост для классических приложений, вам может потребоваться добавить дополнительный код, не показанный в этих примерах, для настройки объекта StoreContext. Дополнительные сведения см. в разделе Использование класса StoreContext в классическом приложении, в котором применяется мост для классических приложений.

Получение информации для текущего приложения

Чтобы получить информацию о продукте Магазина для текущего приложения, используйте метод GetStoreProductForCurrentAppAsync. Этот асинхронный метод возвращает объект StoreProduct, который можно использовать для получения такой информации, как цена.

private StoreContext context = null;

public async void GetAppInfo()
{
    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.
    }

    // Get app store product details. Because this might take several moments,   
    // display a ProgressRing during the operation.
    workingProgressRing.IsActive = true;
    StoreProductResult queryResult = await context.GetStoreProductForCurrentAppAsync();
    workingProgressRing.IsActive = false;

    if (queryResult.Product == null)
    {
        // The Store catalog returned an unexpected result.
        textBlock.Text = "Something went wrong, and the product was not returned.";

        // Show additional error info if it is available.
        if (queryResult.ExtendedError != null)
        {
            textBlock.Text += $"\nExtendedError: {queryResult.ExtendedError.Message}";
        }

        return;
    }

    // Display the price of the app.
    textBlock.Text = $"The price of this app is: {queryResult.Product.Price.FormattedBasePrice}";
}

Получение информации для надстроек с известными кодами продукта в Store, связанных с текущим приложением

Чтобы получить информацию о продукте в Store для надстроек, связанных с текущим приложением, с уже известными кодами продукта в Store, используйте метод GetStoreProductsAsync. Этот асинхронный метод возвращает коллекцию объектов StoreProduct, которые представляют каждую из надстроек. Помимо кодов продукта в Store, этому методу необходимо передать список строк, которые определяют типы надстроек. Список поддерживаемых строковых значений см. в описании свойства ProductKind.

Примечание

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

В этом примере извлекается информация для постоянных надстроек с заданными кодами продукта в Store, которые связаны с текущим приложением.

private StoreContext context = null;

public async void GetProductInfo()
{
    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.
    }

    // Specify the kinds of add-ons to retrieve.
    string[] productKinds = { "Durable" };
    List<String> filterList = new List<string>(productKinds);

    // Specify the Store IDs of the products to retrieve.
    string[] storeIds = new string[] { "9NBLGGH4TNMP", "9NBLGGH4TNMN" };

    workingProgressRing.IsActive = true;
    StoreProductQueryResult queryResult =
        await context.GetStoreProductsAsync(filterList, storeIds);
    workingProgressRing.IsActive = false;

    if (queryResult.ExtendedError != null)
    {
        // The user may be offline or there might be some other server failure.
        textBlock.Text = $"ExtendedError: {queryResult.ExtendedError.Message}";
        return;
    }

    foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
    {
        // Access the Store info for the product.
        StoreProduct product = item.Value;

        // Use members of the product object to access info for the product...
    }
}

Получение информации для надстроек, доступных для покупки из текущего приложения

Чтобы получить информацию о продукте Store для надстроек, которые сейчас доступны для покупки из текущего приложения, используйте метод GetAssociatedStoreProductsAsync. Это асинхронный метод, который возвращает коллекцию объектов StoreProduct , представляющих каждую из доступных надстроек. Этому методу необходимо передать список строк, определяющих типы надстроек, которые требуется извлечь. Список поддерживаемых строковых значений см. в описании свойства ProductKind.

Примечание

Если приложение содержит много доступных для приобретения надстроек, можно также использовать метод GetAssociatedStoreProductsWithPagingAsync, чтобы разбивать возвращаемые результаты для надстроек на страницы.

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

private StoreContext context = null;

public async void GetAddOnInfo()
{
    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.
    }

    // Specify the kinds of add-ons to retrieve.
    string[] productKinds = { "Durable", "Consumable", "UnmanagedConsumable" };
    List<String> filterList = new List<string>(productKinds);

    workingProgressRing.IsActive = true;
    StoreProductQueryResult queryResult = await context.GetAssociatedStoreProductsAsync(filterList);
    workingProgressRing.IsActive = false;

    if (queryResult.ExtendedError != null)
    {
        // The user may be offline or there might be some other server failure.
        textBlock.Text = $"ExtendedError: {queryResult.ExtendedError.Message}";
        return;
    }

    foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
    {
        // Access the Store product info for the add-on.
        StoreProduct product = item.Value;

        // Use members of the product object to access listing info for the add-on...
    }
}

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

Чтобы получить информацию о продукте Store для надстроек, купленных текущим пользователем, используйте метод GetUserCollectionAsync. Этот асинхронный метод возвращает коллекцию объектов StoreProduct, которые представляют каждую из надстроек. Этому методу необходимо передать список строк, определяющих типы надстроек, которые требуется извлечь. Список поддерживаемых строковых значений см. в описании свойства ProductKind.

Примечание

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

В следующем примере извлекаются сведения о устойчивых надстройках с указанными идентификаторами Store.

private StoreContext context = null;

public async void GetUserCollection()
{
    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.
    }

    // Specify the kinds of add-ons to retrieve.
    string[] productKinds = { "Durable" };
    List<String> filterList = new List<string>(productKinds);

    workingProgressRing.IsActive = true;
    StoreProductQueryResult queryResult = await context.GetUserCollectionAsync(filterList);
    workingProgressRing.IsActive = false;

    if (queryResult.ExtendedError != null)
    {
        // The user may be offline or there might be some other server failure.
        textBlock.Text = $"ExtendedError: {queryResult.ExtendedError.Message}";
        return;
    }

    foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
    {
        StoreProduct product = item.Value;

        // Use members of the product object to access info for the product...
    }
}