我收到了Adcolony
工程师的回复:
AdColony
找到UIViewController
应用程序的 key 中显示的可见UIWindow
内容,然后将用于显示广告的模态视图控制器推到顶部。广告完成后,我们SDK
会关闭模态视图控制器,让您的应用保持之前的状态。SDK
如果我们为您的应用程序的最顶层视图控制器获取 nil 值,您将遇到您提到的错误。
我可以告诉你,在过去,如果开发人员使用一个按钮UIAlertView
来触发 AdColony 视频广告,就会出现这个问题。如果是这种情况,并且您正在从 aUIAlertView
或 a触发视频UIActionSheet
,我们强烈建议您在调用播放视频之前确保它们完全关闭。
我想尽快为您解决这个问题。无论如何,您可以向我们发送您的代码的精简版本来重现问题吗?如果这不可能,我建议将以下代码粘贴到您尝试播放视频的位置,并使用调试器找出您在哪里获得 nil 值。
UIWindow* window = [UIApplication sharedApplication].keyWindow;
UIViewController* rootViewController = [window rootViewController];
[self getVisibleViewControllerChild:rootViewController];
这是我们使用的方法getVisibleViewControllerChild
:
- (UIViewController*)getVisibleViewControllerChild:(UIViewController*)viewController {
UIViewController* visibleViewController = nil;
if(!viewController) {
return nil;
}
if ([viewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)viewController;
viewController = navigationController.visibleViewController;
}
while (visibleViewController == nil) {
if (viewController.modalViewController == nil) {
visibleViewController = viewController;
} else {
if ([viewController.modalViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController *navigationController = (UINavigationController *)viewController.modalViewController;
viewController = navigationController.visibleViewController;
} else {
viewController = viewController.modalViewController;
}
}
}
return visibleViewController;
}
希望这可以帮助其他遇到类似问题的人。