首页 广点通 SDK 报错: 开屏广告 rootViewController 已经 presenting
文章
取消

广点通 SDK 报错: 开屏广告 rootViewController 已经 presenting

问题描述

最近有一个应用需要接入 广点通 SDK. 就 SDK 本身接口来说也不多, 结束非常简单, 但是在测试时候发现了 iOS13 系统下, 所有功能一切正常, 但是 iOS12 系统下, 开屏广告不能够正常显示, 并且有以下报错信息:

1
Error Domain=GDTAdErrorDomain Code=4019 "开屏广告 rootViewController 已经 presenting"

解决方法

报错信息看的是一头雾水, 和 Present 有关的话, 再 App 刚刚启动这段时间里一共有 2 个:

  1. 广点通开屏广告的 ViewController.
  2. 检测用户是否有 快捷口令, 提示用户的 UIAlertController.

尝试屏蔽掉 UIAlertController 之后, 开屏广告 能够正常在 iOS12 上面显示了.

此处的解决办法只好再广告展示完成之后再对用户展示提示信息.

原因分析

通过以下一段代码来做一个实验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    __weak typeof(self) ws = self;
    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
        [ws present:[UIColor redColor]];
        [ws present:[UIColor yellowColor]];
    }];
    
}

/// 模态一个视图控制器
/// @param color 控制器视图背景颜色
- (void)present:(UIColor *)color {
    UIViewController *vc = [[UIViewController alloc] init];
    vc.view.backgroundColor = color;
    __weak typeof(vc) wv = vc;
    [self presentViewController:vc animated:YES completion:^{
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [wv dismissViewControllerAnimated:YES completion:nil];
        });
    }];
}

测试对比

  1. 当运行在 iOS12 系统上时候, 有如下警告信息:

    Warning: Attempt to present <UIViewController: 0x10260ad80> on <ViewController: 0x102608870> whose view is not in the window hierarchy!

  2. 当运行在 iOS13 系统上时候, 有如下警告信息:

    Warning: Attempt to present <UIViewController: 0x104e0b640> on <ViewController: 0x104e045c0> which is already presenting <UIViewController: 0x104e09b50>

以上 2 种情况的观测结果是一致的, 都只模态出了 红色 背景的视图控制器, 仅仅是 警告信息不同.

而造成 警告信息不同 这一结果的就是在 iOS13 之后, UIViewControllermodalPresentationStyle 属性的默认值变为了 UIModalPresentationAutomatic(立体感的卡片效果), 在此之前默认值是 UIModalPresentationFullScreen (全屏视图覆盖效果).

当把 modalPresentationStyle 设为 UIModalPresentationFullScreen 之后, iOS13 系统种也会跟 iOS12 报同样的错误, 也就是同样会出现 开屏广告无法正常展示 的问题.

结论

虽然知道了造成 iOS12iOS13 效果不同的原因, 但是并未了解到两种警告的意义在细节上有什么不同.

第一种警告如果是因为发起 PresentController.view 已经不在当前 Window 的层次结构中 (模态起来).

本文由作者按照 CC BY 4.0 进行授权