美文网首页
Admob 弹窗广告点击右上角关闭按钮无法关闭的解决办法(iOS

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

作者: 七维树 | 来源:发表于2020-11-30 17:35 被阅读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];
    }
    

    相关文章

      网友评论

          本文标题:Admob 弹窗广告点击右上角关闭按钮无法关闭的解决办法(iOS

          本文链接:https://www.haomeiwen.com/subject/mkfdwktx.html