iOS Swift应用关闭Facebook插屏广告后屏幕变黑问题求助
排查Facebook插屏广告关闭后黑屏的几个方向
我之前在集成Facebook Audience Network插屏广告时也碰到过类似的诡异黑屏问题,结合踩过的坑和Swift视图控制器的常见问题,给你几个具体的排查点:
检查广告代理回调的视图层级处理
重点看interstitialAdDidClose(_:)这个回调,有没有不小心执行了错误的视图操作:- 比如误调用了
self.dismiss(animated: true)但当前VC并不是被present出来的,导致导航栈混乱; - 或者有没有在回调里错误移除了当前VC的view;
另外一定要确保广告对象是弱引用,比如在VC里声明:
weak var interstitialAd: FBInterstitialAd?避免循环引用导致VC无法正常释放,进而引发视图异常。
- 比如误调用了
验证VC生命周期的异常触发
关闭广告后,给当前VC的viewWillAppear、viewDidAppear、viewDidDisappear加打印日志,看看这些方法是不是被异常调用:- 如果VC的
viewDidLoad被重复触发,说明VC被意外销毁又重建了,这时候要检查是不是广告的强引用导致了VC的生命周期混乱; - 另外看看黑屏时,VC的view是否真的存在,可以在回调里打印
self.view.superview确认。
- 如果VC的
排查SDK版本兼容性
对比你之前成功集成的APP使用的Facebook SDK版本,有时候新版本SDK的回调逻辑会有变化:- 比如旧版本关闭广告后会自动恢复原视图层级,但新版本需要手动处理;
可以试试降级到之前成功的SDK版本,或者更新到最新稳定版,排除版本适配问题。
- 比如旧版本关闭广告后会自动恢复原视图层级,但新版本需要手动处理;
检查窗口层级是否被干扰
插屏广告是加载在keyWindow上的,关闭广告后,可以在回调里打印:print(UIApplication.shared.keyWindow?.rootViewController)确认根控制器是否正确指向你的导航栈或当前VC。如果有其他第三方弹窗、路由库在修改窗口层级,可能会导致广告关闭后窗口没有正确恢复。
测试动画冲突的可能性
有时候广告关闭的动画和VC的显示动画会产生冲突,导致视觉上的黑屏错觉:- 可以在
interstitialAdDidClose回调里手动触发视图刷新:self.view.setNeedsLayout() self.view.layoutIfNeeded() - 或者尝试禁用广告关闭的动画(如果SDK支持的话),看看是否还会出现黑屏。
- 可以在
内容的提问来源于stack exchange,提问作者chnski
相关产品推荐
相关产品推荐

