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

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

  Этапы рисунка 2-1 процесса закупки — выводящий на экран хранилище UI

Получение списка идентификаторов продукта

Каждый продукт, который Вы продаете в своем приложении, имеет уникальный идентификатор продукта. Когда пользователи покупают те продукты, Ваше приложение использует эти идентификаторы продукта, чтобы выбрать информацию о продуктах от App Store, таких как ценообразование, и представить платежные требования. Ваше приложение может или считать свой список идентификаторов продукта от файла в его комплекте приложений или выбрать их от Вашего сервера. Таблица 2-1 суммирует различия между двумя подходами.

Табличное 2-1  Сравнение подходов для получения идентификаторов продукта

Встроенный в комплект приложений

Выбранный от Вашего сервера

Используемый для покупок это

Разблокируйте функциональность

Поставьте содержание

Список продуктов может измениться

Когда обновляется приложение

В любое время

Требует сервера

Нет

Да

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

Нет никакого механизма во время выполнения для выборки списка всех продуктов, сконфигурированных в Подключении iTunes для определенного приложения. Вы ответственны за управление списком Вашего приложения продуктов и предоставления той информации Вашему приложению. Если необходимо управлять большим количеством продуктов, рассмотрите использование объемной функции загрузки/загрузки XML в Подключении iTunes.

Встраивание идентификаторов продукта в комплекте приложений

Включайте файл списка свойств в свой комплект приложений, содержащий массив идентификаторов продукта, таких как следующее:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>com.example.level1</string>
    <string>com.example.level2</string>
    <string>com.example.rocket_car</string>
</array>
</plist>

Для получения идентификаторов продукта от списка свойств найдите файл в комплекте приложений и считайте его.

NSURL *url = [[NSBundle mainBundle] URLForResource:@"product_ids"
                                     withExtension:@"plist"];
NSArray *productIdentifiers = [NSArray arrayWithContentsOfURL:url];

Выборка идентификаторов продукта от сервера

Разместите файл JSON на своем сервере с идентификаторами продукта. Например:

[
    "com.example.level1",
    "com.example.level2",
    "com.example.rocket_car"
]

Чтобы получить идентификаторы продукта от Вашего сервера, выберите и считать файл JSON как показано в Перечислении 2-1. Считайте управление версиями файлом JSON так, чтобы будущие версии Вашего приложения могли изменить его структуру, не повреждая более старые версии Вашего приложения. Например, Вы могли назвать файл, использующий старую структуру products_v1.json и файл, использующий новую структуру products_v2.json. Если Ваш файл JSON более сложен, чем простой массив в примере, это особенно полезно.

Перечисление 2-1  , Выбирающее идентификаторы продукта от Вашего сервера

- (void)fetchProductIdentifiersFromURL:(NSURL *)url delegate:(id)delegate
{
    dispatch_queue_t global_queue =
           dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(global_queue, ^{
        NSError *err;
        NSData *jsonData = [NSData dataWithContentsOfURL:url
                                                  options:NULL
                                                    error:&err];
        if (!jsonData) { /* Handle the error */ }
 
        NSArray *productIdentifiers = [NSJSONSerialization
            JSONObjectWithData:jsonData options:NULL error:&err];
        if (!productIdentifiers) { /* Handle the error */ }
 
        dispatch_queue_t main_queue = dispatch_get_main_queue();
        dispatch_async(main_queue, ^{
           [delegate displayProducts:productIdentifiers]; // Custom method
        });
    });
}

Для получения информации о загрузке использования файлов NSURLConnection, посмотрите Используя NSURLConnection в Руководстве по программированию Загрузочной системы URL.

Чтобы гарантировать, что Ваше приложение остается быстро реагирующим, используйте фоновый поток, чтобы загрузить файл JSON и извлечь список идентификаторов продукта. Для минимизации переданных данных используйте стандартные механизмы кэширования HTTP, такой как Last-Modified и If-Modified-Since заголовки.

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

Для проверки пользователи видят только продукты, которые фактически доступны для закупки, запрашивают App Store прежде, чем вывести на экран хранилище приложения UI.

Используйте объект запроса продуктов запросить App Store. Во-первых, создайте экземпляр SKProductsRequest и инициализируйте его со списком идентификаторов продукта. Запрос продуктов получает информацию о допустимых продуктах, вместе со списком недопустимых идентификаторов продукта, и затем вызывает его делегата для обработки результата. Делегат должен реализовать SKProductsRequestDelegate протокол для обработки ответа от App Store. Перечисление 2-2 показывает простую реализацию обеих частей кода.

