AppDelegate.m 43 KB

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