Изменение canDisplayBannerAds на NO не обновляет представление для удаления рекламного баннера.

Странный вопрос, и я часами бился головой об эту стену и не смог его решить.

У меня есть приложение только для iOS 7, которое использует раскадровки. На моем основном корневом контроллере представления я отображаю баннер iAd в нижней части представления, используя self.canDisplayBannerAds = YES. Это работает отлично.

У меня есть контроллер просмотра настроек, и оттуда мои пользователи могут совершать покупки в приложении, чтобы навсегда удалить рекламу. Этот функционал тоже работает. Я храню значение BOOL в NSUserDefaults standardUserDefaults, чтобы отслеживать, совершили ли они покупку.

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

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
bool saved = [defaults boolForKey:t_Save];

if (saved == NO) {
    self.canDisplayBannerAds = YES;
} else if (saved == YES) {
    self.canDisplayBannerAds = NO;
}
NSLog(self.canDisplayBannerAds ? @"YES" : @"NO");

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

Что странно, если я создам кнопку, которая просто устанавливает self.canDisplayBannerAds = NO, то это ДЕЙСТВИТЕЛЬНО заставит рекламный баннер исчезнуть. Но он не работает при вызове в viewWillAppear, viewDidAppear или даже в созданном мной специальном методе, который вызывается после совершения покупки.

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

У кого-нибудь есть мысли?


person KyleAlbert95    schedule 18.12.2013    source источник
comment
У меня похожая проблема. После совершения покупки (или восстановления покупки) на контроллере представления, где была совершена покупка (или восстановление), реклама продолжает появляться. ОДНАКО размер представления был изменен до размера без рекламного баннера. Итак, в моем случае прокрутка прокручивается недостаточно. На других контроллерах представления в майском приложении, в которых есть реклама, они корректно отключаются при покупке. Я также заметил, что если объявление в настоящее время не отображается во время покупки, проблема не возникает.   -  person Chris Prince    schedule 01.02.2014


Ответы (2)


У меня была та же проблема, и я нашел обходной путь, который сработал для меня:

self.canDisplayBannerAds = NO;
for (id aView in self.view.subviews) {
  if ([aView isKindOfClass:[ADBannerView class]]) {
     [(ADBannerView *)aView setHidden:YES];
  }
}

Я не думаю, что это чистое решение, но, поскольку оно, наконец, работает, я оставлю его, пока не найду лучшее решение.

person Christian    schedule 02.01.2014
comment
Хм. Теперь, после различных изменений в моем приложении, я обнаружил, что мне не нужен этот обходной путь. Просто установив для self.canDisplayBannerAds значение NO, отображаемый в данный момент рекламный баннер будет анимироваться за пределами экрана соответствующим образом. Раздражает, что я не вижу, что изменилось. - person Chris Prince; 07.02.2014
comment
Кристиан, ты молодец. Наконец-то у меня появилось время протестировать ваше решение, и оно работает. Спасибо! - person KyleAlbert95; 08.02.2014
comment
Я также не мог найти никакого другого решения или объяснения того, почему это происходит. Ваше исправление сработало отлично. Отличный код. - person Rhys Lewis; 01.02.2015

Я бы создал метод в файле реализации (.m), который управляет рекламой, а также включил заголовок метода в .h "- (void) viewWillAppear;"

- (void)viewWillAppear
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
bool saved = [defaults boolForKey:t_Save];

if (saved == NO) {
    self.canDisplayBannerAds = YES;
} else if (saved == YES) {
    self.canDisplayBannerAds = NO;
}
NSLog(self.canDisplayBannerAds ? @"YES" : @"NO");
}

после подтверждения покупки вызовите метод из другого класса,

пример;

AppDelegate *Appdel = [[AppDelegate alloc] init];
[Appdel viewWillAppear];
person LawrencePires    schedule 18.12.2013
comment
Привет, спасибо, но я не уверен, что понимаю ... вы предлагаете мне вызвать метод viewWillAppear из моего представления о покупке? Но проблема не в том, что метод не вызывается — когда я возвращаюсь к исходному представлению, вызывается метод viewWillAppear. Просто рекламный баннер не исчезает. Я не уверен, как ваше предложение что-то изменит. - person KyleAlbert95; 19.12.2013