Перечисление 2-2  , Получающее информацию о продукте

// Custom method
- (void)validateProductIdentifiers:(NSArray *)productIdentifiers
{
    SKProductsRequest *productsRequest = [[SKProductsRequest alloc]
        initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];
    productsRequest.delegate = self;
    [productsRequest start];
}
 
// SKProductsRequestDelegate protocol method
- (void)productsRequest:(SKProductsRequest *)request
     didReceiveResponse:(SKProductsResponse *)response
{
    self.products = response.products;
 
    for (NSString *invalidIdentifier in response.invalidProductIdentifiers) {
        // Handle any invalid product identifiers.
    }
 
    [self displayStoreUI]; // Custom method
}

Когда пользователь покупает продукт, Вам нужен соответствующий объект продукта создать платежное требование, поэтому сохраните ссылку на массив объектов продукта, это возвращается делегату. Если список продуктов, которые продает Ваше приложение, может измениться, можно хотеть создать пользовательский класс, инкапсулирующий ссылку на объект продукта, а также другую информацию — например, изображения или текст описания, который Вы выбираете от своего сервера. Платежные требования обсуждены в Запросе Платежа.

Идентификаторы продукта, возвращаемые как недопустимые обычно, указывают ошибку в списке Вашего приложения идентификаторов продукта, несмотря на то, что это могло означать, что продукт не был должным образом сконфигурирован в Подключении iTunes. Хорошее журналирование и хороший UI помогают Вам разрешить этот тип проблемы более легко. В производственных сборках Ваше приложение должно перестать работать корректно — обычно, это означает отображать остальную часть хранилища Вашего приложения UI и опускать недопустимый продукт. В сборках разработки выведите на экран ошибку привлечь внимание к проблеме. И в сборках производства и в разработки, использовать NSLog записать сообщение в консоль, таким образом, у Вас есть запись недопустимого идентификатора. Если бы Ваше приложение выбрало список от Вашего сервера, то Вы могли бы также определить механизм журналирования, чтобы позволить Вашему приложению передать список обратно недопустимых идентификаторов к Вашему серверу.

Представление хранилища приложения UI

Поскольку проект хранилища Вашего приложения оказывает важное влияние на Ваши продажи в приложении, стоит инвестировать время и усилие разобраться в нем. Разработайте пользовательский интерфейс для своего хранилища UI, таким образом, это интегрируется с остальной частью Вашего приложения. Набор хранилища не может предоставить хранилище UI Вам. Только Вы знаете, что Ваше приложение и его содержание достаточно хорошо разрабатывают Ваше хранилище UI в пути, демонстрирующем Ваши продукты в их лучшем свете и соответствующем беспрепятственно остальной части Вашего приложения.

Рассмотрите следующие инструкции как Вас разработка и реализация хранилище Вашего приложения UI.

Выведите на экран хранилище, только если пользователь может произвести платежи. Чтобы определить, может ли пользователь произвести платежи, вызовите canMakePayments метод класса SKPaymentQueue класс. Если пользователь не может произвести платежи (например, из-за родительских ограничений), или вывести на экран UI, указывающий, что это хранилище не доступно, или опустите часть хранилища своего UI полностью.

Существующие продукты естественно в потоке Вашего приложения. Найдите, что лучшее место в Вашем UI показывает хранилищу Вашего приложения UI. Существующие продукты в контексте в то время, когда пользователь может использовать их — например, позвольте пользователям разблокировать функциональность, когда они пытаются использовать ту премиальную функцию. Обратите особое внимание на опыт, который пользователь имеет при исследовании приложения впервые.

Организуйте продукты так, чтобы исследование было просто и приятно. Если Ваше приложение имеет достаточно маленькое число продуктов, можно вывести на экран все на одном экране; иначе, группа или категоризирует продукты для создания их простыми перейти. Приложения с большим количеством продуктов, такие как читатели комиксов или журналы со многими проблемами, получают преимущества особенно от интерфейса, упрощающего для пользователей обнаруживать новые элементы, которые они хотят купить. Имейте значения между своими продуктами, ясными путем предоставления им отличных имен и зрительного ряда — при необходимости, включайте явные сравнения.

