7 игр за 7 дней: rewarded video
Ты решил выпустить свою игру под iOS? Значит, читай дальше. Яхты, машины, виллы — все это будет твое. Главное — удачно жениться. А разработчикам игр остаются свобода и счастье творчества. Sic!
Да, закатай губу и помни, каждый день в яблочный магазин выкладывается более 1000 игр. Представь, что какой-то тип-игроман заходит в Appstore раз в неделю посмотреть свежие приложения. Его ждет 7×1000=7000 новых игр. И еще миллион старых, которых он не пробовал. Он пролистает 3 страницы с иконками и описаниями, увидит 3 десятка приложений, почитает отзывы и скачает себе пару бесплатных игрушек. Какова вероятность, что он увидит твое гениальное, неслыханное, эпохальное, умопомрачительное приложение? Невелика? Ах, ты с кафедры мат. статистики? Да ладно?! А не переживай. Удача и реклама спасут тебя. Выпусти 100 приложений, размести в них современную рекламу и 50 долларов в день тебе обеспечены до самой смерти.
Я расскажу, как осуществляется автором этот гениальный план, опубликую финансовые итоги 2015 года (тс-с-с), и проинформирую уважаемых читателей о рекламных сервисах, которые, по-моему мнению, самые модные и доходные в этом сезоне. Ссылок на приложения не даю, никого не трогаю, починяю примус.
Как плодить сущности
Прежде всего, практика. Знай, приложение считается готовым, когда оно выложено в магазин. Помню, весной я выпустил 7 хабро-статей на общую тему: 1 неделя — 1 игра. Не знаю, зачем я это сделал, видимо, авитаминоз. Я чуть не сошел с ума, потерял здоровье, работу и любимую женщину. Через пару недель все вернул вдвойне, но больше экспериментов такого толка не собираюсь повторять. Кстати, через полгода, переосмыслив ошибки, я легко забабахал в магазин 7 приложений за 7 дней. Не напрягаясь. Наверное, хорошо отдохнул. Остров Брач. И, основной принцип разработки — новый проект надо начинать с нуля. Кирпичи из прошлых проектов подключать по мере необходимости. Переделывать гораздо затратнее, чем строить заново.
Раскрутка бесплатных приложений
Обзоры, спам, красивые картинки — все тлен. Выброшенные деньги. Единственный способ, который я использую — все приложения держу пару недель в платном состоянии ($1) и на три дня объявляю их бесплатными. В такие дни, в зависимости от расположения звезд, получаю от 10 до 1000 загрузок на приложение. 1000 скачиваний со временем становится крайне редкой удачей.
Слежу и за платным состоянием. В 2015 году два приложения вдруг стали покупаемы. 5–20 покупок в день, в среднем $10 в день. Я их не трогаю, тьфу-тьфу-тьфу.
Одно, кстати было сделано в рамках проекта 7 игр за 7 недель (Frogger HD).
Вечно платные приложения
Есть такие — это приложения привязанные к виду спорта. Покупают хоккей и биатлон в дни этапов Кубка мира, чемпионатов мира, старта сезона в НХЛ. Все платные приложения принесли $3000 за год.
Карточные игры
Это отдельная тема, карточные игры бесплатны, я их почти не трогаю, потому что имею на них 10–100 скачиваний в день в сумме. Игроки, сыгравшие в хорошую карточную игру — как верные друзья, не уходят. King of Hearts приносит мне до $10 в день. При этом сам я в него не играю. Я играю в деберц.
Реклама в бесплатных играх
У меня есть два типа рекламы, баннеры и полноэкранки.
Баннерная реклама болтается внизу экрана, размером 320 на 50, к ней многие игроки настолько привыкли, что чувствуют себя неуютно, когда её нет.
Полноэкранные, в свою очередь делятся на статические заставки (Interstitial) и несколько-секундное видео.
В этом сезоне появилось так называемое rewarded video — то есть пользователю предлагается посмотреть видео ролик, за что он получает вкусные тортики.
Баннерная реклама
Приносит $14000-$16000 в год.
Самая эффективная баннерная реклама была и есть от Google — называется adMob. Она висит внизу экрана и порой тормозит игровой процесс. Средняя прибыль $0.20 — $1.00 за тысячу показов (так называемый eCpm). В этом сезоне, появился новый медиатор Appodeal, который поднимает eCpm в два раза. Медиатор не замена adMob. Медиатор показывает рекламу со всех площадок, разыгрывая её через аукцион.
В 2015 году я установил апподильский SDK на 4 приложения и получил удвоение доходов от баннерной рекламы. В 2016 году потихоньку переведу все игры к ним. Наверное.
У Appodeal несколько плюсов — 1) легкая интеграция. Сам код занимает 5 строк!
Судите сами, AppDelegate.m делаем таким:
#import
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Appodeal SDK Initialization
[Appodeal initializeWithApiKey:@"4333538d3f034056f26f72dd3e9a75a00c3dfc19856ee135" types: (AppodealAdType)(AppodealAdTypeInterstitial | AppodealAdTypeBanner)];
return YES;
}
В файл ViewController.m добавляем две строчки-функции:
#import
-(void) showInterstitial
{
[Appodeal showAd:AppodealShowStyleInterstitial rootViewController:self];
}
-(void) showBanner
{
[Appodeal showAd:AppodealShowStyleBannerBottom rootViewController:self];
}
2) плюс — вывод денег через что угодно, в том числе paypal. Нет нижнего ограничения для выводимой суммы.
Минус — толстый SDK. Он существенно увеличивает вес приложения.
Полноэкранная статическая реклама
Приносит $2000-$2500 в год.
Раньше я использовал только Chartboost. Ныне есть выбор. Медиатор Appodeal также автоматически подключает полноэкранную рекламу. Увы, я пока не имею статистики, какой сервис лучше по эффективности. Время сточило пусковой механизм. Время, необходимо время. По ощущениям, оба сервиса примерно равны. Но у Chartboost бывают дни, когда вдруг, бац! и вываливается $30 дневной выручки с сумасшедшим eCpm = $200!!!
Видимо, кто-то из игроков не просто посмотрел заставку —, а еще и установил рекламируемое приложение себе на iPhone. Не, ну молодец! Люблю таких.
Rewarded video
Остановлюсь подробнее, потому что вещь новая для меня.
В этом году я внедрил в нескольких проектах два варианта награждаемого видео — одно от Chartboost, второе — от Appodeal.
Appodeal rewarded video
У Appodeal всю обвязку приходится делать самому. То есть, необходимо в приложении делать экран приглашения для просмотра видео, за просмотр которого выдавать игроку тортики.
Изображение 4. Appodeal rewarded video
Смотрите, левый экран изображения 4 сделан мной лично на стороне приложения. После нажатия кнопки — показывается короткое видео (средний экран изображения 4) и при завершении видео высвечивается статичная картинка (правый экран на изображении 4). Событие, что видео загружено на устройство, разработчику приходится проверять самому вручную. Конечно, это примитивный вызов функции, но какие коллизии могут произойти при медленном интернете, как синхронизировать процесс просмотра видео и получения тортиков — мне не очень ясно.
Chartboost rewarded video
Chartboost в этом году выпустил новый SDK для просмотра видео.
Изображение 5. Chartboost rewarded video
На стороне сервера ты сам настраиваешь страницу, на которой предлагается посмотреть видео в обмен на тортики. Ты можешь менять текст и картинку (изображение 5, левая картинка).
В результате просмотра видео вываливается статичная заставка (картинка справа) и приходит delegate событие в программу, что видео успешно просмотрено. Обработать событие не представляет труда.
/*
* didCompleteRewardedVideo
*
* This is called when a rewarded video has been viewed
*
* Is fired on:
* - Rewarded video completed view
*
*/
- (void)didCompleteRewardedVideo:(CBLocation)location withReward:(int)reward {
NSLog(@"completed rewarded video view at location %@ with reward amount %d", location, reward);
ViewController *vc = (ViewController*)self.window.rootViewController;
[vc addCoins:reward];
Есть нюансы.
При подключении Chartboost требуется скопировать 100-строчную портянку текста, что удивляет.
Заключение
Разумеется оба подхода по интеграции rewarded video имеют свои плюсы и минусы.
Я использую оба. Если лень регистрировать Chartboost в приложении, я пользуюсь Appodeal, он наименее затратен с точки зрения времени интеграции.
Надеюсь, информация была полезна. С Новым годом, парни. А это бесплатный рождественский подарок.
Весь код приложения укладывается практически в одну функцию разрезания картины Пикассо на 25 кусочков.
- (UIImage *) imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
{
CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
UIImage *cropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return cropped;
}
.