Путаница с ADBannerView (iOS 8)

Я искал, искал, искал и искал разъяснения о том, как это сделать, но я до сих пор не знаю, как это сделать правильно.

Мои затруднения и то, что я хочу, чтобы мой результат был:

У меня есть ADBannerView, добавленный в мою раскадровку, и имя переменной, в которой я ее реализую, — bannerView. Я делаю возможность отключить рекламу в игре. Если реклама отключена, то реклама даже не должна загружаться. Если я прав, то метод делегата bannerViewWillLoadWithAd: не должен вызываться, как и метод bannerViewDidLoadAd:. Я использую этот код, заключенный в оператор «if», чтобы удалить ADBannerView из контроллера представления:

[bannerView removeFromSuperview];
[self setCanDisplayBannerAds:NO];

И тогда мои методы делегата выглядят так (мой делегат — это моя игровая сцена, а на контроллер представления ссылается свойство указанной сцены viewController1):

-(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave {
    NSLog(@"banner view action will begin.");
    self.paused = YES;
    return YES;
}

-(void)bannerViewDidLoadAd:(ADBannerView *)banner {
    NSLog(@"Ad loaded.");
}

-(void)bannerViewWillLoadAd:(ADBannerView *)banner {
    NSLog(@"Ad Banner will load ad.");
    if (// ads are disabled) {
        viewController1.canDisplayBannerAds = NO;
        [banner removeFromSuperview]; 
        NSLog(@"Banner shouldn't load");
    }
}

-(void)bannerViewActionDidFinish:(ADBannerView *)banner{
    NSLog(@"Ad Banner action did finish");
    self.paused = NO;
}

-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {
    NSLog(@"Ad banner view failed to load. Details about the error: %@", error.debugDescription);
    banner.hidden = YES;
}

Код работает, но в итоге я получаю ошибки и странные события в журналах, которые обычно включают «сеанс службы завершен», когда реклама должна отображаться, и загрузка рекламы, когда она не должна показываться. Есть идеи, как это исправить?


person DDPWNAGE    schedule 12.06.2015    source источник


Ответы (1)


Во-первых, вы используете [self setCanDisplayBannerAds:YES] в дополнение к созданию собственного ADBannerView. Вам нужно использовать и то, и другое. [self setCanDisplayBannerAds:YES] на самом деле создает для вас ADBannerView в дополнение к тому, который вы создаете.

Чтобы удалить рекламу, вам не нужно ждать, пока загрузится реклама, чтобы скрыть ее. Вы должны проверить один раз при запуске вашего приложения, а затем разобраться с ним. Если вы решите использовать setCanDisplayBannerAds, это довольно просто:

-(void)viewDidLoad {
    [super viewDidLoad];
    if (disableAds) {
        self.canDisplayBannerAds = NO;
    }
}

Если вы решите использовать собственную реализацию ADBannerView, ваш код может выглядеть примерно так:

-(void)viewDidLoad {
    [super viewDidLoad];
    if (disableAds) {
        banner.hidden = YES;
        banner.delegate = nil;
    }
}
person Daniel Storm    schedule 12.06.2015
comment
Я никогда не устанавливал canDisplayBannerAds в YES. Однако я могу удалить, где он устанавливает canDisplayBannerAds в NO. - person DDPWNAGE; 12.06.2015
comment
Извините @DDPWNAGE, я предполагал, что вы устанавливаете canDisplayBannerAds, поскольку вы показали, что устанавливаете его на NO. Нет необходимости устанавливать его на NO, если вы не устанавливаете его на YES. Просто удалите canDisplayBannerAds и следуйте второму приведенному мной примеру. - person Daniel Storm; 13.06.2015
comment
Я буду, когда у меня будет шанс. Я не знал, что canDisplayBannerAds сделает второй вид баннера внизу экрана. Как можно получить свойства представления этого баннера (например, делегат, фрейм и т. д.)? - person DDPWNAGE; 13.06.2015
comment
@DDPWNAGE по моему опыту, это невозможно. Вы можете проверить свой view, чтобы увидеть, содержит ли он ADBannerView или нет, и ответить соответствующим образом, но если вы хотите полный и простой контроль, реализуйте свой собственный ADBannerView, как вы уже сделали. - person Daniel Storm; 13.06.2015
comment
хорошо. Мне было любопытно об этом. Мне странно создавать представление баннера без объекта-делегата. Я собираюсь реализовать свой собственный вид баннера. - person DDPWNAGE; 13.06.2015