// // AppDelegate.m // YUMI // // Created by admin on 2023/3/9. // #import "AppDelegate.h" #import #import #import #import "TabbarViewController.h" #import "BaseNavigationController.h" #import "AppDelegate+ThirdConfig.h" #import #import #import "ClientConfig.h" #import #import #import "LoginViewController.h" #import "AccountModel.h" #import "YuMi-swift.h" #import "SessionViewController.h" #import "LoginFullInfoViewController.h" #import "UIView+VAP.h" #import "SocialShareManager.h" UIKIT_EXTERN NSString * const kOpenRoomNotification; @interface AppDelegate () @end @implementation AppDelegate //日志接口 void qg_VAP_Logger_handler(VAPLogLevel level, const char* file, int line, const char* func, NSString *module, NSString *format, ...) { // 屏蔽 MP4 播放 log return; // if (format.UTF8String == nil) { // NSLog(@"log包含非utf-8字符"); // return; // } // if (level > VAPLogLevelDebug) { // va_list argList; // va_start(argList, format); // NSString* message = [[NSString alloc] initWithFormat:format arguments:argList]; // file = [NSString stringWithUTF8String:file].lastPathComponent.UTF8String; // NSLog(@"<%@> %s(%@):%s [%@] - %@",@(level), file, @(line), func, module, message); // va_end(argList); // } } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIStoryboard *launchStoryboard = [UIStoryboard storyboardWithName:@"Launch Screen" bundle:nil]; UIViewController *launchScreenVC = [launchStoryboard instantiateInitialViewController]; self.window.rootViewController = launchScreenVC; [self.window makeKeyAndVisible]; [VAPView registerHWDLog:qg_VAP_Logger_handler]; ///初始化一些 sdk配置 [self initThirdConfig]; [self initUM:application launchOptions:launchOptions]; @kWeakify(self); [[ClientConfig shareConfig] clientConfig:^{ @kStrongify(self); dispatch_async(dispatch_get_main_queue(), ^{ [self loadMainPage]; [self setupLaunchADView]; }); }]; if (@available(iOS 15, *)) { [[UITableView appearance] setSectionHeaderTopPadding:0]; } return YES; } // 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 } - (void)initUM:(UIApplication *)application launchOptions:(NSDictionary *)launchOptions { // 只有同意过了隐私协议 才初始化 if ([[NSUserDefaults standardUserDefaults] objectForKey:@"kYouMinumbernnagna"]) { ///初始化友盟 [UMConfigure initWithAppkey:@"6434c6dfd64e686139618269" channel:@"appstore"]; } [MobLink setDelegate:self]; } - (void)loadMainPage { AccountModel *accountModel = [[AccountInfoStorage instance] getCurrentAccountInfo]; if (accountModel == nil || accountModel.uid == nil || accountModel.access_token == nil) { [self toLoginPage]; }else{ [self toHomeTabbarPage]; } [[ClientConfig shareConfig] clientInit]; } - (void)toLoginPage { // 使用新的 Swift 登录页面 EPLoginViewController *lvc = [[EPLoginViewController alloc] init]; BaseNavigationController *navigationController = [[BaseNavigationController alloc] initWithRootViewController:lvc]; navigationController.modalPresentationStyle = UIModalPresentationFullScreen; self.window.rootViewController = navigationController; // 旧代码保留注释(便于回滚) // LoginViewController *lvc = [[LoginViewController alloc] init]; // BaseNavigationController * navigationController = [[BaseNavigationController alloc] initWithRootViewController:lvc]; // navigationController.modalPresentationStyle = UIModalPresentationFullScreen; // self.window.rootViewController = navigationController; } - (void)toHomeTabbarPage { // ========== 白牌版本:使用新的 EPTabBarController ========== EPTabBarController *epTabBar = [EPTabBarController create]; [epTabBar refreshTabBarWithIsLogin:YES]; UIWindow *window = [self getKeyWindow]; if (window) { window.rootViewController = epTabBar; [window makeKeyAndVisible]; } NSLog(@"[AppDelegate] 自动登录后已切换到白牌 TabBar:EPTabBarController"); // ========== 原代码(已注释) ========== /* TabbarViewController *vc = [[TabbarViewController alloc] init]; BaseNavigationController *navigationController = [[BaseNavigationController alloc] initWithRootViewController:vc]; self.window.rootViewController = navigationController; */ } - (void)IMLSDKWillRestoreScene:(MLSDKScene *)scene Restore:(void (^)(BOOL, RestoreStyle))restoreHandler { NSString *inviteCode = scene.params[@"inviteCode"]; if (inviteCode != nil && [[AccountInfoStorage instance]getUid].length == 0){ ClientConfig *config = [ClientConfig shareConfig]; config.inviteCode = inviteCode; } restoreHandler(YES, MLDefault); } - (void)applicationDidEnterBackground:(UIApplication *)application { NSInteger count = [NIMSDK sharedSDK].conversationManager.allUnreadCount; [[UIApplication sharedApplication] setApplicationIconBadgeNumber:count]; } - (void)applicationDidBecomeActive:(UIApplication *)application { [self getAdvertisingTrackingAuthority]; [[NSNotificationCenter defaultCenter]postNotificationName:@"kAppDidBecomeActive" object:nil]; } - (void)getAdvertisingTrackingAuthority { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ if (@available(iOS 14, *)) { ATTrackingManagerAuthorizationStatus status = ATTrackingManager.trackingAuthorizationStatus; switch (status) { case ATTrackingManagerAuthorizationStatusDenied: // NSLog(@"用户拒绝IDFA"); break; case ATTrackingManagerAuthorizationStatusAuthorized: // NSLog(@"用户允许IDFA"); break; case ATTrackingManagerAuthorizationStatusNotDetermined: { // NSLog(@"用户未做选择或未弹窗IDFA"); //请求弹出用户授权框,只会在程序运行是弹框1次,除非卸载app重装,通地图、相机等权限弹框一样 [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { // NSLog(@"app追踪IDFA权限:%lu",(unsigned long)status); }]; } break; default: break; } } }); } - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // 上传devicetoken至云信服务器。 [[NIMSDK sharedSDK] updateApnsToken:deviceToken ]; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ NSString *data = userInfo[@"data"]; if(data){ NSDictionary *dataDic = [data mj_JSONObject]; NSString *userId = dataDic[@"uid"]; if(userId){ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter]postNotificationName:kOpenRoomNotification object:nil userInfo:@{@"type":@"kOpenChat",@"uid":userId,@"isNoAttention":@(YES)}]; ClientConfig *config = [ClientConfig shareConfig]; config.pushChatId = userId; }); return; } } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSString *userId = userInfo[@"uid"]; if(userId){ [[NSNotificationCenter defaultCenter]postNotificationName:kOpenRoomNotification object:nil userInfo:@{@"type":@"kOpenChat",@"uid":userId,@"isNoAttention":@(YES)}]; ClientConfig *config = [ClientConfig shareConfig]; config.pushChatId = userId; } }); } ///URL Scheme跳转 -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{ [[SocialShareManager sharedManager] handleURL:url]; return [GIDSignIn.sharedInstance handleURL:url]; } //- (void)__oldApplicationOpenURLMethod:(NSURL *)url { // NSString *text = [url query]; // if(text.length){ // NSMutableDictionary *paramsDict = [NSMutableDictionary dictionary]; // NSArray *paramArray = [text componentsSeparatedByString:@"&"]; // for (NSString *param in paramArray) { // if (param && param.length) { // NSArray *parArr = [param componentsSeparatedByString:@"="]; // if (parArr.count == 2) { // [paramsDict setObject:parArr[1] forKey:parArr[0]]; // } // } // } // if(paramsDict[@"type"] != nil){ // NSInteger type = [paramsDict[@"type"] integerValue]; // if (type == 2) { // NSString *uid = [NSString stringWithFormat:@"%@",paramsDict[@"uid"]]; // [[NSNotificationCenter defaultCenter]postNotificationName:kOpenRoomNotification object:nil userInfo:@{@"uid":uid}]; // ClientConfig *config = [ClientConfig shareConfig]; // config.roomId = uid; // }else if(type == 7){ // NSString *uid = [NSString stringWithFormat:@"%@",paramsDict[@"uid"]]; // [[NSNotificationCenter defaultCenter]postNotificationName:kOpenRoomNotification object:nil userInfo:@{@"type":@"kOpenChat",@"uid":uid}]; // ClientConfig *config = [ClientConfig shareConfig]; // config.chatId = uid; // }else if (type == 8){ // NSString *inviteCode = paramsDict[@"inviteCode"]; // if (inviteCode != nil && [[AccountInfoStorage instance]getUid].length == 0){ // ClientConfig *config = [ClientConfig shareConfig]; // config.inviteCode = inviteCode; // } // } //// return YES; // } // } //} #pragma mark - Core Data stack @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; -(NSURL *)applicationDocumentsDirectory{ return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; } - (NSManagedObjectModel *)managedObjectModel { // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"_1_______" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } // Create the coordinator and store _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"_1_______.sqlite"]; NSError *error = nil; NSString *failureReason = @"There was an error creating or loading the application's saved data."; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { // Report any error we got. NSMutableDictionary *dict = [NSMutableDictionary dictionary]; dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data"; dict[NSLocalizedFailureReasonErrorKey] = failureReason; dict[NSUnderlyingErrorKey] = error; error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict]; // Replace this with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. // NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; } - (NSManagedObjectContext *)managedObjectContext { // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (!coordinator) { return nil; } _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; return _managedObjectContext; } #pragma mark - Core Data Saving support - (void)saveContext { NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { NSError *error = nil; if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. // NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } } @end