В апреле этого года во время презентации новой операционной системы iOS 4 (бывшая iPhone OS) Стив Джобс также представил и новую платформу компании Apple для мобильной рекламы – iAd. По заверению Apple, их главная задача — дать возможность заработать разработчикам бесплатных и недорогих приложений за счет размещения в последних рекламных баннеров. Оплата будет идти как за показ рекламного баннера, так и за клики по нему. Во втором случае оплата будет существенно выше.
Основная идея iAd – соединение интерактивности, которую дает использование смартфона или планшета, с эмоциональностью рекламного объявления, в котором задействованы и аудио, и видео. Для этих целей при создании рекламы используются Java Script, HTML5, CSS3 и мультитач. Все это позволяет создавать интересные и привлекающие внимание рекламные ролики-приложения. Примеры таких реклам мы могли видеть на презентации новой операционной системы (на английском языке).
Основной проблемой мобильной рекламы сегодня, по мнению Apple, является то, что кликая по рекламному баннеру, пользователь покидает приложение – переходя, чаще всего, на сайт рекламодателя. С помощью iAd мы можем обойти эту неприятность. После клика по баннеру рекламное объявление появляется поверх вашего приложения. Пользователь может в любой момент закрыть его и вернуться в ваше приложение точно в тот момент, в котором он его покинул.
На основе iAd Programming Guide и видео с WWDC 2010 я набросал краткий обзор-перевод этой новой технологии. Речь пойдет не о создании самих красочных рекламок, а именно о размещении таковых в ваших приложениях.
Первое, что надо сделать, чтобы поместить рекламу в вашем приложении – это добавить к вашему проекту в Xcode - iAd.framework. Она содержится в iOS 4 SDK. Ну и не забыть добавить #import <iAd/iAD.h> куда надо. Разработчикам предлагаются для использования два баннера на выбор — 320 x 50 пикс. для портретнго расположения и 480 х 32 пикс. для альбомного. Основу этого баннер составляет класс ADBannerView, который является подклассом UIView. Поэтому все, что вам надо, это внедрить этот view в вашу иерархию элементов управления интерфейса. Вы можете сделать это и программно, и через Interface Builder — там появился новый UI элемент — Ad BannerView.
![](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg227.imageshack.us%2Fimg227%2F9302%2F20100625112541.png%22)
Apple настоятельно рекомендует располагать баннер сверху или снизу экрана и не располагать его на движущихся частях таких элементов как — ScrollView и TableView– это уменьшает показы (и как следствие ваши деньги), да и пользователю неудобно «ловить» такой баннер.
Давайте просто создадим новый проект в Xcode на основе шаблона View-based Application и добавим в него рекламный баннер. Наше приложение будет называться iAdEx. Изменяем код в iAdExViewController.h
а в iAdExViewController.m изменяем метод viewDidLoad
Остановимся чуть-чуть подробнее на свойствах requiredContentSizeIdentifiers и currentContentSizeIdentifier.
В первом свойстве вы указываете все виды баннеров, которые вы собираетесь использовать в своем приложении. А второе свойство — какой тип баннера вы будете использовать в данный конкретный момент. Так как я пока пишу самое простое приложение, то продолжим с одним размером баннера и портретной ориентацией, а ниже я сделаю так, чтобы баннер менялся в зависимости от ориентации телефона.
Давайте остановимся на секунду и порассуждаем. Устройство получает рекламные баннеры из сети. Что будет, если мы находимся в месте, где связи нет? Или какие-то перебои у Apple c сервером рекламы? Тогда наше ADBannerView будет пустовать. Мало того что это не красиво, так еще и занимает место нашего приложения зазря. Apple настоятельно советует применять, как они это называют, «идеальную реализацию» — когда в отсутствии рекламы по каким-то причинам баннер убирается с экрана приложения, а при восстановлении связи и получении рекламного объявления — снова оказывается на экране. Мы не зря приписали ADBannerViewDelegate в описании нашего класса, и теперь он может принимать сообщения от баннера. В случае успешного принятия рекламного объявления баннер пошлет нам сообщение bannerViewDidLoadAd, а в случае каких-то проблем с этим — сообщение didFailToReceiveAdWithError. Мы сейчас же реализуем, требуемые для этого методы в нашем приложении.
Запускаем
![image](https://habrastorage.org/r/w1560/getpro/geektimes/post_images/327/865/b9f/327865b9fac9091eae3dd05c9fae637a.png)
Кликаем на баннер
![image](https://habrastorage.org/r/w1560/getpro/geektimes/post_images/a6c/498/652/a6c4986523850f2f92c016e655e205ed.png)
Вот мы и реализовали все правильно, как и просят нас товарищи из Apple. Если мы сейчас запустим приложение то увидим что баннер есть, он показывает тестовое объявление, и если мы по нему кликнем — то откроется большая тестовая реклама. Но есть одна проблема. Хорошо мне, что у меня тестовое приложение, которое ничего вообще не делает, кроме как показывает баннер. А у вас, наверное, и игры и музыкальные проигрыватели, и другие интерактивные приложения. Если вы сделаете тоже что и я, то заметите, что ваше приложение продолжит играть музыку или видео во время показа рекламы и получается кавардак. А если у вас игра и надо срочно отреагировать на событие — то пользователи вообще будут шарахаться от рекламы в вашем приложении. Для того чтобы решить эти вопросы мы реализуем у себя в приложении методы bannerViewActionShouldBegin, когда большое рекламное объявление начинает разворачиваться и bannerViewActionDidFinish, когда сворачивается.
Отдельно остановимся на BOOL shouldExecuteAction. Я указал — YES. Вы тоже должны стараться как можно чаще говорить ДА своему ADBannerView. Тем самым вы разрешаете ему после клика развернуться во весь экран. Если у вас идет какой-то важный процесс в приложении, и вы не хотите разрешать прерывать этот процесс, то вы можете ответить на это сообщение — NO и реклама не откроется. Однако Apple очень сильно просит нас или не делать этого вообще или делать только в экстренных случаях. Сами подумайте — баннер есть — пользователь по нему кликает — а рекламы нет. Непорядок! Как сказал менеджер направления iAd на WWDC: «Вы можете ответить NO, но я даже не представляю, что это должна быть за ситуация».
Все что нам осталось из «рюшечек» еще сделать — это изменения баннера в зависимости от ориентации телефона. Если вы помните, при инициализации мы указывали запрашиваемые баннеры только для портретной ориентации. Поэтому эту строчку сейчас нам надо поправить
и вот так у нас будет выглядеть следующие методы
Результат после разворота симулятора:
![image](https://habrastorage.org/r/w1560/getpro/geektimes/post_images/d7e/53c/495/d7e53c495568c791b02d76484cecf240.png)
То есть при изменении ориентации телефона мы меняем свойство currentContentSizeIdentifier нашего ADBannerView. Вот теперь мы можем смотреть рекламные баннеры в нашем приложении и в альбомной ориентации. На скриншоте «в альбоме» получилось не очень красиво из-за сдвижки на 50 пикселей баннера — но это уже вы поправите сами.
Еще о паре мелочей, о которых говорилось на WWDC. Инженеры Apple настоятельно просят вас перед освобождением объекта ADBannerView писать строчку объект.delegate=nil; Очень-очень просят. В нашем конкретном примере это будет выглядеть:
Мы закончили с программной частью. Мы сделали баннер, заставили его работать в двух ориентациях, научились обрабатывать события и ошибки этого баннера.
Теперь кратко насчет оплаты — для получения денег за отражение рекламы из сети iAd Network — вам потребует еще один контракт с Apple, который вы можете стандартно создать через портал разработчика. В процессе настройки вашего приложения на портале вы ответите на вопросы: «Является ли целевая аудитория вашего приложения младше 17 лет?» и настроите слова и URL-исключения — рекламу с какими словами вы бы не хотели показывать. Например, вы бы не желали видеть ваших конкурентов в своем приложении. Ну а дальше — ждете прихода вашего чека с деньгами.
Работа iAd, как ожидается, начнется 1 июля — так что закатывайте рукава и дописывайте приложения – время еще есть. Пока на форуме разработчиков есть информация, что тестовые объявления появляются нестабильно. Действительно, пока я сегодня писал статью, объявления то появлялись при запуске приложения, то не появлялись. Но во всем есть свои прелести — зато я и протестировал метод появления баннера, когда реклама наконец была получено из сети.
Основная идея iAd – соединение интерактивности, которую дает использование смартфона или планшета, с эмоциональностью рекламного объявления, в котором задействованы и аудио, и видео. Для этих целей при создании рекламы используются Java Script, HTML5, CSS3 и мультитач. Все это позволяет создавать интересные и привлекающие внимание рекламные ролики-приложения. Примеры таких реклам мы могли видеть на презентации новой операционной системы (на английском языке).
Основной проблемой мобильной рекламы сегодня, по мнению Apple, является то, что кликая по рекламному баннеру, пользователь покидает приложение – переходя, чаще всего, на сайт рекламодателя. С помощью iAd мы можем обойти эту неприятность. После клика по баннеру рекламное объявление появляется поверх вашего приложения. Пользователь может в любой момент закрыть его и вернуться в ваше приложение точно в тот момент, в котором он его покинул.
На основе iAd Programming Guide и видео с WWDC 2010 я набросал краткий обзор-перевод этой новой технологии. Речь пойдет не о создании самих красочных рекламок, а именно о размещении таковых в ваших приложениях.
Первое, что надо сделать, чтобы поместить рекламу в вашем приложении – это добавить к вашему проекту в Xcode - iAd.framework. Она содержится в iOS 4 SDK. Ну и не забыть добавить #import <iAd/iAD.h> куда надо. Разработчикам предлагаются для использования два баннера на выбор — 320 x 50 пикс. для портретнго расположения и 480 х 32 пикс. для альбомного. Основу этого баннер составляет класс ADBannerView, который является подклассом UIView. Поэтому все, что вам надо, это внедрить этот view в вашу иерархию элементов управления интерфейса. Вы можете сделать это и программно, и через Interface Builder — там появился новый UI элемент — Ad BannerView.
![](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg227.imageshack.us%2Fimg227%2F9302%2F20100625112541.png%22)
Apple настоятельно рекомендует располагать баннер сверху или снизу экрана и не располагать его на движущихся частях таких элементов как — ScrollView и TableView– это уменьшает показы (и как следствие ваши деньги), да и пользователю неудобно «ловить» такой баннер.
Давайте просто создадим новый проект в Xcode на основе шаблона View-based Application и добавим в него рекламный баннер. Наше приложение будет называться iAdEx. Изменяем код в iAdExViewController.h
#import <UIKit/UIKit.h>
#import <iAd/iAd.h>
@interface iAdExViewController : UIViewController "<"ADBannerViewDelegate">" //кавычки пришлось поставить, иначе Хабр съедал ADBannerViewDelegate
{
ADBannerView *adView;
BOOL bannerIsVisible;
}
@property (nonatomic,assign) BOOL bannerIsVisible;
@end
а в iAdExViewController.m изменяем метод viewDidLoad
- (void)viewDidLoad {
adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
adView.frame = CGRectOffset(adView.frame, 0, -50);
adView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifier320x50];
adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50;
[self.view addSubview:adView];
adView.delegate=self;
self.bannerIsVisible=NO;
[super viewDidLoad];
}
Остановимся чуть-чуть подробнее на свойствах requiredContentSizeIdentifiers и currentContentSizeIdentifier.
В первом свойстве вы указываете все виды баннеров, которые вы собираетесь использовать в своем приложении. А второе свойство — какой тип баннера вы будете использовать в данный конкретный момент. Так как я пока пишу самое простое приложение, то продолжим с одним размером баннера и портретной ориентацией, а ниже я сделаю так, чтобы баннер менялся в зависимости от ориентации телефона.
Давайте остановимся на секунду и порассуждаем. Устройство получает рекламные баннеры из сети. Что будет, если мы находимся в месте, где связи нет? Или какие-то перебои у Apple c сервером рекламы? Тогда наше ADBannerView будет пустовать. Мало того что это не красиво, так еще и занимает место нашего приложения зазря. Apple настоятельно советует применять, как они это называют, «идеальную реализацию» — когда в отсутствии рекламы по каким-то причинам баннер убирается с экрана приложения, а при восстановлении связи и получении рекламного объявления — снова оказывается на экране. Мы не зря приписали ADBannerViewDelegate в описании нашего класса, и теперь он может принимать сообщения от баннера. В случае успешного принятия рекламного объявления баннер пошлет нам сообщение bannerViewDidLoadAd, а в случае каких-то проблем с этим — сообщение didFailToReceiveAdWithError. Мы сейчас же реализуем, требуемые для этого методы в нашем приложении.
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
if (!self.bannerIsVisible)
{
[UIView beginAnimations:@"animateAdBannerOn" context:NULL];
// баннер сейчас не виден и сдвинут за экран на 50 пикселей
banner.frame = CGRectOffset(banner.frame, 0, 50);
[UIView commitAnimations];
self.bannerIsVisible = YES;
}
}
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
if (self.bannerIsVisible)
{
[UIView beginAnimations:@"animateAdBannerOff" context:NULL];
// баннер сейчас виден, и мы его убираем, так как что-то не заладилось со связью
banner.frame = CGRectOffset(banner.frame, 0, -50);
[UIView commitAnimations];
self.bannerIsVisible = NO;
}
}
Запускаем
![image](https://habrastorage.org/getpro/geektimes/post_images/327/865/b9f/327865b9fac9091eae3dd05c9fae637a.png)
Кликаем на баннер
![image](https://habrastorage.org/getpro/geektimes/post_images/a6c/498/652/a6c4986523850f2f92c016e655e205ed.png)
Вот мы и реализовали все правильно, как и просят нас товарищи из Apple. Если мы сейчас запустим приложение то увидим что баннер есть, он показывает тестовое объявление, и если мы по нему кликнем — то откроется большая тестовая реклама. Но есть одна проблема. Хорошо мне, что у меня тестовое приложение, которое ничего вообще не делает, кроме как показывает баннер. А у вас, наверное, и игры и музыкальные проигрыватели, и другие интерактивные приложения. Если вы сделаете тоже что и я, то заметите, что ваше приложение продолжит играть музыку или видео во время показа рекламы и получается кавардак. А если у вас игра и надо срочно отреагировать на событие — то пользователи вообще будут шарахаться от рекламы в вашем приложении. Для того чтобы решить эти вопросы мы реализуем у себя в приложении методы bannerViewActionShouldBegin, когда большое рекламное объявление начинает разворачиваться и bannerViewActionDidFinish, когда сворачивается.
- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
NSLog(@"Banner view is beginning an ad action");
BOOL shouldExecuteAction = YES; // будете ли вы отвечать на это сообщение баннеру
if (!willLeave && shouldExecuteAction)
{
// останавливаем в нашем приложении всю интерактивность
// [video pause];
// [audio pause];
}
return shouldExecuteAction;
}
- (void)bannerViewActionDidFinish:(ADBannerView *)banner
{
// возобновите здесь все, что вы остановили
// [video resume];
// [audio resume];
// итд итп
}
Отдельно остановимся на BOOL shouldExecuteAction. Я указал — YES. Вы тоже должны стараться как можно чаще говорить ДА своему ADBannerView. Тем самым вы разрешаете ему после клика развернуться во весь экран. Если у вас идет какой-то важный процесс в приложении, и вы не хотите разрешать прерывать этот процесс, то вы можете ответить на это сообщение — NO и реклама не откроется. Однако Apple очень сильно просит нас или не делать этого вообще или делать только в экстренных случаях. Сами подумайте — баннер есть — пользователь по нему кликает — а рекламы нет. Непорядок! Как сказал менеджер направления iAd на WWDC: «Вы можете ответить NO, но я даже не представляю, что это должна быть за ситуация».
Все что нам осталось из «рюшечек» еще сделать — это изменения баннера в зависимости от ориентации телефона. Если вы помните, при инициализации мы указывали запрашиваемые баннеры только для портретной ориентации. Поэтому эту строчку сейчас нам надо поправить
- (void)viewDidLoad {
...
adView.requiredContentSizeIdentifiers = [NSSet setWithObjects:ADBannerContentSizeIdentifier320x50,ADBannerContentSizeIdentifier480x32,nil];
...
}
и вот так у нас будет выглядеть следующие методы
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait|UIInterfaceOrientationPortrait);
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation))
adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier480x32;
else
adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50;
}
Результат после разворота симулятора:
![image](https://habrastorage.org/getpro/geektimes/post_images/d7e/53c/495/d7e53c495568c791b02d76484cecf240.png)
То есть при изменении ориентации телефона мы меняем свойство currentContentSizeIdentifier нашего ADBannerView. Вот теперь мы можем смотреть рекламные баннеры в нашем приложении и в альбомной ориентации. На скриншоте «в альбоме» получилось не очень красиво из-за сдвижки на 50 пикселей баннера — но это уже вы поправите сами.
Еще о паре мелочей, о которых говорилось на WWDC. Инженеры Apple настоятельно просят вас перед освобождением объекта ADBannerView писать строчку объект.delegate=nil; Очень-очень просят. В нашем конкретном примере это будет выглядеть:
- (void)dealloc {
adView.delegate=nil;
[adView release];
[super dealloc];
}
Мы закончили с программной частью. Мы сделали баннер, заставили его работать в двух ориентациях, научились обрабатывать события и ошибки этого баннера.
Теперь кратко насчет оплаты — для получения денег за отражение рекламы из сети iAd Network — вам потребует еще один контракт с Apple, который вы можете стандартно создать через портал разработчика. В процессе настройки вашего приложения на портале вы ответите на вопросы: «Является ли целевая аудитория вашего приложения младше 17 лет?» и настроите слова и URL-исключения — рекламу с какими словами вы бы не хотели показывать. Например, вы бы не желали видеть ваших конкурентов в своем приложении. Ну а дальше — ждете прихода вашего чека с деньгами.
Работа iAd, как ожидается, начнется 1 июля — так что закатывайте рукава и дописывайте приложения – время еще есть. Пока на форуме разработчиков есть информация, что тестовые объявления появляются нестабильно. Действительно, пока я сегодня писал статью, объявления то появлялись при запуске приложения, то не появлялись. Но во всем есть свои прелести — зато я и протестировал метод появления баннера, когда реклама наконец была получено из сети.