iOS - 集成第三方 SDK 之后在多個 UIWindow 之間切換時碰到的問題

最近在項目中偶爾會碰到無法顯示 SVProgressHUD,也無法切換 window.rootViewController 的情況

經(jīng)過調(diào)試后發(fā)現(xiàn),原來是使用第三方 SDK 的時候又創(chuàng)建了一個 UIWindow,導(dǎo)致我的 UIWindow 處于非活躍狀態(tài),因此無法顯示 keyWindow 和切換 window.rootViewController 。

我的 UIWindow tag 為 4399,第三方 SDK 的 UIWindow tag 為 0。
打開第三方 SDK 之后的 UIWindow 狀態(tài)如圖:

圖一
圖二

第三方 SDK 關(guān)閉之后,其 UIWindow 的 windowLevel 為 -1,如下圖:

圖三

解決思路:

  • 調(diào)用第三方 SDK 之后,添加一個定時器
  • 每隔一秒判斷一下第三方 SDK 的 UIWindow windowLevel,如果小于 0,則使用我的 UIWindow 調(diào)用 makeKeyAndVisible
  • 注銷定時器

代碼:

//添加定時器,監(jiān)聽第三方 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 處于活躍狀態(tài),無需處理 
        //注銷定時器
        [self.fmTimer invalidate];
        return;
    }
    
    //第三方 SDK 的 UIWindow 為 活躍狀態(tài)
    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 為 非活躍狀態(tài)
                isActivity = NO;
            }
            
            //當前遍歷到 MY UIWindow, 并且第三方 SDK 的 UIWindow 為 非活躍狀態(tài)
            if (window2.tag == kAxWindowTag && !isActivity) {
                [self.fTimer invalidate];
                [window2 makeKeyAndVisible];
            }
            
        } else {// UIWindow class 為 UITextEffectsWindow
            //NSLog(@"-->> 3 UITextEffectsWindow :%@", [window2 class]);
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容