Это проблема, когда iAd может быть скрыт?
Я добавил ADBannerView в представление, и когда я загружаю приложение, я получаю следующее сообщение:
ADBannerView: ПРЕДУПРЕЖДЕНИЕ. В представлении баннера (0x7a023c0) есть объявление, но может быть скрыто. Это сообщение печатается только один раз для каждого вида баннера.
Насколько я вижу, весь баннер виден на экране. Это действительно проблема? Или это только предупреждение, которое я могу игнорировать?
Ответы
Ответ 1
Как говорит Стивен Дарлингтон, неплохо понять, в чем проблема. Легкий способ проверить это в коде (с контроллера вида):
// bring your bannerView to the front
[self.view bringSubviewToFront:bannerView];
// and make sure it positioned onscreen.
bannerView.frame = CGRectMake(0.0, 0.0, bannerView.frame.size.width, bannerView.frame.size.height);
Предполагая, что у вас есть iVar/IBOutlet для вашего AdBannerView, называемого bannerView, это позаботится о любых проблемах с компоновщиком компоновщика, и убедитесь, что bannerView не был охвачен чем-либо.
Из моего опыта ничего плохого не происходит, если объявление вне экрана, однако iAd не будет загружать новые объявления, пока он не узнает, что он полностью на экране. Итак, когда вы запускаете свое приложение,
-
Ваш AdBannerView попытается загрузить рекламу, будь то на экране или нет.
-
В зависимости от того, успешно ли он или нет, ваш AdBannerViewDelegate получит либо
a) bannerViewDidLoadAd: (перейдите к шагу 3) или
b) bannerView: didFailToReceiveAdWithError: (AdBannerView попытается выполнить самостоятельно)
-
В этот момент мяч находится в вашем суде относительно того, что делать с указанным баннером, если на самом деле он загрузил объявление. Простой способ проверить это в коде - это вашBannerView.bannerLoaded, который вернет YES, если у него есть объявление, или НЕТ, если это не так. И так...
-
Как вы обрабатываете AdBannerView после того, как он успешно загрузил свое начальное объявление, определяет, как он будет себя вести в будущем. Вам не нужно сразу размещать его на экране - выберите время, которое имеет смысл в вашем приложении. Тем не менее, представление баннера, которое успешно загрузило объявление, НЕ будет пытаться загрузить другой, пока оно не появится на экране. (Имеет смысл, правда?) Трудная часть...
4b), вы также не получите никаких новых сообщений делегата из этого баннерного представления, поэтому, если вы не перемещаете баннерное изображение на экране сразу после получения сообщения делегата bannerViewDidLoadAd, вам придется реализовать какую-то структуру управления на своем когда вам вообще нужно будет переместить его на экран, после чего он начнет запрашивать у рекламного сервера больше объявлений, и вы получите больше сообщений делегатов, и цикл начнется заново.
Итак, подведем итог: это только проблема, если ваш iAd скрыт, если вы хотите больше обслуживать iAds и получать деньги. Тем не менее, эффективная цена за тысячу показов была очень-очень низкой в последнее время, поэтому, возможно, это не такая проблема в конце концов;)
Ответ 2
Чтобы добавить к этому обсуждению, я получил это сообщение, когда я изменил свойство center
, чтобы переместить объявление за пределы экрана. Я использую анимацию UIView для перемещения объявления на экран.
После некоторых экспериментов я понял, как это сделать, не вызывая появления сообщения. Хитрость заключалась в том, чтобы скрыть, чтобы присвоить свойству adBannerView.hidden
значение YES, ожидая загрузки объявления. Как только он был загружен, мне просто нужно было убедиться, что для скрытого свойства установлено только NO после:
-(void) fadeAdIn:(UIView*)view
{
float offsetY = view.frame.size.height * (bannerOnBottom ? 1 : -1);
CGPoint pos = [self getBannerPosition];
view.center = CGPointMake(pos.x, pos.y + offsetY);
[UIView beginAnimations:@"AdIn" context:nil];
[UIView setAnimationDuration:1.0];
view.center = pos;
[UIView commitAnimations];
// must unhide AFTER animation has been committed to prevent "ad obstructed"
view.hidden = NO;
}
Ответ 3
Подобно предупреждениям компилятора, я думаю, что это то, что вы, вероятно, должны попытаться разобраться, даже если это не сразу вызывает проблемы. Если бы я был Apple, я бы отправил свои объявления в приложения, которые на самом деле показывают их (я не говорю, что они это делают), так что может быть и финансовый аспект.
Несколько проблем, которые я видел:
- Кадр iAd немного выключен, возможно, с экрана всего на пиксель или два.
- Вы случайно создали два iAds и один на экране, а другой скрыт за первым
Ответ 4
У меня такая же проблема, но причина в том, что у меня есть панели уведомлений OpenFeint поверх этого, например. высокие баллы, достижение разблокировано и т.д. Он скользит, а затем скользит, не останавливается надолго, поэтому я не думаю, что это проблема.
Я поставил ADS сверху, тогда пользователь не увидит уведомления OpenFeint, это будет еще одна проблема, я не знаю, если это произойдет, если у вас есть ADS и OpenFeint в разных местах экрана, я не пробовал это как на моем нижнем экране приложения полно кнопок, поэтому доступен только верхний экран.
Ответ 5
Другой вариант - прослушивать события изменения размера строки состояния и перемещать iAd, когда это происходит, чтобы оно не было перенесено за кадром (в результате этого предупреждения и без рекламы).
В своем делете приложения нажмите эту функцию:
- (void) приложение: (приложение UIApplication *) willChangeStatusBarFrame: (CGRect) newStatusBarFrame
// Проверяем newStatusBarFrame.size.height и анимируем ваш iAd-фрейм соответственно вверх или вниз.
Ответ 6
Я получаю это сообщение, когда добавляю ADBannerView в UIScrollView. В этом случае объявление может быть закрыто.
Ответ 7
Ответ от LearnCocos2D был для меня решением. Не уверен, что это особая проблема с Cocos2D (которую я использую). Моя проблема заключалась в том, что я использовал анимацию "нового" стиля с использованием блоков, которые Apple рекомендует использовать, animateWithDuration: delay: options: animations: completion: Когда я их использую, я получаю скрытое предупреждение. Я предполагаю, что проблема заключается в том, что представление частично скрыто во время анимации, поэтому предупреждение, но вы не можете сделать его полностью видимым, прежде чем сделать анимацию, очевидно, если вы просто не захотите выскочить на экран, что является уродливым.
Это нормально, потому что возврат к анимации стиля "старого" с использованием beginAnimations: и commitAnimations: устранил предупреждения для меня. Мне интересно, если это предупреждение означает, что вы фактически упускаете доход от рекламы или это просто раздражает, но на самом деле не проблема.
Ответ 8
У меня был код вроде этого:
if (animate)
{
[UIView animateWithDuration:0.5 animations:^{
self.adBannerView.frame = adBannerFrame;
self.otherViewFrame.frame = otherViewFrame;
}
];
}
else
{
self.adBannerView.frame = adBannerFrame;
self.otherViewFrame.frame = otherViewFrame;
}
и после некоторых экспериментов я обнаружил, что порядок инициализаций должен быть отменен как в случае, так и в ногах.
self.otherViewFrame.frame = otherViewFrame;
self.adBannerView.frame = adBannerFrame;
Таким образом, идея заключалась не в том, чтобы другое представление охватывало AdBannerView даже на несколько микросекунд.