Это проблема, когда iAd может быть скрыт? - PullRequest
15 голосов
/ 12 ноября 2010

Я добавил ADBannerView в представление, и когда я загружаю приложение, я получаю следующее сообщение:

ADBannerView: ВНИМАНИЕ! В представлении баннера (0x7a023c0) есть реклама, но она может быть скрыта. Это сообщение печатается только один раз за просмотр баннера.

Насколько я вижу, весь баннер виден на экране. Это действительно проблема? Или это только предупреждение, которое я могу игнорировать?

Ответы [ 8 ]

22 голосов
/ 28 февраля 2011

Как говорит Стивен Дарлингтон, хорошая идея выяснить, в чем проблема.Простой способ дважды проверить это в коде (из контроллера представления) был бы:

     // bring your bannerView to the front
   [self.view bringSubviewToFront:bannerView];

     // and make sure it's positioned onscreen.
    bannerView.frame = CGRectMake(0.0, 0.0, bannerView.frame.size.width, bannerView.frame.size.height);

Предполагая, что у вас был iVar / IBOutlet для вашего AdBannerView, называемый bannerView, это позаботится о любом позиционировании компоновщика интерфейса.проблем и убедитесь, что bannerView ничем не покрыт.

По моему опыту, ничего плохого не произойдет, если реклама будет за кадром, однако iAd не будет загружать новые объявления, пока не узнает, что они полностью отображаются на экране.Таким образом, при запуске приложения

  1. Ваш AdBannerView попытается загрузить рекламу, независимо от того, отображается она на экране или нет.

  2. В зависимости отнезависимо от того, успешен он или нет, ваш AdBannerViewDelegate получит либо

    a) bannerViewDidLoadAd: (перейдите к шагу 3), либо

    b) bannerView: didFailToReceiveAdWithError: (AdBannerView снова попытается выполнить своеown)

  3. В этот момент мяч находится на вашей площадке в отношении того, что делать с указанным bannerView, если он действительно загружал рекламу.Простой способ проверить это в коде - yourBannerView.bannerLoaded, который вернет YES, если у него есть реклама, или NO, если его нет.И так ...

  4. От того, как вы будете обрабатывать AdBannerView после успешной загрузки исходного объявления, зависит его поведение в будущем.Вам не нужно сразу размещать его на экране - выберите время, которое имеет смысл в вашем приложении.Однако при просмотре баннера, в котором успешно загружено объявление, НЕ будет пытаться загрузить другое, пока оно не появится на экране.(Имеет смысл, не так ли?) Сложность в том, что ....

    4b) вы также не получите никаких новых сообщений делегатов из этого bannerView, так что если вы не перемещаете bannerView на экране сразу после полученияВ сообщении делегата bannerViewDidLoadAd вам нужно будет самостоятельно внедрить некую структуру управления, чтобы обрабатывать ее, если вы вообще переместите ее на экран, и в этот момент он начнет запрашивать у рекламного сервера больше рекламы, и вы 'я получу больше сообщений делегатов, и цикл начнется заново.

Итак, подведем итог: проблема только в том, что ваш iAd скрыт, если вы хотите обслуживать больше iAds и получатьоплачено.Однако, eCPM в последнее время был очень, очень низким, так что, возможно, это не такая проблема в конце концов;)

7 голосов
/ 11 декабря 2011

Чтобы добавить к этому обсуждению, я получил это сообщение, когда я изменил свойство center, чтобы переместить объявление только за пределы экрана.Я использую анимацию UIView, чтобы разместить объявление на экране.

После некоторых экспериментов я понял, как это сделать, не вызывая появления сообщения.Хитрость заключалась в том, чтобы скрыть, чтобы установить для свойства adBannerView.hidden значение YES, ожидая загрузки объявления.Как только он был загружен, мне просто нужно было установить для свойства hidden только NO 100 * * после фиксации анимации:

-(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;
}
2 голосов
/ 15 ноября 2010

Как и предупреждения компилятора, я думаю, что это то, что вы, вероятно, должны попытаться докопаться до сути, даже если это не сразу вызывает проблемы.Если бы я был Apple, я бы отправил свои объявления в приложения, которые действительно показывают их (я не говорю, что они делают делают это), так что может быть и финансовый аспект.

Несколько проблем, с которыми я столкнулся:

  • Кадр iAd слегка отключен, возможно, за один или два пикселя от экрана.
  • Вы случайно создали два iAds иодин на экране, а другой скрыт позади первый
1 голос
/ 12 мая 2012

Ответ от LearnCocos2D был для меня решением. Не уверен, что это специфическая проблема с Cocos2D (который я использую). Моя проблема заключалась в том, что я использовал «новый» стиль анимации с использованием блоков, которые Apple рекомендует использовать, animateWithDuration: delay: options: animations: complete: Когда я их использую, я получаю скрытое предупреждение. Я предполагаю, что проблема в том, что представление частично скрыто во время его анимации, отсюда и предупреждение, но вы не можете сделать его полностью видимым, прежде чем оно будет выполнено, очевидно, если вы просто не хотите выложить его на экран, что уродливо. 1001 *

Это нормально, потому что переключение обратно на "старый" стиль анимации с использованием beginAnimations: и commitAnimations: исключило предупреждения для меня. Мне любопытно, означает ли это предупреждение, что вы фактически упускаете доход от рекламы или это просто раздражает, но на самом деле не является проблемой.

1 голос
/ 29 сентября 2011

Я получаю это сообщение, когда добавляю ADBannerView в UIScrollView.В этом случае реклама может быть скрыта.

1 голос
/ 17 апреля 2011

Другим вариантом является прослушивание событий изменения размера строки состояния и перемещение iAd, когда это происходит, чтобы оно не перестраивалось за пределы экрана (в результате этого предупреждения и не показывались объявления).

В приложении-делегате нажмите на эту функцию:

  • (void) приложение: (UIApplication *) приложение willChangeStatusBarFrame: (CGRect) newStatusBarFrame // Проверяем newStatusBarFrame.size.height и соответственно анимируем кадр iAd вверх или вниз.
1 голос
/ 08 апреля 2011

У меня та же проблема, но причина в том, что у меня есть панель уведомлений OpenFeint, например, высокие баллы, достижения разблокированы и т. Д. Он скользит, а затем выскальзывает, не задерживается надолго, поэтому я недумаю, что это проблема.

Если вы поместите ADS сверху, тогда пользователь не увидит уведомления OpenFeint, это будет еще одна проблема, я не знаю, если это произойдет, если у вас ADS и OpenFeint в разных местахэкрана, я не пробовал, так как нижний экран моего приложения полон кнопок, поэтому доступна только верхняя часть экрана.

0 голосов
/ 10 ноября 2012

У меня был такой код:

if (animate)
{
    [UIView animateWithDuration:0.5 animations:^{
        self.adBannerView.frame = adBannerFrame;
        self.otherViewFrame.frame = otherViewFrame;
        }
     ];
}
else
{
    self.adBannerView.frame = adBannerFrame;
    self.otherViewFrame.frame = otherViewFrame;
}

и после некоторых экспериментов я обнаружил, что порядок инициализаций должен быть обратным как в случае if, так и в сторонах.

    self.otherViewFrame.frame = otherViewFrame;
    self.adBannerView.frame = adBannerFrame;

Поэтому идея не состояла в том, чтобы позволить другому представлению покрывать AdBannerView даже на несколько микросекунд.

...