Admob 弹窗广告点击右上角关闭按钮无法关闭的解决办法(iOS)

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];
}

你可能感兴趣的:(Admob 弹窗广告点击右上角关闭按钮无法关闭的解决办法(iOS))