На WWDC’17 Apple показала обновленный интерфейс App Store и представила ряд нововведений. Среди них были продвигаемые встроенные покупки, которые с выходом iOS 11 будут выводится прямо в поиске и редакторских подборках наряду с приложениями.
В нашем случае это особенно актуальная вещь, так как в текущем проекте War Robots мы используем встроенные покупки, которые для нас стали самым оптимальным способом монетизации. Поэтому в нескольких новых играх, которые сейчас в разработке, мы также собираемся их использовать.
Одно из главных отличий — теперь пользователь сможет совершить встроенную покупку прямо в магазине, после чего будет установлено приложение и информация о покупке будет сообщена при запуске. Для этого делегат SKPaymentTransactionObserver должен реализовать специальный метод:
- (BOOL)paymentQueue:(SKPaymentQueue *)queue
shouldAddStorePayment:(SKPayment *)payment
forProduct:(SKProduct *)product;
Пока в приложении не реализован этот метод, продвигаемые встроенные покупки нельзя будет приобрести из App Store. Но они будут отображены в специальном разделе на странице приложения.
Для того чтобы встроенную покупку сделать продвигаемой, необходимо заполнить специальные метаданные, недавно появившиеся в iTunes Connect: рекламное изображение, заголовок и краткое описание. После прохождения review изменений покупка появится в новом разделе «Продвижение в App Store», где можно в любой момент поменять значения видимости по умолчанию для всех пользователей и их порядок отображения на странице приложения в App Store. Так можно продвигать до 20 встроенных покупок одновременно и неограниченное количество покупок держать в режиме готовности к включению.
Все эти значения видимости и порядка будут использоваться для пользователей, которые еще не установили приложение.
Важнейшей составляющей нововведения становится возможность программно изменять порядок и видимость продвигаемых встроенных покупок. Теперь мы можем подстраиваться под каждого пользователя приложения: выводить в топ горсть кристаллов игроку, у которого они на нуле; предлагать премиум-аккаунт активному пользователю; или открывать новый уровень игроку, который прошел весь основной контент. Или же вообще сделать специальное очень выгодное предложение покупки премиум-валюты видимым игроку только в тот момент, когда он столкнулся с острой нехваткой ресурсов, но при этом не воспользовался основным предложением по ее приобретению. Можно устроить A/B тестирование для нахождения оптимального порядка.
А конкретнее?
Рассмотрим новые методы API, предоставляемые Apple для совершения данных манипуляций.
Сделаем продвигаемыми две встроенные покупки приложения. До установки и после запуска, если ничего не делать, они будут отображаться у пользователя в соответствии с настройками из iTunes Connect:
Чтобы изменить порядок и видимость этих покупок, нам нужно получить объекты покупок по их sku через SKProductsRequest:
- (void)requestProducts
{
SKProductsRequest* productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"gold.iap.example.com"]];
productRequest.delegate = self;
[productRequest start];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSArray<SKProduct *>* products = response.products;
// do some stuff
}
Действия с продвигаемыми покупками делаются через SKProductStorePromotionController, который будет реализован в версии iOS 11. Поэтому дальнейшие вызовы оборачиваем проверкой на доступность этой версии. Методов всего четыре, выполнять их можно в любой момент, когда приложение запущено. Рассмотрим каждый из них.
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
if (@available(iOS 11.0, *)) {
NSArray<SKProduct *>* products = response.products;
[[SKProductStorePromotionController defaultController] updateStorePromotionOrder:products completionHandler:^(NSError * _Nullable error) {
if(error != nil) {
NSLog(@"Update store promotion order failed with error: %@", [error description]);
} else {
NSLog(@"Success");
}
}];
} else {
// Fallback on earlier versions
}
}
После выполнения закроем и заново откроем страницу приложения в магазине, и взглянем на раздел встроенных покупок:
Порядок изменился. Данным вызовом мы установили приоритет для товара gold.iap.example.com. Теперь он показывается первым.
Если бы мы передали несколько товаров, они бы отображались в том порядке, в котором мы их передали. Далее идут остальные товары в их порядке по-умолчанию (то есть заданном в iTunes Connect). Если в качестве списка товаров передать nil, переопределение сбросится и все товары вернутся в первоначальное положение. Получить текущий установленный порядок можно вызовом:
- (void)fetchPromotionOrder
{
if (@available(iOS 11.0, *)) {
[[SKProductStorePromotionController defaultController] fetchStorePromotionOrderWithCompletionHandler:^(NSArray<SKProduct *> * _Nonnull storePromotionOrder, NSError * _Nullable error) {
if(error != nil) {
NSLog(@"Fetch store promotion order failed with error: %@", [error description]);
} else {
NSMutableString* productIds = [NSMutableString string];
for (SKProduct* product in storePromotionOrder) {
[productIds appendString:product.productIdentifier];
[productIds appendString:@"; "];
}
NSLog(@"Got promotion order: %@", productIds);
}
}];
} else {
// Not supported
}
}
Метод вернет только те товары, порядок которых был переопределен, в порядке их переопределения.
Другая доступная пара методов взаимодействует с видимостью товаров. Выполнив следующий код мы переопределим видимость переданного товара gold.iap.example.com (в этих методах передается только один товар):
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
if (@available(iOS 11.0, *)) {
SKProduct* product = [response.products objectAtIndex:0];
[[SKProductStorePromotionController defaultController] updateStorePromotionVisibility:SKProductStorePromotionVisibilityHide forProduct:product completionHandler:^(NSError * _Nullable error) {
if(error != nil) {
NSLog(@"Update store promotion visibility failed with error: %@", [error description]);
} else {
NSLog(@"Success");
}
}];
} else {
// Fallback on earlier versions
}
}
Наш приоритетный товар исчез из списка на странице магазина.
Другим методом можно получить текущую установленную видимость товара:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
if (@available(iOS 11.0, *)) {
SKProduct* product = [response.products objectAtIndex:0];
[[SKProductStorePromotionController defaultController] fetchStorePromotionVisibilityForProduct:product completionHandler:^(SKProductStorePromotionVisibility storePromotionVisibility, NSError * _Nullable error) {
if(error != nil) {
NSLog(@"Fetch store promotion visibility failed with error: %@", [error description]);
} else {
NSLog(@"Promotion visibility %ld", (long)storePromotionVisibility);
}
}];
} else {
// Fallback on earlier versions
}
}
Enum SKProductStorePromotionVisibility имеет следующие доступные значения: Show (товар виден), Hide (товар скрыт), Default (значение видимости берется из iTunes Connect).
Таким образом, список встроенных покупок можно подстраивать для каждого конкретного пользователя как угодно. Инструмент — в руках разработчика, остается самое главное: продумать правила показа, ведь именно от них зависит успех продаж тех или иных встроенных покупок и доход от приложения в целом. Все это демонстрирует желание Apple сделать App Store настоящим местом для покупок, а не банальным сервисом для хранения и поиска приложений.
Ссылка на документацию от Apple: developer.apple.com/app-store/promoting-in-app-purchases
Комментарии (4)
Z80A
12.09.2017 10:40Для меня вообще загадка как что-то можно пойти и купить сразу в игре, не попробовав бесплатно(!) саму игру. Кто-нибудь сможет предложить хотя бы один правдоподобный сценарий?
Groozze Автор
12.09.2017 12:20Apple предлагает включать такие покупки в специальные подборки. Пользователь может не знать о существовании игры, но наткнуться на товар в подборке и оттуда нажать «приобрести». Его картинка и описание товара завлекут больше, чем картинка и описание игры. Возможно, пользователь не задумывается о потраченных деньгах при этом, или же он рассчитывает сделать возврат в случае чего. Не факт, что в игре предложат приобрести этот товар, он увидит товар, поставит игру, вернется в стор и приобретет товар из стора. Также игра может у него уже стояла, но он ее прошел и удалил, и тут ему предлагают приобрести новый уровень к этой игре, да еще и по сниженной цене, например.
Z80A
Если у игрока кристаллы на нуле, значит он уже играет в вашу игру, зачем же ему идти в стор смотреть на ваши покупки, когда вы можете их предложить непосредственно интерфейсом игры?
Groozze Автор
Игрок заходит на страницу как минимум, чтобы оставить отзыв (его надо заставить это сделать), посмотреть похожие игры и другие игры разработчика (если игра ему нравится). Также нажать обновление, если автоматическое обновление не включено. Касательно War Robots: у нас сохранение в облаке, и часто пользователь ставит игру на нескольких девайсах, или может удалить игру, и потом вспомнить про нее и поставить вновь, зная, что прогресс восстановится. И тут он тоже пойдет в стор на страницу игры. Может в скором времени Apple приучит пользователей смотреть специальные предложения к любимым играм в сторе, не запуская приложение.