
问题: - keyWindow 在 iOS 13+ 被废弃 - 使用 kWindow 会产生 deprecation warning - 不支持 multi-scene 应用 修复: - 添加 getKeyWindow 辅助方法 - iOS 13+: 使用 connectedScenes 获取活跃 window - iOS 13-: 使用旧的 keyWindow(suppress warning) - 确保兼容性和 multi-scene 支持 代码改进: - 使用 @available(iOS 13.0, *) 条件编译 - 使用 #pragma clang diagnostic 抑制旧 API 警告 - 遍历所有 scene 找到前台活跃的 window 现在可以在 iOS 13+ 上无警告编译和运行。
150 lines
5.6 KiB
Objective-C
150 lines
5.6 KiB
Objective-C
//
|
||
// PILoginManager.m
|
||
// YuMi
|
||
//
|
||
// Created by duoban on 2023/10/7.
|
||
//
|
||
|
||
#import "PILoginManager.h"
|
||
///api
|
||
#import "Api+Main.h"
|
||
///vc
|
||
#import "LoginFullInfoViewController.h"
|
||
#import "TabbarViewController.h"
|
||
#import "BaseNavigationController.h"
|
||
#import "LoginVerifCodeViewController.h"
|
||
///Model
|
||
#import "ThirdUserInfo.h"
|
||
#import "AccountModel.h"
|
||
#import "UserInfoModel.h"
|
||
#import "XPLoginAuthCodeVC.h"
|
||
///Manager
|
||
#import "TurboModeStateManager.h"
|
||
#import "FirstRechargeManager.h"
|
||
#import "PublicRoomManager.h"
|
||
///Swift
|
||
#import "YuMi-Swift.h" // 引入 Swift 类(NewTabBarController)
|
||
///Tool
|
||
#import "XNDJTDDLoadingTool.h"
|
||
#import "AccountInfoStorage.h"
|
||
|
||
@implementation PILoginManager
|
||
+(void)loginWithVC:(MvpViewController *)VC isLoginPhone:(BOOL)isLoginPhone{
|
||
[XNDJTDDLoadingTool showLoading];
|
||
AccountModel *accountModel = [[AccountInfoStorage instance] getCurrentAccountInfo];
|
||
HomeUserModel *homeUserModel = [HomeUserModel new];
|
||
if (accountModel == nil || accountModel.uid == nil || accountModel.access_token == nil) {
|
||
[XNDJTDDLoadingTool hideOnlyView:VC.view];
|
||
[XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"LoginPresenter1")];
|
||
return;
|
||
}
|
||
__block UserInfoModel *userInfo;
|
||
dispatch_group_t group = dispatch_group_create();
|
||
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
|
||
dispatch_group_enter(group);
|
||
dispatch_async(queue, ^{
|
||
[Api requestTicket:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||
if(code == 200){
|
||
NSArray *tickets = [data.data valueForKey:@"tickets"];
|
||
NSString *ticket = [tickets[0] valueForKey:@"ticket"];
|
||
homeUserModel.ticket = ticket;
|
||
[[AccountInfoStorage instance] saveTicket:ticket];
|
||
|
||
[Api getUserInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||
if(code == 200){
|
||
userInfo = [UserInfoModel modelWithDictionary:data.data];
|
||
[AccountInfoStorage instance].name = userInfo.nick;
|
||
homeUserModel.nick = userInfo.nick;
|
||
homeUserModel.avatar = userInfo.avatar;
|
||
homeUserModel.isBindPhone = userInfo.isBindPhone;
|
||
}
|
||
dispatch_group_leave(group);
|
||
} uid:accountModel.uid];
|
||
return;
|
||
}
|
||
dispatch_group_leave(group);
|
||
} access_token:accountModel.access_token issue_type:@"multi"];
|
||
});
|
||
|
||
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
|
||
[XNDJTDDLoadingTool hideOnlyView:VC.view];
|
||
if ([[AccountInfoStorage instance] getTicket].length <= 0 || userInfo == nil) {
|
||
[XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"LoginPresenter1")];
|
||
return;
|
||
}
|
||
[[AccountInfoStorage instance]saveHomeUserInfo:homeUserModel];
|
||
if (userInfo.nick == nil || userInfo.avatar == nil) {
|
||
LoginFullInfoViewController * FullVC = [[LoginFullInfoViewController alloc] init];
|
||
[VC.navigationController pushViewController:FullVC animated:YES];
|
||
return;
|
||
}
|
||
[XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"PKIDLoginViewController0")];
|
||
|
||
[PILoginManager jumpToHomeVCWithInviteCode:@""];
|
||
});
|
||
|
||
|
||
}
|
||
+(void)jumpToHomeVCWithInviteCode:(NSString *)inviteCode{
|
||
// ========== 白牌版本:使用新的 NewTabBarController ==========
|
||
// 原代码已注释,改用 Swift 实现的 NewTabBarController
|
||
|
||
NewTabBarController *newTabBar = [NewTabBarController new];
|
||
[newTabBar refreshTabBarWithIsLogin:YES];
|
||
|
||
// 设置为根控制器(不需要 NavigationController 包装)
|
||
|
||
[self getKeyWindow].rootViewController = newTabBar;
|
||
|
||
// 登录成功并进入主页后,启动首充监控
|
||
[[FirstRechargeManager sharedManager] startMonitoring];
|
||
|
||
// 初始化公共房间管理器
|
||
[[PublicRoomManager sharedManager] initialize];
|
||
|
||
// 🔧 启动 TurboModeStateManager
|
||
NSString *userId = [[AccountInfoStorage instance] getUid];
|
||
if (userId) {
|
||
[[TurboModeStateManager sharedManager] startupWithCurrentUser:userId];
|
||
}
|
||
|
||
NSLog(@"[PILoginManager] 已切换到白牌 TabBar:NewTabBarController");
|
||
|
||
// ========== 原代码(已注释) ==========
|
||
/*
|
||
TabbarViewController *vc = [[TabbarViewController alloc] init];
|
||
vc.isFormLogin = YES;
|
||
vc.inviteCode = inviteCode;
|
||
BaseNavigationController *bnc = [[BaseNavigationController alloc] initWithRootViewController:vc];
|
||
kWindow.rootViewController = bnc;
|
||
*/
|
||
}
|
||
|
||
#pragma mark - Helper Methods
|
||
|
||
/// 获取 keyWindow(iOS 13+ 兼容)
|
||
+ (UIWindow *)getKeyWindow {
|
||
// iOS 13+ 使用 connectedScenes 获取 window
|
||
if (@available(iOS 13.0, *)) {
|
||
for (UIWindowScene *scene in [UIApplication sharedApplication].connectedScenes) {
|
||
if (scene.activationState == UISceneActivationStateForegroundActive) {
|
||
for (UIWindow *window in scene.windows) {
|
||
if (window.isKeyWindow) {
|
||
return window;
|
||
}
|
||
}
|
||
// 如果没有 keyWindow,返回第一个 window
|
||
return scene.windows.firstObject;
|
||
}
|
||
}
|
||
}
|
||
|
||
// iOS 13 以下,使用旧方法(已废弃但仍然可用)
|
||
#pragma clang diagnostic push
|
||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||
return [UIApplication sharedApplication].keyWindow;
|
||
#pragma clang diagnostic pop
|
||
}
|
||
|
||
@end
|