iOS 11 弹出框不显示解决方案

问题
项目中很多地方使用了 window 的 rootViewController 去模态弹出框.
升级到 iOS11 后, 经常出现弹出框显示不出来的问题.
/**
获取最上层window
@return window
*/
+ (UIWindow *)lastWindow {
NSArray *windows = [UIApplication sharedApplication].windows;
for(UIWindow *window in [windows reverseObjectEnumerator]) {
if ([window isKindOfClass:[UIWindow class]] &&
CGRectEqualToRect(window.bounds, [UIScreen mainScreen].bounds))
return window;
}
return [UIApplication sharedApplication].keyWindow;
}
分析
通过 Reveal 查看层级结构发现 iOS11 系统下多了一个 window, 而且这个window 的 hidden = YES
iOS10 系统下window层级

iOS11 系统下window层级

隐藏的
window—–>_UIInteractiveHighlightEffectWindow

解决
优化获取最上层window方法, 过滤隐藏状态的 window
/**
获取最上层window
@return window
*/
+ (UIWindow *)lastWindow {
NSArray *windows = [UIApplication sharedApplication].windows;
for(UIWindow *window in [windows reverseObjectEnumerator]) {
if ([window isKindOfClass:[UIWindow class]] && !window.hidden &&
CGRectEqualToRect(window.bounds, [UIScreen mainScreen].bounds))
return window;
}
return [UIApplication sharedApplication].keyWindow;
}