Admob 弹窗广告点击右上角关闭按钮无法关闭的解决办法(iOS
2020-11-30 本文已影响0人
七维树
Admob 7.68/7.66 有时候会有这个问题,其他版本没测,我有一个数独App遇到这个问题了,另外一个扫雷App居然没有这个问题,代码查了几遍也没发现有什么不同的,还把App的setting都调到一样,也没解决,无奈只能用笨办法先解决一下了。
=======2021.4月更新=======
- 最终还是发现了代码bug,只是一直没时间更新。
- 核心因素 : UIButton的事件被拦截处理了,点击在x按钮没有继续执行造成的问题。
- 如何发现的? 其实之前也检查了 很多遍手势问题,也能感觉到是我的UIButton里面重写了hittest和pointInset方法,但是之前测试仅对自己的写button测试没有发现问题,直到把所有Button分类去除后发现正常了,才确定是UIButton分类出的问题,所以在debug的时候还是要做的彻底一些才能更省时间。
- 解决办法: UIButton如果重写了hitTest:和pointInset方法整个程序都很危险,所以直接去掉了这块的逻辑,采用其他办法实现原来的逻辑,【切忌不要在系统类的分类里面重写父类方法】,很容易出问题,太危险!太危险!太危险!!!
测试的机型和系统版本
iPhone XR iOS 14.2
iPhone 6 iOS 12.4.5 (这个是最难受的,怎么都关闭不了只能杀app在重启)
解决办法思路:
GADInterstatial 弹窗广告右上角有个Button(GADCloseButton),写个UIButton分类从写HitTest函数,如果是GADCloseButton类,且Point在这个Button的Bounds范围里,默认会返回self,这时就不会关闭弹窗了。
有两种办法可以实现关闭(在UIButton的分类的HitTest:方法里添加如下代码)
1.直接返回nil 就可以执行关闭。
//修复谷歌关闭按钮(在右上角时候)关闭不了弹窗的问题
Class gad_close_button_class = NSClassFromString(@"GADCloseButton");
if ([self class] == gad_close_button_class && CGRectContainsPoint(self.bounds, point)) {
return nil;
}
2.可以获取这个button里的target,然后让这个target执行@"closeButtonPressed:"这个方法,也可以实现关闭。
//修复谷歌关闭按钮(在右上角时候)关闭不了弹窗的问题
Class gad_close_button_class = NSClassFromString(@"GADCloseButton");//GADCloseButton是个UIButton,右上角的关闭按钮
if ([self class] == gad_close_button_class && CGRectContainsPoint(self.bounds, point)) {
NSArray *targetActions = [self valueForKey:@"_targetActions"];
id firstObj = targetActions.firstObject;
id obj = [firstObj valueForKey:@"_target"];
SEL sel = NSSelectorFromString(@"closeButtonPressed:");//重点是让target执行这个方法
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
if ([obj respondsToSelector:sel]) {
[obj performSelector:sel withObject:self];
}
#pragma clang diagnostic pop
return nil;
}
3.另外据说iPhone12会出现这个关闭按钮太高了,布局在了statusBar的位置,Google Admob的官方论坛有个Dirty的解决办法,思路就是在弹窗出来时候隐藏StatusBar,好让该位置的手势可以执行(也可以考虑实用上述2个方法解决),代码分享如下:
- (void)interstitialWillPresentScreen:(GADInterstitial *)ad {
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
- (void)interstitialDidFailToPresentScreen:(GADInterstitial *)ad {
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
- (void)interstitialWillDismissScreen:(GADInterstitial *)ad {
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
- (void)interstitialDidDismissScreen:(GADInterstitial *)ad {
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}