AppDelegate.m 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. //
  2. // AppDelegate.m
  3. // MiMoLive
  4. //
  5. // Created by SuperC on 2023/10/7.
  6. //
  7. #import "AppDelegate.h"
  8. #import "MOLoginChooseVC.h"
  9. #import "IQKeyboardManager.h"
  10. #import "POLanguageVC.h"
  11. #import "MOFirstInfoSetVC.h"
  12. #import "MOTopUpVC.h"
  13. #import "MOMineEditInfoVC.h"
  14. #import "MOShowLivePagesVC.h"
  15. #import "MOVipDetailVC.h"
  16. #import "MOGradeCenterVC.h"
  17. #import "MOCreateLiveVC.h"
  18. #import "NSObject+MOLaunchImage.h"
  19. #import "MOShopBaseVC.h"
  20. #import "MOUserHomePageVC.h"
  21. #import "MOGetGiftView.h"
  22. #import "MOWebViewController.h"
  23. #import "MODiaWinVC.h"
  24. #import "MODrawOpenView.h"
  25. #import "MODrawOpenVC.h"
  26. #import "MOWameListVC.h"
  27. #import "MOFanClubListVC.h"//粉丝团
  28. #import "MOBindingEmailVC.h"//绑定邮箱
  29. #import "MOBingMobileVC.h"//绑定手机
  30. #import "MOMobileDataModels.h"
  31. #import "MOSetPasswordSMS.h"//设置交易密码界面
  32. #import "MOTopUpView.h"//半屏充值弹窗
  33. #import "MOPackageViewController.h"//背包
  34. #import "MOEasemobEvent.h"
  35. //#import <YTCommonXMagic/TELicenseCheck.h>
  36. #import <AdjustSdk/AdjustSdk.h>
  37. #if !TARGET_IPHONE_SIMULATOR
  38. #import <FBSDKCoreKit/FBSDKCoreKit.h>
  39. #endif
  40. #import "TencentCaptcha.h"//腾讯验证码
  41. #import "TIMPush/TIMPush.h"
  42. #if DEBUG
  43. #import "MOLogFormatter.h"
  44. #import "DoraemonKit.h"
  45. #import "NEHTTPEye.h"
  46. #endif
  47. @interface AppDelegate ()<UNUserNotificationCenterDelegate,AdjustDelegate,TIMPushListener>
  48. @property (nonatomic, assign) BOOL isFromBackground;
  49. @end
  50. @implementation AppDelegate
  51. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  52. // Override point for customization after application launch.
  53. #if DEBUG
  54. [self setupLogger];
  55. [self setupNetworkMonitor];
  56. #endif
  57. //IQKeyboardManager
  58. [IQKeyboardManager sharedManager].shouldResignOnTouchOutside = YES;
  59. //APNs
  60. [self setAPNsWithApplication:application];
  61. //Adjust
  62. [self setAdjustConfig];
  63. //腾讯验证码
  64. [self setTencentCaptcha];
  65. //腾讯推送
  66. [self toRegisterTencentPush];
  67. [self parpareIAP];//内购
  68. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  69. self.window.backgroundColor = [UIColor whiteColor];
  70. [MOEventDeliver notifyAppLaunchFinished];
  71. NSString *token = [NSString stringWithFormat:@"%@",GetToken];
  72. if (token != nil && ![token isEqualToString:@"(null)"])
  73. {
  74. //登录过
  75. [self mainPageAction];
  76. [self showFirstLaunchImage];
  77. self.isShowAdView = YES;
  78. // 检查应用程序是否通过推送通知启动
  79. NSDictionary *remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
  80. if (remoteNotification) {
  81. [self handlePushNotification:remoteNotification];
  82. }
  83. [MOEventDeliver notifyUserLogin];
  84. }
  85. else
  86. {
  87. //没有登录过
  88. [self loginPageAction];
  89. }
  90. #if !TARGET_IPHONE_SIMULATOR
  91. [[FBSDKApplicationDelegate sharedInstance] application:application
  92. didFinishLaunchingWithOptions:launchOptions];
  93. #endif
  94. #if DEBUG
  95. [self setupDoraemonKit];
  96. #endif
  97. return YES;
  98. }
  99. - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
  100. if ([[userActivity activityType]
  101. isEqualToString:NSUserActivityTypeBrowsingWeb]) {
  102. NSURL *incomingURL = [userActivity webpageURL];
  103. [self handleAdjustLink:incomingURL];
  104. SendNotification(@"kNotification_adjustAgent")//如果app没被杀死,需要通知绑定
  105. //#if kAPP_Environment == 2
  106. // if (inviteCode.length > 0) {
  107. // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  108. // [MBProgressHUD showInfoMessage:[NSString stringWithFormat:@"continueUserActivity code = %@", inviteCode]];
  109. // });
  110. // }
  111. //#endif
  112. } else {
  113. return NO;
  114. }
  115. return YES;
  116. }
  117. - (BOOL)adjustDeferredDeeplinkReceived:(NSURL *)deeplink {
  118. [self handleAdjustLink:deeplink];
  119. return NO;
  120. }
  121. - (void)mainPageAction{
  122. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  123. mainTabbar.isNormalOpen = YES;
  124. [mainTabbar toResetSetupTabbar];
  125. self.window.rootViewController = mainTabbar;
  126. //MOFirstInfoSetVC
  127. //POLanguageVC
  128. // MOFirstInfoSetVC *vc = [[MOFirstInfoSetVC alloc] init];
  129. // UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
  130. // [nav.navigationBar setHidden:YES];
  131. // self.window.rootViewController = nav;
  132. [self.window makeKeyAndVisible];
  133. }
  134. - (void)loginPageAction{
  135. MOLoginChooseVC *vc = [[MOLoginChooseVC alloc] init];
  136. UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
  137. [nav.navigationBar setHidden:YES];
  138. self.window.rootViewController = nav;
  139. [self.window makeKeyAndVisible];
  140. }
  141. //推送注册
  142. - (void)setAPNsWithApplication:(UIApplication *)application{
  143. [self setApsConfigWithApplication:application];
  144. }
  145. - (void)setTencentCaptcha{
  146. [TencentCaptcha setupWithConfigurationHandler:^(TencentCaptchaConfiguration * _Nonnull config) {
  147. config.appID = kTentCaptchaAppIdStr;
  148. }];
  149. }
  150. - (void)setAdjustConfig{
  151. NSString *appToken = @"s78jipv8axhc";
  152. #if kAPP_Environment == 1
  153. NSString *environment = ADJEnvironmentProduction;
  154. ADJConfig *adjustConfig = [[ADJConfig alloc] initWithAppToken:appToken
  155. environment:environment];
  156. adjustConfig.logLevel = ADJLogLevelSuppress;
  157. [adjustConfig enableCostDataInAttribution];
  158. [adjustConfig setDelegate:self];
  159. #elif kAPP_Environment == 2
  160. NSString *environment = ADJEnvironmentSandbox;
  161. ADJConfig *adjustConfig = [[ADJConfig alloc] initWithAppToken:appToken
  162. environment:environment];
  163. adjustConfig.logLevel = ADJLogLevelVerbose;
  164. [adjustConfig enableCostDataInAttribution];
  165. [adjustConfig setDelegate:self];
  166. #endif
  167. [Adjust initSdk:adjustConfig];
  168. }
  169. - (void)adjustAttributionChanged:(ADJAttribution *)attribution{
  170. }
  171. - (void)setApsConfigWithApplication:(UIApplication *)application{
  172. if (NSClassFromString(@"UNUserNotificationCenter")) {
  173. //注册推送,用于 iOS 10 及以上版本。
  174. UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  175. center.delegate = self; // 设置 UNUserNotificationCenter 的代理
  176. [center requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError *error) {
  177. if (granted) {
  178. dispatch_async(dispatch_get_main_queue(), ^{
  179. [application registerForRemoteNotifications];
  180. });
  181. }
  182. }];
  183. return;
  184. }
  185. if([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
  186. //iOS 8 至 iOS 10 推送样式设置。
  187. UIUserNotificationType notificationTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
  188. UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil];
  189. [application registerUserNotificationSettings:settings];
  190. }
  191. if ([application respondsToSelector:@selector(registerForRemoteNotifications)]) {
  192. //注册推送,用于 iOS 8 及以上版本。
  193. [application registerForRemoteNotifications];
  194. } else {
  195. //注册推送,用于 iOS 8 之前版本。
  196. UIRemoteNotificationType notificationTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert;
  197. [[UIApplication sharedApplication] registerForRemoteNotificationTypes:notificationTypes];
  198. }
  199. MOLogV(@"注册完毕");
  200. }
  201. // 将得到的deviceToken传给SDK
  202. - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
  203. {
  204. // 异步方法
  205. [Adjust setPushToken:deviceToken];
  206. // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  207. // EMError *error = [[EMClient sharedClient] bindDeviceToken:deviceToken];
  208. // MOLogV(@"deviceToken 回调完毕");
  209. // });
  210. }
  211. // 注册deviceToken失败
  212. - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
  213. MOLogV(@"注册deviceToken失败 error -- %@",error);
  214. }
  215. // 当应用在前台时收到通知
  216. - (void)userNotificationCenter:(UNUserNotificationCenter *)center
  217. willPresentNotification:(UNNotification *)notification
  218. withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
  219. // 处理通知内容
  220. NSDictionary *userInfo = notification.request.content.userInfo;
  221. MOLogV(@"Foreground Notification received: %@", userInfo);
  222. // [[EMLocalNotificationManager sharedManager] userNotificationCenter:center willPresentNotification:notification withCompletionHandler:completionHandler];
  223. }
  224. - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler
  225. {
  226. // [[EMLocalNotificationManager sharedManager] userNotificationCenter:center didReceiveNotificationResponse:response withCompletionHandler:completionHandler];
  227. UNNotificationRequest *request = response.notification.request;
  228. UNNotificationContent *content = request.content;
  229. NSDictionary *userInfo = content.userInfo;
  230. UIApplicationState state = [[UIApplication sharedApplication] applicationState];
  231. if (state == UIApplicationStateInactive){
  232. }
  233. completionHandler();
  234. }
  235. // 处理推送通知数据并跳转到指定界面
  236. - (void)handlePushNotification:(NSDictionary *)userInfo {
  237. // 解析推送通知数据
  238. NSString *targetViewController = userInfo[@"targetViewController"];
  239. NSString *additionalData = userInfo[@"additionalData"];
  240. }
  241. - (void)emDidRecivePushSilentMessage:(NSDictionary *)messageDic{
  242. //透传消息
  243. MOLogV(@"emDidRecivePushSilentMessage : %@",messageDic);
  244. kMainThreadBlock(^{
  245. MOEasemobEvent *baseModel = [MOEasemobEvent modelWithDictionary:messageDic];
  246. //每日任务
  247. if([baseModel.event isEqualToString:@"task.dialog"]){
  248. TaskPublishEvent *publishInfo = [TaskPublishEvent modelWithJSON:baseModel.value];
  249. MOGetGiftView *view = [MOGetGiftView moGetGiftView];
  250. view.viewModel = publishInfo;
  251. [view showGetGiftView];
  252. }
  253. //钻石大赢家
  254. else if ([baseModel.event isEqualToString:@"activity.big.winner"]){
  255. UIViewController *currentVC = [MOTools currentViewController];
  256. ActivityBigWinnerPublishEvent *diaWinObject = [ActivityBigWinnerPublishEvent modelWithJSON:baseModel.value];
  257. MODrawOpenVC *vc = [[MODrawOpenVC alloc] init];
  258. vc.viewModel = diaWinObject;
  259. UINavigationController *newNav = [[UINavigationController alloc] initWithRootViewController:vc];
  260. newNav.modalPresentationStyle = UIModalPresentationOverFullScreen;
  261. [currentVC presentViewController:newNav animated:NO completion:nil];
  262. }
  263. })
  264. }
  265. - (void)toOpenTheSchemeUrlWith:(NSString *)schemeUrl{
  266. if(schemeUrl.length == 0){
  267. return;
  268. }
  269. NSURL *url = [NSURL URLWithString:schemeUrl];
  270. if ([[UIApplication sharedApplication]respondsToSelector:@selector(openURL:options:completionHandler:)])
  271. {
  272. [[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly:@NO} completionHandler:^(BOOL success) {}];
  273. }
  274. else
  275. {
  276. [[UIApplication sharedApplication] openURL:url];
  277. }
  278. }
  279. - (void)application:(UIApplication *)application
  280. didReceiveRemoteNotification:(NSDictionary *)userInfo
  281. fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  282. if ([[userInfo objectForKey:@"adjust_purpose"]
  283. isEqualToString:@"uninstall detection"]) {
  284. // No handling required for Adjust data payload
  285. completionHandler(UIBackgroundFetchResultNoData);
  286. } else {
  287. // Handle other types of push messages here
  288. // Pass the appropriate value to the completionHandler:
  289. // UIBackgroundFetchResultNewData, UIBackgroundFetchResultNoData,
  290. // or UIBackgroundFetchResultFailed
  291. completionHandler(UIBackgroundFetchResultNewData);
  292. }
  293. }
  294. - (void)handleAdjustLink:(NSURL *)link {
  295. NSString *inviteCode = [MOTools getValueWithKey:kAgentInviteCodeKey url:link];
  296. [[MODataCache sharedYYCache] setObject:inviteCode forKey:kAgentInviteCode];
  297. NSString *jumpRoomId = [MOTools getValueWithKey:kAgentJumpRoomIdKey url:link];
  298. [[MODataCache sharedYYCache] setObject:jumpRoomId forKey:kAgentJumpRoomId];
  299. //#if kAPP_Environment == 2
  300. // if (jumpRoomId.length > 0) {
  301. // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  302. // [MBProgressHUD showInfoMessage:[NSString stringWithFormat:@"jumpRoomId = %@", link]];
  303. // });
  304. // }
  305. //#endif
  306. }
  307. //MARK: - Scheme 跳转
  308. - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
  309. MOLogV(@"从哪个app跳转而来 Bundle ID: %@", options[UIApplicationOpenURLOptionsSourceApplicationKey]);
  310. MOLogV(@"URL scheme:%@", [url scheme]);//mimo
  311. MOLogV(@"URL query:%@", [url query]);
  312. MOLogV(@"URL query:%@", [url path]); //live_boot
  313. if ([url.scheme isEqualToString:@"mimo"]){
  314. NSString *urlString = url.absoluteString;
  315. NSString *roomId;
  316. if ([urlString rangeOfString:@"roomId="].location != NSNotFound)
  317. {
  318. roomId = [urlString componentsSeparatedByString:@"roomId="].lastObject;
  319. }
  320. NSString *userId;
  321. if ([urlString rangeOfString:@"userId="].location != NSNotFound)
  322. {
  323. userId = [urlString componentsSeparatedByString:@"userId="].lastObject;
  324. }
  325. if([urlString containsString:@"jump_native"]){
  326. //跳转
  327. if([urlString containsString:@"live_room"]){
  328. if(roomId.length == 0){
  329. return YES;
  330. }
  331. //直播间
  332. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  333. if ([mainTabbar isInLiveRoom]) {
  334. return YES;
  335. }
  336. [MOShowAgoraKitManager shareManager].isFirstShow = YES;
  337. MOLiveList *model = [[MOLiveList alloc] init];
  338. model.id = roomId;
  339. MOShowLivePagesVC *vc = [[MOShowLivePagesVC alloc] init];
  340. vc.userType = MOShowLiveAudienceType;
  341. vc.roomList = @[model].mutableCopy;
  342. vc.focusIndex = 0;
  343. // UINavigationController *newNav = [[UINavigationController alloc] initWithRootViewController:vc];
  344. // newNav.modalPresentationStyle = UIModalPresentationFullScreen;
  345. // [nav presentViewController:newNav animated:YES completion:nil];
  346. vc.hidesBottomBarWhenPushed = YES;
  347. [mainTabbar.selectedViewController pushViewController:vc animated:YES];
  348. }
  349. if([urlString containsString:@"recharge"]){
  350. //充值
  351. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  352. UINavigationController *nav = mainTabbar.selectedViewController;
  353. if (nav.presentedViewController) {
  354. if ([nav isKindOfClass:[UINavigationController class]]) {
  355. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  356. MOTopUpVC *vc = [[MOTopUpVC alloc] init];
  357. vc.hidesBottomBarWhenPushed = YES;
  358. [presentingNavigationController pushViewController:vc animated:YES];
  359. }
  360. } else {
  361. MOTopUpVC *vc = [[MOTopUpVC alloc] init];
  362. vc.hidesBottomBarWhenPushed = YES;
  363. [nav pushViewController:vc animated:YES];
  364. }
  365. }
  366. if([urlString containsString:@"live_half_topup"]){//半屏充值弹窗
  367. MOTopUpView *view = [MOTopUpView moTopUpView];
  368. [view showTopUpView];
  369. }
  370. if([urlString containsString:@"follow"]){
  371. //关注
  372. if(roomId.length == 0){
  373. return YES;
  374. }
  375. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  376. UINavigationController *nav = mainTabbar.selectedViewController;
  377. if (nav.presentedViewController) {
  378. if ([nav isKindOfClass:[UINavigationController class]]) {
  379. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  380. BOOL isHaveLive = NO;
  381. for (UIViewController *vc in presentingNavigationController.viewControllers) {
  382. if([vc isKindOfClass:[MOShowLivePagesVC class]]){
  383. isHaveLive = YES;
  384. break;
  385. }
  386. }
  387. if(isHaveLive){
  388. [MBProgressHUD showTipMessageInWindow:NSLocalString(@"mimo_joined_live_room_tip")];
  389. return YES;
  390. }
  391. }
  392. }
  393. if ([nav isKindOfClass:[UINavigationController class]]) {
  394. BOOL isHaveLive = NO;
  395. for (UIViewController *vc in nav.viewControllers) {
  396. if([vc isKindOfClass:[MOShowLivePagesVC class]]){
  397. isHaveLive = YES;
  398. break;
  399. }
  400. }
  401. if(isHaveLive){
  402. [MBProgressHUD showTipMessageInWindow:NSLocalString(@"mimo_joined_live_room_tip")];
  403. return YES;
  404. }
  405. }
  406. [MOShowAgoraKitManager shareManager].isFirstShow = YES;
  407. MOLiveList *model = [[MOLiveList alloc] init];
  408. model.id = roomId;
  409. MOShowLivePagesVC *vc = [[MOShowLivePagesVC alloc] init];
  410. vc.userType = MOShowLiveAudienceType;
  411. vc.roomList = @[model].mutableCopy;
  412. vc.focusIndex = 0;
  413. // UINavigationController *newNav = [[UINavigationController alloc] initWithRootViewController:vc];
  414. // newNav.modalPresentationStyle = UIModalPresentationFullScreen;
  415. // [nav presentViewController:newNav animated:YES completion:nil];
  416. vc.hidesBottomBarWhenPushed = YES;
  417. [nav pushViewController:vc animated:YES];
  418. }
  419. if([urlString containsString:@"edit"]){
  420. //编辑
  421. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  422. UINavigationController *nav = mainTabbar.selectedViewController;
  423. if (nav.presentedViewController) {
  424. if ([nav isKindOfClass:[UINavigationController class]]) {
  425. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  426. MOMineEditInfoVC *vc = [[MOMineEditInfoVC alloc] init];
  427. vc.hidesBottomBarWhenPushed = YES;
  428. [presentingNavigationController pushViewController:vc animated:YES];
  429. }
  430. } else {
  431. MOMineEditInfoVC *vc = [[MOMineEditInfoVC alloc] init];
  432. vc.hidesBottomBarWhenPushed = YES;
  433. [nav pushViewController:vc animated:YES];
  434. }
  435. }
  436. if([urlString containsString:@"live_boot"]){
  437. //主播-开播
  438. //直播间
  439. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  440. UINavigationController *nav = mainTabbar.selectedViewController;
  441. if (nav.presentedViewController) {
  442. if ([nav isKindOfClass:[UINavigationController class]]) {
  443. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  444. BOOL isHaveLive = NO;
  445. for (UIViewController *vc in presentingNavigationController.viewControllers) {
  446. if([vc isKindOfClass:[MOShowLivePagesVC class]]){
  447. isHaveLive = YES;
  448. break;
  449. }
  450. }
  451. if(isHaveLive){
  452. [MBProgressHUD showTipMessageInWindow:NSLocalString(@"mimo_joined_live_room_tip")];
  453. return YES;
  454. }
  455. }
  456. }
  457. SendNotification(@"kNotification_OpenTheLiveRoom");
  458. }
  459. if([urlString containsString:@"level"]){
  460. //等级
  461. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  462. UINavigationController *nav = mainTabbar.selectedViewController;
  463. if (nav.presentedViewController) {
  464. if ([nav isKindOfClass:[UINavigationController class]]) {
  465. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  466. MOWebViewController *vc = [[MOWebViewController alloc] init];
  467. NSString *urlStr = [NSString stringWithFormat:@"%@/#/userLevel",kNetPath_Web_Base];
  468. vc.webUrl = [NSURL URLWithString:urlStr];
  469. vc.hidesBottomBarWhenPushed = YES;
  470. [presentingNavigationController pushViewController:vc animated:YES];
  471. }
  472. } else {
  473. MOWebViewController *vc = [[MOWebViewController alloc] init];
  474. NSString *urlStr = [NSString stringWithFormat:@"%@/#/userLevel",kNetPath_Web_Base];
  475. vc.webUrl = [NSURL URLWithString:urlStr];
  476. vc.hidesBottomBarWhenPushed = YES;
  477. [nav pushViewController:vc animated:YES];
  478. }
  479. }
  480. if([urlString containsString:@"vip"]){
  481. //编辑
  482. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  483. UINavigationController *nav = mainTabbar.selectedViewController;
  484. NSURLComponents *components = [NSURLComponents componentsWithString:urlString];
  485. NSArray<NSURLQueryItem *> *queryItems = components.queryItems;
  486. NSInteger showType = 0;
  487. for (NSURLQueryItem *item in queryItems) {
  488. if ([item.name isEqualToString:@"showType"]) {
  489. showType = [item.value integerValue];
  490. break;
  491. }
  492. }
  493. if (nav.presentedViewController) {
  494. if ([nav isKindOfClass:[UINavigationController class]]) {
  495. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  496. MOVipDetailVC *vc = [[MOVipDetailVC alloc] init];
  497. vc.showType = showType;
  498. vc.hidesBottomBarWhenPushed = YES;
  499. [presentingNavigationController pushViewController:vc animated:YES];
  500. }
  501. } else {
  502. MOVipDetailVC *vc = [[MOVipDetailVC alloc] init];
  503. vc.showType = showType;
  504. vc.hidesBottomBarWhenPushed = YES;
  505. [nav pushViewController:vc animated:YES];
  506. }
  507. }
  508. if([urlString containsString:@"shop"]){
  509. //编辑
  510. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  511. UINavigationController *nav = mainTabbar.selectedViewController;
  512. if (nav.presentedViewController) {
  513. if ([nav isKindOfClass:[UINavigationController class]]) {
  514. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  515. MOShopBaseVC *vc = [[MOShopBaseVC alloc] init];
  516. vc.hidesBottomBarWhenPushed = YES;
  517. [presentingNavigationController pushViewController:vc animated:YES];
  518. }
  519. } else {
  520. MOShopBaseVC *vc = [[MOShopBaseVC alloc] init];
  521. vc.hidesBottomBarWhenPushed = YES;
  522. [nav pushViewController:vc animated:YES];
  523. }
  524. }
  525. if([urlString containsString:@"homePage"]){
  526. if(userId.length == 0){
  527. return YES;
  528. }
  529. //个人主页
  530. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  531. UINavigationController *nav = mainTabbar.selectedViewController;
  532. if (nav.presentedViewController) {
  533. if ([nav isKindOfClass:[UINavigationController class]]) {
  534. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  535. MOUserHomePageVC *vc = [[MOUserHomePageVC alloc] init];
  536. vc.userId = userId;
  537. vc.hidesBottomBarWhenPushed = YES;
  538. [presentingNavigationController pushViewController:vc animated:YES];
  539. }
  540. }
  541. else{
  542. MOUserHomePageVC *vc = [[MOUserHomePageVC alloc] init];
  543. vc.userId = userId;
  544. vc.hidesBottomBarWhenPushed = YES;
  545. [nav pushViewController:vc animated:YES];
  546. }
  547. }
  548. if([urlString containsString:@"fans_club"]){
  549. //粉丝团
  550. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  551. UINavigationController *nav = mainTabbar.selectedViewController;
  552. if (nav.presentedViewController) {
  553. if ([nav isKindOfClass:[UINavigationController class]]) {
  554. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  555. MOFanClubListVC *vc = [[MOFanClubListVC alloc] init];
  556. vc.hidesBottomBarWhenPushed = YES;
  557. [presentingNavigationController pushViewController:vc animated:YES];
  558. }
  559. }
  560. else{
  561. MOFanClubListVC *vc = [[MOFanClubListVC alloc] init];
  562. vc.hidesBottomBarWhenPushed = YES;
  563. [nav pushViewController:vc animated:YES];
  564. }
  565. }
  566. if([urlString containsString:@"webview"]){
  567. NSString *webUrlStr;
  568. if ([urlString rangeOfString:@"url="].location != NSNotFound)
  569. {
  570. webUrlStr = [urlString componentsSeparatedByString:@"url="].lastObject;
  571. }
  572. NSString *decodedString = [webUrlStr stringByRemovingPercentEncoding];
  573. BOOL isShowTitle = YES;
  574. if([decodedString containsString:@"FullScreen=1"]){
  575. isShowTitle = NO;
  576. }
  577. MOWebViewController *vc = [[MOWebViewController alloc] init];
  578. vc.webUrl = [NSURL URLWithString:decodedString];
  579. vc.isShowTitle = isShowTitle;
  580. vc.hidesBottomBarWhenPushed = YES;
  581. UIViewController *currentVC = [MOTools currentViewController];
  582. [currentVC.navigationController pushViewController:vc animated:YES];
  583. }
  584. if([urlString containsString:[MOTextAESTools toGetHameList]]){
  585. //中心
  586. MOMainTabController *mainTabbar = [MOMainTabController sharedSingleton];
  587. UINavigationController *nav = mainTabbar.selectedViewController;
  588. if (nav.presentedViewController) {
  589. if ([nav isKindOfClass:[UINavigationController class]]) {
  590. UINavigationController *presentingNavigationController = (UINavigationController *)nav.presentedViewController;
  591. MOWameListVC *vc = [[MOWameListVC alloc] init];
  592. vc.hidesBottomBarWhenPushed = YES;
  593. [presentingNavigationController pushViewController:vc animated:YES];
  594. }
  595. }
  596. else{
  597. MOWameListVC *vc = [[MOWameListVC alloc] init];
  598. vc.hidesBottomBarWhenPushed = YES;
  599. [nav pushViewController:vc animated:YES];
  600. }
  601. }
  602. //钻石夺宝
  603. if([urlString containsString:@"diamondWinner"]){
  604. MODiaWinVC *vc = [[MODiaWinVC alloc] init];
  605. UIViewController *currentVC = [MOTools currentViewController];
  606. vc.hidesBottomBarWhenPushed = YES;
  607. [currentVC.navigationController pushViewController:vc animated:YES];
  608. }
  609. //绑定邮箱
  610. if([urlString containsString:@"bind_email"]){
  611. UIViewController *currentVC = [MOTools currentViewController];
  612. MOBindingEmailVC *vc = [[MOBindingEmailVC alloc] init];
  613. vc.hidesBottomBarWhenPushed = YES;
  614. [currentVC.navigationController pushViewController:vc animated:YES];
  615. }
  616. //绑定手机
  617. if([urlString containsString:@"bind_phone_number"]){
  618. UIViewController *currentVC = [MOTools currentViewController];
  619. MOBingMobileVC *vc = [[MOBingMobileVC alloc] init];
  620. vc.hidesBottomBarWhenPushed = YES;
  621. [currentVC.navigationController pushViewController:vc animated:YES];
  622. }
  623. //设置密码2 - 手机
  624. if([urlString containsString:@"set_password_phone_number"]){
  625. [self toSetThePsw2With:1];
  626. }
  627. //设置密码2 - 邮箱
  628. if([urlString containsString:@"set_password_email"]){
  629. [self toSetThePsw2With:2];
  630. }
  631. //忘记密码2 - 邮箱
  632. if([urlString containsString:@"forget_email"]){
  633. [self toSetThePsw2With:4];
  634. }
  635. //忘记密码2 - 手机号码
  636. if([urlString containsString:@"forget_phone_number"]){
  637. [self toSetThePsw2With:3];
  638. }
  639. //修改密码
  640. if([urlString containsString:@"change_password"]){
  641. UIViewController *currentVC = [MOTools currentViewController];
  642. MOSetPasswordSMS *vc = [[MOSetPasswordSMS alloc] init];
  643. vc.vcType = MOChangePsw2EnterOldPsw;
  644. vc.hidesBottomBarWhenPushed = YES;
  645. [currentVC.navigationController pushViewController:vc animated:YES];
  646. }
  647. //跳转wame列表
  648. if([urlString containsString:@"wames"]){
  649. UIViewController *currentVC = [MOTools currentViewController];
  650. MOWameListVC *vc = [[MOWameListVC alloc] init];
  651. vc.hidesBottomBarWhenPushed = YES;
  652. [currentVC.navigationController pushViewController:vc animated:YES];
  653. }
  654. //跳转背包列表
  655. if([urlString containsString:@"user_backpack"]){
  656. UIViewController *currentVC = [MOTools currentViewController];
  657. MOPackageViewController *vc = [[MOPackageViewController alloc] init];
  658. vc.hidesBottomBarWhenPushed = YES;
  659. [currentVC.navigationController pushViewController:vc animated:YES];
  660. }
  661. }
  662. }
  663. // 允许打开
  664. return YES;
  665. }
  666. //1 为手机 2为邮箱 3手机找回 4邮箱找回
  667. - (void)toSetThePsw2With:(NSInteger)type{
  668. WEAKSELF
  669. [kHttpManager toGetTheUserSecurityInfoWithParams:nil andBlock:^(id _Nonnull data, NSError * _Nonnull error) {
  670. if(kCode_Success){
  671. MOLogV(@"%@",[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]);
  672. MOSecurityData *baseData = [MOSecurityData modelObjectWithDictionary:data[@"data"]];
  673. UIViewController *currentVC = [MOTools currentViewController];
  674. MOSetPasswordSMS *vc = [[MOSetPasswordSMS alloc] init];
  675. if(type == 1){
  676. //手机
  677. vc.vcType = MOEnterCodeSetPsw2Type;
  678. vc.code = baseData.mobileInfo.code;
  679. vc.num = baseData.mobileInfo.num;
  680. vc.psw2Type = 1;
  681. }
  682. else if (type == 2){
  683. //邮箱
  684. vc.vcType = MOEnterCodeSetPsw2Type;
  685. vc.email = baseData.email;
  686. vc.psw2Type = 2;
  687. }
  688. else if (type == 3){
  689. vc.vcType = MOEnterCodeSetPsw2Type;
  690. vc.isForgetPsw2 = YES;
  691. vc.code = baseData.mobileInfo.code;
  692. vc.num = baseData.mobileInfo.num;
  693. vc.psw2Type = 1;
  694. }
  695. else if (type == 4){
  696. vc.vcType = MOEnterCodeSetPsw2Type;
  697. vc.isForgetPsw2 = YES;
  698. //邮箱找回
  699. vc.email = baseData.email;
  700. vc.psw2Type = 2;
  701. }
  702. vc.hidesBottomBarWhenPushed = YES;
  703. [currentVC.navigationController pushViewController:vc animated:YES];
  704. }
  705. else{
  706. MOLogV(@"toGetTheUserSecurityInfoWithParams 接口报错了");
  707. kShowNetError(data)
  708. }
  709. }];
  710. }
  711. - (void)applicationDidEnterBackground:(UIApplication *)application {
  712. self.isFromBackground = YES;
  713. }
  714. - (BOOL)application:(UIApplication *)application
  715. openURL:(NSURL *)url
  716. sourceApplication:(NSString *)sourceApplication
  717. annotation:(id)annotation {
  718. #if !TARGET_IPHONE_SIMULATOR
  719. return [[FBSDKApplicationDelegate sharedInstance] application:application
  720. openURL:url
  721. sourceApplication:sourceApplication
  722. annotation:annotation];
  723. #else
  724. return NO;
  725. #endif
  726. }
  727. - (void)applicationDidBecomeActive:(UIApplication *)application {
  728. MOLogV(@"APP进入活动状态");
  729. NSString *token = [NSString stringWithFormat:@"%@",GetToken];
  730. if (token != nil && ![token isEqualToString:@"(null)"])
  731. {
  732. if(!self.isShowAdView){
  733. [AppDelegate toJudgeThePastboard];
  734. }
  735. [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
  736. [self performSelector:@selector(toRecoveryTheLive) withObject:nil afterDelay:1.0];
  737. [self performSelector:@selector(toCheckTheIMStatus) withObject:nil afterDelay:5.0];
  738. //是否从后台切换到前台
  739. if (self.isFromBackground) {
  740. self.isFromBackground = NO;
  741. SendNotification(@"kNotification_FromBackgroundStatus");
  742. }
  743. }
  744. #if !TARGET_IPHONE_SIMULATOR
  745. [FBSDKAppEvents.shared activateApp];
  746. #endif
  747. }
  748. - (void)toRecoveryTheLive{
  749. SendNotification(@"kNotification_RecoveryTheLive");//如果在直播间 通知一下服务器
  750. }
  751. - (void)toCheckTheIMStatus{
  752. SendNotification(@"kNotification_CheckTheIMStatus");
  753. }
  754. + (void)toJudgeThePastboard{
  755. if (@available(iOS 14.0, *)) {
  756. WEAKSELF
  757. NSSet *patterns = [[NSSet alloc] initWithObjects:UIPasteboardDetectionPatternProbableWebURL, nil];
  758. [[UIPasteboard generalPasteboard] detectPatternsForPatterns:patterns completionHandler:^(NSSet<UIPasteboardDetectionPattern> * _Nullable result, NSError * _Nullable error) {
  759. if (result && result.count) {
  760. // 当前剪切板中存在 URL
  761. [weakSelf toReadThePasteboard];
  762. }
  763. }];
  764. } else {
  765. // Fallback on earlier versions
  766. // 读取剪贴板内容
  767. [AppDelegate toReadThePasteboard];
  768. }
  769. }
  770. + (void)toReadThePasteboard{
  771. WEAKSELF
  772. kMainThreadBlock(^{
  773. UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  774. NSString *pasteboardString = pasteboard.string;
  775. // 检查是否有内容,并且满足特定的 Scheme 格式
  776. if (pasteboardString.length > 0 && [pasteboardString hasPrefix:@"mimo://"]) {
  777. // 处理 Scheme 跳转
  778. NSURL *url = [NSURL URLWithString:pasteboardString];
  779. if ([[UIApplication sharedApplication] canOpenURL:url]) {
  780. [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
  781. }
  782. // 将剪贴板内容清空
  783. pasteboard.string = @"";
  784. }
  785. AppDelegate *app = (AppDelegate *) [UIApplication sharedApplication].delegate;
  786. app.isShowAdView = NO;
  787. })
  788. }
  789. /**
  790. 内购准备环境(在appDelegateAPP每次启动时调用)
  791. */
  792. - (void)parpareIAP {
  793. NSString *productID = MOCurrentIAProductID;
  794. if(productID.length == 0){
  795. productID = MODefaultProductID;
  796. }
  797. [[MOInAppPurchaseManager shareManager] queryByPuoductId:productID productInfoReuslts:^(SKProductsResponse * _Nonnull resp) {
  798. MOLogV(@"123123");
  799. }];
  800. }
  801. - (void)showFirstLaunchImage{
  802. MOBannerData *bannerData = (MOBannerData *)[[MODataCache sharedYYCache] objectForKey:kFirstLaunchInfo];
  803. if(bannerData.JumpList.count != 0){
  804. MOJumpList *jumpData = bannerData.JumpList.firstObject;
  805. NSString *bannerStr = jumpData.img;
  806. NSString *jumpStr = jumpData.jump;
  807. if(bannerStr.length != 0){
  808. [NSObject mo_makeLBLaunchImageAdView:^(MOLaunchImageAdView *imgAdView) {
  809. //设置广告的类型
  810. imgAdView.mo_getLBlaunchImageAdViewType(FullScreenAdType);
  811. //设置本地启动图片
  812. imgAdView.mo_imgUrl = bannerStr;
  813. //自定义跳过按钮
  814. imgAdView.mo_skipBtn.backgroundColor = [MOTools colorWithHexString:@"#000000" alpha:0.5];
  815. //各种点击事件的回调
  816. imgAdView.mo_clickBlock = ^(MOClickType type){
  817. switch (type) {
  818. case clickAdType:{
  819. MOLogV(@"点击广告回调");
  820. jumpData.isFirstAdWeb = YES;
  821. SendObjNotification(@"MOSquareListVC_H5Jump", jumpData);
  822. }
  823. break;
  824. case skipAdType:{
  825. MOLogV(@"点击跳过回调");
  826. SendNotification(@"kNotification_FirstShowNoti");
  827. [AppDelegate toJudgeThePastboard];
  828. }
  829. break;
  830. case overtimeAdType:{
  831. MOLogV(@"倒计时完成后的回调");
  832. SendNotification(@"kNotification_FirstShowNoti");
  833. [AppDelegate toJudgeThePastboard];
  834. }
  835. break;
  836. default:
  837. break;
  838. }
  839. };
  840. }];
  841. }
  842. else{
  843. SendNotification(@"kNotification_FirstShowNoti");
  844. [AppDelegate toJudgeThePastboard];
  845. }
  846. }
  847. else{
  848. SendNotification(@"kNotification_FirstShowNoti");
  849. [AppDelegate toJudgeThePastboard];
  850. }
  851. }
  852. #pragma mark - TIMPush
  853. - (int)businessID {
  854. //上一步控制台给的证书ID
  855. int kBusinessID = kTentPushID;
  856. return kBusinessID;
  857. }
  858. - (BOOL)onRemoteNotificationReceived:(NSString *)notice {
  859. // custom navigate
  860. return NO;
  861. }
  862. - (void)toRegisterTencentPush{
  863. [TIMPushManager addPushListener:self];
  864. [TIMPushManager disablePostNotificationInForeground:YES];//关闭 App 在前台时弹出通知栏
  865. }
  866. #pragma mark - TIMPushListener
  867. - (void)onNotificationClicked:(NSString *)ext {
  868. // 获取 ext 自定义跳转
  869. MOLogV(@"onNotificationClicked ext - %@",ext);
  870. NSDictionary *dict = [MOTools dictionaryWithJsonString:ext];
  871. NSString *jumpUrl = [MODataManager objectOrNilForKey:@"jump" fromDictionary:dict];
  872. [self toOpenTheSchemeUrlWith:jumpUrl];
  873. }
  874. - (void)onRecvPushMessage:(TIMPushMessage *)message{
  875. MOLogV(@"Received TIMPushMessage:");
  876. MOLogV(@"Title: %@", message.title);
  877. MOLogV(@"Content: %@", message.desc);
  878. MOLogV(@"Ext: %@", message.ext);
  879. MOLogV(@"Message ID: %@", message.messageID);
  880. kMainThreadBlock(^{
  881. MOEasemobEvent *baseModel = [MOEasemobEvent modelWithJSON:message.ext];
  882. //每日任务
  883. if([baseModel.event isEqualToString:@"task.dialog"]){
  884. TaskPublishEvent *publishInfo = [TaskPublishEvent modelWithJSON:baseModel.value];
  885. MOGetGiftView *view = [MOGetGiftView moGetGiftView];
  886. view.viewModel = publishInfo;
  887. [view showGetGiftView];
  888. }
  889. //钻石大赢家
  890. else if ([baseModel.event isEqualToString:@"activity.big.winner"]){
  891. UIViewController *currentVC = [MOTools currentViewController];
  892. ActivityBigWinnerPublishEvent *diaWinObject = [ActivityBigWinnerPublishEvent modelWithJSON:baseModel.value];
  893. MODrawOpenVC *vc = [[MODrawOpenVC alloc] init];
  894. vc.viewModel = diaWinObject;
  895. UINavigationController *newNav = [[UINavigationController alloc] initWithRootViewController:vc];
  896. newNav.modalPresentationStyle = UIModalPresentationOverFullScreen;
  897. [currentVC presentViewController:newNav animated:NO completion:nil];
  898. }
  899. })
  900. }
  901. #if DEBUG
  902. - (void)setupDoraemonKit {
  903. [[DoraemonManager shareInstance] install];
  904. }
  905. - (void)setupLogger {
  906. DDOSLogger *consoleLogger = [DDOSLogger sharedInstance];
  907. consoleLogger.logFormatter = [[MOLogFormatter alloc] init]; // 设置格式器
  908. [DDLog addLogger:consoleLogger];
  909. DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
  910. fileLogger.logFormatter = [[MOLogFormatter alloc] init]; // 文件日志也使用相同格式
  911. fileLogger.rollingFrequency = 60 * 60 * 24; // 1 天轮转
  912. fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
  913. fileLogger.maximumFileSize = 5 * 1024 * 1024;
  914. [DDLog addLogger:fileLogger];
  915. }
  916. - (void)setupNetworkMonitor {
  917. [NSURLProtocol registerClass:[NEHTTPEye class]];
  918. if ([[NSUserDefaults standardUserDefaults] objectForKey:@"NetworkEyeEnable"] == nil) {
  919. // 默认开启
  920. [NEHTTPEye setEnabled:YES];
  921. }
  922. }
  923. #endif
  924. @end