Передайте значение своих продуктов Вашим пользователям. Пользователи хотят знать точно, что они собираются купить. Информация об объединении от App Store, такого как цены на продукцию и описания, с дополнительными данными от Вашего сервера или комплекта приложений, такие как изображения или демонстрации Ваших продуктов. Позвольте пользователям взаимодействовать с продуктом ограниченным способом прежде, чем купить его. Например, игра, дающая пользователю опцию купить новые гоночные автомобили, может позволить пользователям выполнять тестовую полировку с новым автомобилем. Аналогично, приложение получения, позволяющее пользователю купить дополнительные кисти, может дать пользователям шанс нарисовать с новой кистью на маленькой временной памяти и видеть различие между кистями. Этот вид проекта предоставляет пользователям возможность испытать продукт и быть убежденным, что они хотят купить его.

Цены на дисплей ясно, с помощью локали и валюты, возвращенной App Store. Гарантируйте, что цену продукта просто найти и простой читать. Не пытайтесь преобразовать цену в различную валюту в Вашем UI, даже если отличаются локаль пользователя и локаль цены. Рассмотрите, например, пользователя в США, предпочитающего локаль Соединенного Королевства для ее модулей и форматирования даты. Ваши отображения приложения его UI согласно локали Соединенного Королевства, но это все еще должно вывести на экран информацию о продукте в локали, указанной App Store. Преобразование цен к стерлингу британских фунтов, в попытке соответствовать локаль Соединенного Королевства остальной части интерфейса, было бы неправильным. Пользователь имеет учетную запись App Store в США и платит в долларах США, таким образом, цены были бы предоставлены для Вашего приложения в долларах США. Аналогично, Ваше приложение вывело бы на экран свои цены в долларах США. Перечисление 2-3 показывает, как правильно отформатировать цену при помощи информации о локали продукта.

Перечисление 2-3  , Форматирующее цену продукта

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *formattedPrice = [numberFormatter stringFromNumber:product.price];

После того, как пользователь выбирает продукт для покупки, подключения приложения к App Store для запроса платежа за продукт.

Предложенные шаги тестирования

Протестируйте каждую часть своего кода, чтобы проверить реализацию его правильно.

Регистрируйтесь к App Store с Вашей тестовой учетной записью

Создайте учетную запись проверочного пользователя в Подключении iTunes, как описано в Создании Учетных записей Проверочного пользователя.

На устройстве на iOS разработки подпишитесь из App Store в Настройках. Тогда создайте и выполните свое приложение от XCode.

На устройстве OS X разработки подпишитесь из App Store Mac. Тогда создайте свое приложение в XCode и запустите его от Средства поиска.

Используйте свое приложение для совершения покупки в приложении. Когда запрошено для регистрирования к App Store используйте тестовую учетную запись. Обратите внимание на то, что текст “[Среда: Песочница]” появляется как часть подсказки, указывая, что Вы подключены к тестовой среде.

Если текст “[Среда: Песочница]” не появляется, Вы используете продуктивную среду. Удостоверьтесь, что Вы выполняете подписанную разработкой сборку своего приложения. Подписанные производством сборки используют продуктивную среду.

Тест, выбирающий список идентификаторов продукта

Если Ваши идентификаторы продукта встраиваются в Ваше приложение, установите точку останова в своем коде после того, как они загружаются и проверяют что экземпляр NSArray содержит ожидаемый список идентификаторов продукта.

Если Ваши идентификаторы продукта выбираются от сервера, вручную выбирают файл JSON — использование веб-браузера, такого как Safari или утилита командной строки такой как curl— и проверьте, что данные, возвращенные из Вашего сервера, содержат ожидаемый список идентификаторов продукта. Также проверьте, что Ваш сервер правильно реализует стандартные механизмы кэширования HTTP.

Тестовая обработка недопустимых идентификаторов продукта

Преднамеренно включайте недопустимый идентификатор в список своего приложения идентификаторов продукта. (Удостоверьтесь, что Вы удаляете его после тестирования.)

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

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

Протестируйте запрос продуктов

Используя список идентификаторов продукта, которые Вы протестировали, создайте и представьте экземпляр SKProductsRequest. Установите точку останова в своем коде и проверьте списки допустимых и недопустимых идентификаторов продукта. Если существуют недопустимые идентификаторы продукта, рассматривают Ваши продукты в Подключении iTunes и исправляют Ваш список файлов JSON или список свойств.