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

2020-11-30  本文已影响0人  七维树

Admob 7.68/7.66 有时候会有这个问题,其他版本没测,我有一个数独App遇到这个问题了,另外一个扫雷App居然没有这个问题,代码查了几遍也没发现有什么不同的,还把App的setting都调到一样,也没解决,无奈只能用笨办法先解决一下了。

=======2021.4月更新=======

测试的机型和系统版本

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];
}
上一篇下一篇

猜你喜欢

热点阅读