Управление большим каталогом продуктов в приложении
Если ваше приложение предлагает большой каталог продуктов в приложении, вы можете при необходимости следовать процессу, описанному в этом разделе, чтобы помочь управлять каталогом. В выпусках до Windows 10 магазин имеет ограничение в 200 продуктов на учетную запись разработчика, и процесс, описанный в этом разделе, можно использовать для обхода этого ограничения. Начиная с Windows 10, Магазин не имеет ограничения на количество списков продуктов на учетную запись разработчика, и процесс, описанный в этой статье, больше не требуется.
Внимание
В этой статье показано, как использовать элементы пространства имен Windows.ApplicationModel.Store . Это пространство имен больше не обновляется с новыми функциями, и мы рекомендуем вместо этого использовать пространство имен Windows.Services.Store . Пространство имен Windows.Services.Store поддерживает последние типы надстроек, такие как управляемые магазином надстройки и подписки, и предназначены для обеспечения совместимости с будущими типами продуктов и функций, поддерживаемых Центром партнеров и Магазином. Пространство имен Windows.Services.Store было введено в Windows 10 версии 1607, и его можно использовать только в проектах, предназначенных для Windows 10 Anniversary Edition (10.0; Сборка 14393) или более поздняя версия в Visual Studio. Дополнительные сведения см. в разделе "Покупки в приложении" и пробные версии.
Чтобы включить эту возможность, вы создадите несколько записей продуктов для определенных ценовых категорий, каждый из которых может представлять сотни продуктов в каталоге. Используйте перегрузку метода RequestProductPurchaseAsync , указывающую определенное приложением предложение, связанное с продуктом из приложения, перечисленным в Магазине. Помимо указания связи предложения и продукта во время вызова, приложение также должно передать объект ProductPurchaseDisplayProperties , содержащий сведения о предложении большого каталога. Если эти сведения не указаны, вместо этого будут использоваться сведения о указанном продукте.
Магазин будет использовать только предложение из запроса на покупку в результирующей покупкеResults. Этот процесс не изменяет сведения, которые изначально предоставляются при перечислении продукта в приложении в Магазине.
Необходимые компоненты
- В этом разделе рассматривается поддержка Магазина для представления нескольких предложений в приложении с помощью одного продукта в приложении, указанного в Магазине. Если вы не знакомы с покупками в приложении, ознакомьтесь со сведениями о лицензии и правильном перечислении покупки в приложении в Магазине.
- При первом коде и тестировании новых предложений в приложении необходимо использовать объект CurrentAppSimulator вместо объекта CurrentAppApp . Таким образом вы можете проверить логику лицензии с помощью имитированных вызовов к серверу лицензирования вместо вызова динамического сервера. Для этого необходимо настроить файл с именем WindowsStoreProxy.xml в %userprofile%\AppData\local\packages\<имя>_пакета\LocalState\Microsoft\Windows Store\ApiData. Симулятор Microsoft Visual Studio создает этот файл при первом запуске приложения или также можно загрузить пользовательский в среде выполнения. Дополнительные сведения см. в разделе "Использование файла WindowsStoreProxy.xml с CurrentAppSimulator".
- В этом разделе также приводятся примеры кода, предоставляемые в примере Store. Этот пример — отличный способ получить практический опыт работы с различными вариантами монетизации, предоставляемыми для приложений универсальная платформа Windows (UWP).
Создание запроса на покупку для продукта в приложении
Запрос на покупку определенного продукта в большом каталоге обрабатывается так же, как и любой другой запрос на покупку в приложении. Когда приложение вызывает новую перегрузку метода RequestProductPurchaseAsync, приложение предоставляет как ПредложениеId, так и объект ProductPurchaseDisplayProperties, заполненный именем продукта в приложении.
string offerId = "1234";
string displayPropertiesName = "MusicOffer1";
var displayProperties = new ProductPurchaseDisplayProperties(displayPropertiesName);
try
{
PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync(
"product1", offerId, displayProperties);
switch (purchaseResults.Status)
{
case ProductPurchaseStatus.Succeeded:
// Grant the user their purchase here, and then pass the product ID and transaction ID
// to currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment to
// the Windows Store.
break;
case ProductPurchaseStatus.NotFulfilled:
// First check for unfulfilled purchases and grant any unfulfilled purchases from an
// earlier transaction. Once products are fulfilled pass the product ID and transaction
// ID to currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment
// to the Windows Store.
break;
case ProductPurchaseStatus.NotPurchased:
// Notify user that the purchase was not completed due to cancellation or error.
break;
}
}
catch (Exception)
{
// Notify the user of the purchase error.
}
Отчет о выполнении предложения в приложении
Приложению потребуется сообщить о выполнении продукта в Магазине, как только предложение было выполнено локально. В сценарии большого каталога, если ваше приложение не сообщает о выполнении предложения, пользователь не сможет приобрести какие-либо предложения в приложении, используя тот же список продуктов Магазина.
Как упоминалось ранее, магазин использует только предоставленные сведения о предложении для заполнения PurchaseResults и не создает постоянную связь между крупным предложением каталога и списком продуктов Store. В результате необходимо отслеживать права пользователей на продукты и предоставлять контекст для конкретного продукта (например, имя приобретаемого элемента или сведения об этом) пользователю за пределами операции RequestProductPurchaseAsync .
Следующий код демонстрирует вызов выполнения и шаблон обмена сообщениями пользовательского интерфейса, в котором вставляется определенная информация о предложении. В отсутствие конкретных сведений о продукте в примере используются сведения из product ListingInformation.
string offerId = "1234";
product1ListingName = product1.Name;
string displayPropertiesName = "MusicOffer1";
if (String.IsNullOrEmpty(displayPropertiesName))
{
displayPropertiesName = product1ListingName;
}
var offerIdMsg = " with offer id " + offerId;
if (String.IsNullOrEmpty(offerId))
{
offerIdMsg = " with no offer id";
}
FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(productId, transactionId);
switch (result)
{
case FulfillmentResult.Succeeded:
Log("You bought and fulfilled " + displayPropertiesName + offerIdMsg);
break;
case FulfillmentResult.NothingToFulfill:
Log("There is no purchased product 1 to fulfill.");
break;
case FulfillmentResult.PurchasePending:
Log("You bought product 1. The purchase is pending so we cannot fulfill the product.");
break;
case FulfillmentResult.PurchaseReverted:
Log("You bought product 1. But your purchase has been reverted.");
// Since the user' s purchase was revoked, they got their money back.
// You may want to revoke the user' s access to the consumable content that was granted.
break;
case FulfillmentResult.ServerError:
Log("You bought product 1. There was an error when fulfilling.");
break;
}