iOS 集成第三方 SDK 之后在多个 UIWindow 之间切换时碰到的问题

1,556 阅读1分钟

最近在项目中偶尔会碰到无法显示 SVProgressHUD,也无法切换 window.rootViewController 的情况

经过调试后发现,原来是使用第三方 SDK 的时候又创建了一个 UIWindow,导致我的 UIWindow 处于非活跃状态,因此无法显示 keyWindow 和切换 window.rootViewController

我的 UIWindow tag 为 4399,第三方 SDK 的 UIWindow tag 为 0。 打开第三方 SDK 之后的 UIWindow 状态如图:

图一

图二

第三方 SDK 关闭之后,其 UIWindow 的 windowLevel 为 -1,如下图:

图三

解决思路:

  • 调用第三方 SDK 之后,添加一个定时器
  • 每隔一秒判断一下第三方 SDK 的 UIWindow windowLevel,如果小于 0,则使用我的 UIWindow 调用 makeKeyAndVisible
  • 注销定时器

代码:

//添加定时器,监听第三方 SDK 的 UIWindow windowLevel
- (void)addTimer{
    self.fmTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(monitorStatus) userInfo:nil repeats:YES];
}

- (void)monitorStatus{
  
    //当前活跃的 UIWindow 为我的 UIWindow
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    if (window.tag == kAxWindowTag) {//我的 UIWindow 处于活跃状态,无需处理 
        //注销定时器
        [self.fmTimer invalidate];
        return;
    }
    
    //第三方 SDK 的 UIWindow 为 活跃状态
    BOOL isActivity = YES;
    
    // 已使用过第三方 SDK 
    NSArray *windows = [UIApplication sharedApplication].windows;
    for (UIWindow *window2 in windows) {
        
        NSString *classStr = [NSString stringWithFormat:@"%@", [window2 class]];
        if ([classStr isEqualToString:@"UIWindow"]) {
            
            if (window2.tag == 0 && window2.windowLevel < 0) {//第三方 SDK 的 UIWindow 为 非活跃状态
                isActivity = NO;
            }
            
            //当前遍历到 MY UIWindow, 并且第三方 SDK 的 UIWindow 为 非活跃状态
            if (window2.tag == kAxWindowTag && !isActivity) {
                [self.fTimer invalidate];
                [window2 makeKeyAndVisible];
            }
            
        } else {// UIWindow class 为 UITextEffectsWindow
            //NSLog(@"-->> 3 UITextEffectsWindow :%@", [window2 class]);
        }
    }
}