|
Янв
02
|
Как только из Apple пришли новости о том, что с выходом прошивки 3.0 появится возможность организовать продажу дополнительного контента непосредственно из приложения (in-app purchase) я сразу решил, что задействую эту возможность в своей программе Flower Garden. Сама идея in-app purchase хорошо вписывается в идею цветочного магазина, где виртуальные садоводы могут купить дополнительные предметы для своего сада, поэтому вопрос стоял лишь во времени, которое потребуется на реализацию. По своему личному опыту я знал, что лишь малая часть пользователей, которые однажды купили приложения, тратят деньги и на дополнительный контент. Мое приложение Flower Garden очень хорошо приняли как игроки, так и новостные сайты, однако бестселлером игра никогда не была, а значит и покупки по системе in-app purchase с самого начала предполагались небольшими.
Ситуация поменялась когда Apple позволили встраивать in-app purchase в бесплатные приложения, а Flower Garden как раз был бесплатен, поэтому аудитория пользователей удвоилась.
В состоятельности всего этого предприятия я убедился, когда подумал, что хоть и маленький процент пользователей сделает покупки, некоторые из их числа все же могут приобрести несколько предметов, а кто-то даже и все, поэтому возможно это имеет смысл.
Сказав это, я дал себе неделю, чтобы полностью реализовать задуманное. В этот срок необходимо было произвести изменения в приложении, используя StoreKit, написать код и собственно создать новый контент для продажи.
Для тех из вас, кто знаком с приложением Flower Garden, я предлагаю ознакомится со списком дополнительного контента, который я придумал:
- Дополнительный сад с 12-ю горшочками.

- Удобрение, которое ускоряет рост растений. Удобрение является потребляемым, а дозировка применения фиксирована. После израсходования удобрение можно купить снова.
Кроме того для бесплатной версии Flower Garden можно приобрести контент, который доведет функционал приложения до платного аналога:
- Дополнительные горшочки в главном саду.
- Дополнительные семена.
- Бонусные семена.
Мой первоначальный расчет на одну неделю оказался очень оптимистичным. На самом деле, я потратил две с половиной недели и большая часть времени была потрачена на создание дополнительного контента и интеграцию его в игру.
В этом и других постах, я расскажу о своем опыте применения in-app purchases, дам некоторые подсказки, расскажу о хитростях, поделюсь мыслями о том, как это может помочь в борьбе с пиратством, и поведаю, сколько же продаж делается посредством in-app purchases.
Показ ассортимента.
В Apple проделали хорошую работу по написанию справки касательно реализации продаж из приложения. Есть небольшие пробелы, но они незначительны, поэтому я без труда их восполнил и все заработало спустя несколько дней.
Однако, я считаю, что процесс реализации всего этого должен быть немного проще, потому что последовательность тех действий, которые нужно сделать достаточно сложна. Для тех, кто хочет сделать настоящий продвинутый магазин это подходит, но в 99% случаях разработчики просто хотят что-нибудь продать и на этом все. Заставлять нас пройти все эти шаги излишне. Упрощение всего этого было бы неплохим дополнением к SDK.
Получение каталога.
Первый шаг к реализации in-app purchases - это получение списка контента, который вы хотите продавать в своем магазине. Хорошо то, что этот список можно держать где-нибудь у себя на сервере, потому что у вас есть возможность изменить ассортимент, не прибегая к обновлению всего приложения. На каталог Flower Garden вы можете взглянуть здесь.
Получение информации о продукте.
Вторым шагом вы должны предоставить информацию о продаваемом контенте, которая берется из App Store. Для этого нужно создать набор ID для продуктов.
Вот код, который я использовал в Flower Garden для запроса ID:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | NSArray* products = m_appData->m_shopCatalog.m_products; NSMutableSet* productIds = [[NSMutableSet alloc] initWithCapacity:32]; for (int i=0; i<[products count]; ++i) { ShopProduct* product = [products objectAtIndex:i]; if (!product.m_alreadyIncluded) [productIds addObject:product.m_id]; } SKProductsRequest* request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIds]; request.delegate = self; #ifdef WORK_WITHOUT_APP_STORE [self productsRequest:request didReceiveResponse:nil]; #else [request start]; #endif [productIds release]; |
В этом коде есть пара интересных мест.
Прежде всего, стоит заметить, что перед запросом информации о продукции мы проверяем , не включена ли она уже в приложение. Это сделано, потому что такие предметы, как горшки и семена уже присутствуют в платной версии приложения. В это же время я хочу показывать эти предметы как уже купленные. Подробнее об этом поговорим в следующем посте.
Следующий интересный момент - это #ifdef. Симулятор не может обратиться к StoreKit. Симулятор вылетает с окном, в котором объясняется, почему это происходит, но факт в том, что это происходит. Все это означает, что работу вести придется непосредственно на iPhone, а отладка кода на устройстве это далеко не весело. Думаю, этот факт повлиял и на количество времени, которое я потратил на реализацию проекта. #ifdef - это моя попытка по максимуму использовать симулятор при отладке. Надеюсь, в следующих версиях SDK это исправят.
Показ наименований.
Через некоторое время после посылки запроса на получение информации о продукте мы поучаем ответ из App Store. Ответ включает в себя подробную информацию по каждому из наименований, которые были запрошены, название и цену. Эта информация берется из in-app purchases, которые вы создаете в iTunes Connect. Это значит, что вам нужно держать в актуальном состоянии информацию и в каталоге (на сервере) и в iTunes Connect.
Отображение продукта.
Через некоторое время после отправки запроса на информацию по продуктам мы получаем ответ - при условии рабочего соединения с Интернет и благоприятного расположения духа у App Store (к чести серверов Apple, стоит отметить их надежность). В ответе будут присутствовать дополнительные данные по каждому из запрошенных продуктов, включая локализованный вариант названия, описание и цену. Вся эта информация берется из созданных ранее в iTunes Connect in-app purchases. Соответственно, для всех групп данных обязательна синхронизация (каталог магазина плюс in-app purchases в iTunes Connect).
Обратите внимание: ситуация существенно осложняется тем, что до сих пор все делалось асинхронно (и такая же асинхронность ждет нас и на множестве оставшихся этапов). Что же предпринять на текущий момент? Отправить пользователя к другим частям программы? Заблокировать и сделать пользовательский интерфейс модальным? Я предпочел второй вариант - с учетом простоты кода и интерфейса для пользователя.
Теперь можно отображать продукты в магазине. В нашем случае я остановился на интефейсе, во многом аналогичном App Store для iPhone. Делая ставку на него, я руководствовался тем, что такой интерфейс уже хорошо знаком пользователям. Таким образом, цветочный магазин представляет собой таблицу со всеми доступными позициями. Щелчок на ячейке вызывает окно с подробной информацией и описанием каждого продукта.
Чтобы упростить себе жизнь, я жестко закодировал на странице продукта лишь несколько элементов - пиктограмму, заголовок, кнопку цена/купить. Описание и скриншот представляют собой загружаемые с веб-сервера и внедряемые данные, а часть с описанием продукта в каталоге имеет соответствующий URL-адрес для каждого проекта. Некоторые из решений можно посмотреть прямо здесь.
Итак, мы сделали все, чтобы наполнить список выставляемых на продажу решений. В следующий раз мы подробно рассмотрим собственно сделку и моменты, на которые при ней нужно обращать особое внимание.


Последние комментарии
пока я не получил лицензию разработчика, но уже очень хочу...
vodos, да...
Злые вы,...
iPhone Application writes data to a text file,...
ошибка...