webSocketManager.m 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. //
  2. // webSocketManager.m
  3. // 双子星云手机
  4. //
  5. // Created by xd h on 2024/6/20.
  6. //
  7. #import "webSocketManager.h"
  8. #import "webSocketManager+baseDownload.h"
  9. #import "webSocketManager+downloadFile.h"
  10. #import "webSocketManager+downloadThumbnailImage.h"
  11. #import "webSocketManager+upLoadFile.h"
  12. #import "webSocketManager+backupsFile.h"
  13. #import "errorAlertTool.h"
  14. #import "RcGameWQKeyChain.h"
  15. #import "USBInsertPopView.h"
  16. @interface webSocketManager ()
  17. {
  18. NSMutableArray *commandSendCheckArr;//需要检测任务是否发出的的指令
  19. ComontAlretViewController *logoutAlertVC;
  20. USBInsertPopView *curUSBInsertPopV;
  21. }
  22. @property(copy,nonatomic)NSString *curIp;
  23. /**定时器计数*/
  24. @property (nonatomic, assign) NSInteger webSocketTime;
  25. /**定时器计数 任务检测*/
  26. @property (nonatomic, assign) NSInteger webSocketTaskTime;
  27. @property (nonatomic, copy) NSTimer *webSocketCheckTimer; // 定时器-控制按钮
  28. //第一次链接设备 要发送指令信息 实现单点登录
  29. @property (nonatomic, assign)BOOL didSendfristMsg;
  30. @end
  31. @implementation webSocketManager
  32. static webSocketManager *webSocketManagerInstance = nil;
  33. +(webSocketManager *)shareInstance;
  34. {
  35. static dispatch_once_t onceToken;
  36. dispatch_once(&onceToken, ^{
  37. webSocketManagerInstance = [[webSocketManager alloc] init];
  38. });
  39. return webSocketManagerInstance;
  40. }
  41. - (void)initOtherFun
  42. {
  43. if(_webSocketCheckTimer){
  44. //[_timer invalidate];
  45. return;
  46. }
  47. _webSocketCheckTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(webScoketTimerChange) userInfo:nil repeats:YES];
  48. [[NSRunLoop currentRunLoop] addTimer:_webSocketCheckTimer forMode:NSRunLoopCommonModes];
  49. commandSendCheckArr = [NSMutableArray new];
  50. }
  51. - (void)opencommandChannelManagerrc_openURL
  52. {
  53. if(self.commandChannelManager){
  54. RCSocketCloudPhoneStatus status = [self.commandChannelManager rc_socketStatus];
  55. //HLog(@"rc_socketStatus:%ld",status)
  56. if(status == RCSocketCloudPhoneStatusFailed
  57. ||status == RCSocketCloudPhoneStatusClosedByServer
  58. ||status == RCSocketCloudPhoneStatusClosedByUser
  59. ||!ksharedAppDelegate.isWebSockLinkOKAginType//断开了
  60. )
  61. {
  62. HLog(@"WebSocket 链接时已经存在并且链接失效:%ld",status);
  63. [self.commandChannelManager rc_close];
  64. self.commandChannelManager = nil;
  65. }
  66. else{
  67. HLog(@"WebSocket 链接时已经存在并且链接中:%ld",status);
  68. return;
  69. }
  70. }
  71. KWeakSelf
  72. //初始化指令通道
  73. self.commandChannelManager = [[RCCommandChannelManager alloc] init];
  74. NSString *wsPort = @"";
  75. if([connectDeviceManager shareInstance].isPingOk
  76. && [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWiFi){
  77. _curIp = [connectDeviceManager shareInstance].DeviceThirdIdMod.data.ip;
  78. wsPort = @"9300";
  79. }
  80. else{
  81. _curIp = ruiyunlinkIp;
  82. wsPort = [[connectDeviceManager shareInstance] tcpPortStr];
  83. }
  84. NSString *instructionsChannelUrl = [NSString stringWithFormat:@"ws://%@:%@/businessChannel",_curIp,wsPort];
  85. if (instructionsChannelUrl && instructionsChannelUrl.length > 0) { //当都有值才可连接
  86. //HLog(@"WebSocket11111指令通道连接开始11111 url = %@ ",instructionsChannelUrl);
  87. [self.commandChannelManager rc_openURL:instructionsChannelUrl connected:^{
  88. //HLog(@"WebSocket11111指令通道连接成功11111 url = %@ ",instructionsChannelUrl);
  89. if (weakSelf.commandChannelManager.rc_socketStatus == RCSocketCloudPhoneStatusConnected){
  90. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  91. [weakSelf initOtherFun];
  92. [weakSelf handlAllMsgAfterDidLinkFun];
  93. });
  94. }
  95. } receive:^(id message, FLSocketCloudPhoneReceiveType type) {
  96. if([message isKindOfClass:[NSData class]] && [message length] == 0){
  97. if(type == RCSocketCloudPhoneReceiveTypeForPong)
  98. {
  99. [weakSelf keepWebSocketOKFun];
  100. }
  101. return;
  102. }
  103. HLog(@"webSocket指令通道接收消息:------------------\n%@",message);
  104. if([message isKindOfClass:[NSMutableString class]] || [message isKindOfClass:[NSString class]])
  105. {
  106. message = [(NSString *)message dataUsingEncoding:(NSUTF8StringEncoding)];
  107. }
  108. NSError *error = nil;
  109. NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:message options:NSJSONReadingMutableContainers error:&error];
  110. if(!dataDict){
  111. [weakSelf handleDownloadResponseFunBy:message];
  112. return;
  113. }
  114. if(![dataDict isKindOfClass:[NSDictionary class]]){
  115. //[__NSCFString allKeys] unrecognized selector sent to ins
  116. return;
  117. }
  118. NSString *messageType = dataDict[@"type"];
  119. if ([messageType isEqualToString:@"cutting"]) {
  120. //[[iToast makeText:@"复制成功"] show];
  121. }
  122. else if ([messageType isEqualToString:@"forwardMsgRep"]){/*转发的回复*/
  123. cloudPhoneCommonModel *model = [[cloudPhoneCommonModel alloc] initWithDictionary:dataDict error:nil];
  124. if(!model){
  125. return;
  126. }
  127. if([model.data.msg isEqualToString:@"only one socket"]){
  128. [weakSelf deleteCommandSendTaskFunWith:@"offline_notification"];
  129. }
  130. }
  131. else if ([messageType isEqualToString:@"forwardMsg"]){/*转发*/
  132. /*获取指令类型*/
  133. NSString *code = nil;
  134. if ([[dataDict allKeys] containsObject:@"data"]) {
  135. NSDictionary *data = dataDict[@"data"];
  136. if([data isKindOfClass:[NSString class]]){
  137. NSString * dataStr = (NSString*)data;
  138. if([dataStr isEqualToString:@"offline_notification"]){
  139. HLog(@"被别人挤下线了");
  140. [weakSelf LogoutByOtherFun];
  141. }
  142. return;
  143. }
  144. else if ([data isKindOfClass:[NSDictionary class]] && [[data allKeys] containsObject:@"code"]) {
  145. code = [data objectForKey:@"code"];
  146. if (![code isKindOfClass:[NSString class]]) {
  147. code = [NSString stringWithFormat:@"%ld",[code integerValue]];
  148. }
  149. }
  150. }
  151. /*获取用户名*/
  152. NSString *useName = nil;
  153. if ([[dataDict allKeys] containsObject:@"data"]) {
  154. NSDictionary *data = dataDict[@"data"];
  155. if ([[data allKeys] containsObject:@"userName"]) {
  156. useName = [data objectForKey:@"userName"];
  157. }
  158. }
  159. if ([code isEqualToString:@"phoneSizeChange"]){/*分辨率改变*/
  160. if ([[dataDict allKeys] containsObject:@"data"]) {
  161. NSDictionary *data = dataDict[@"data"];
  162. if ([[data allKeys] containsObject:@"width"]) {
  163. ksharedAppDelegate.couldPhone_W_PHONE = [[data objectForKey:@"width"] integerValue];
  164. }
  165. if ([[data allKeys] containsObject:@"height"]) {
  166. ksharedAppDelegate.couldPhone_H_PHONE = [[data objectForKey:@"height"] integerValue];
  167. }
  168. if (ksharedAppDelegate.couldPhone_W_PHONE > ksharedAppDelegate.couldPhone_H_PHONE) {
  169. CGFloat temp = ksharedAppDelegate.couldPhone_W_PHONE;
  170. ksharedAppDelegate.couldPhone_W_PHONE = ksharedAppDelegate.couldPhone_H_PHONE;
  171. ksharedAppDelegate.couldPhone_H_PHONE = temp;
  172. }
  173. }
  174. }
  175. }
  176. else if ([messageType isEqualToString:@"getPhoneSize"] || [messageType isEqualToString:@"setPhoneSize"]){
  177. //NSString *sn = nil;
  178. if([messageType isEqualToString:@"setPhoneSize"]){
  179. weakSelf.isDiDChangePhoneSizeType = YES;
  180. }
  181. if ([[dataDict allKeys] containsObject:@"data"]) {
  182. NSDictionary *data = dataDict[@"data"];
  183. if ([[data allKeys] containsObject:@"status"]) {
  184. NSInteger status = [[data objectForKey:@"status"] integerValue];
  185. if (status == 0) {/*不是当前设备直接返回*/
  186. if ([[data allKeys] containsObject:@"width"]) {
  187. ksharedAppDelegate.couldPhone_W_PHONE = [[data objectForKey:@"width"] integerValue];
  188. }
  189. if ([[data allKeys] containsObject:@"height"]) {
  190. ksharedAppDelegate.couldPhone_H_PHONE = [[data objectForKey:@"height"] integerValue];
  191. }
  192. if (ksharedAppDelegate.couldPhone_W_PHONE > ksharedAppDelegate.couldPhone_H_PHONE) {
  193. CGFloat temp = ksharedAppDelegate.couldPhone_W_PHONE;
  194. ksharedAppDelegate.couldPhone_W_PHONE = ksharedAppDelegate.couldPhone_H_PHONE;
  195. ksharedAppDelegate.couldPhone_H_PHONE = temp;
  196. }
  197. }
  198. }
  199. }
  200. }
  201. else if ([messageType isEqualToString:@"sync_wifi"]){
  202. [weakSelf sync_wifiBackHandleFun];
  203. }
  204. else if ([messageType isEqualToString:@"reProduceText"]){
  205. if ([[dataDict allKeys] containsObject:@"data"]) {
  206. NSDictionary *data = dataDict[@"data"];
  207. if ([[data allKeys] containsObject:@"text"]) {
  208. NSString *pasteboardStr = [data objectForKey:@"text"];
  209. UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
  210. pasteboard.string = pasteboardStr;
  211. }
  212. }
  213. }
  214. else if ([messageType isEqualToString:@"downAdnInstallRep"]){
  215. if ([[dataDict allKeys] containsObject:@"data"]) {
  216. NSDictionary *data = dataDict[@"data"];
  217. if ([[data allKeys] containsObject:@"status"]) {
  218. NSString *status = [data objectForKey:@"status"];
  219. if ([status isEqualToString:@"1"]) {
  220. mainBlock(^{
  221. // [[iToast makeText:@"App下载完成"] show];
  222. });
  223. }else if ([status isEqualToString:@"0"]){
  224. mainBlock(^{
  225. //[[iToast makeText:@"App下载中"] show];
  226. });
  227. }
  228. }
  229. }
  230. }
  231. else if ([messageType isEqualToString:@"shakeit"]){
  232. HLog(@"\n-----摇一摇成功------");
  233. }else if ([messageType isEqualToString:@"keyboardFeedbackBean"]){/*调起键盘*/
  234. HLog(@"\n-----待处理 调起键盘------");
  235. // [weakSelf keyboardFeedbackBeanFun];
  236. }else if ([messageType isEqualToString:@"FileRandomReady"]
  237. ||[messageType isEqualToString:@"FilePartReady"]
  238. ){/*申请文件上传得到答复*/
  239. [weakSelf applyUploadFileServiceResponseFun:dataDict];
  240. }
  241. else if ([messageType isEqualToString:@"uploadFileRandomRet"]
  242. ||[messageType isEqualToString:@"uploadFilePartRet"]
  243. ){/*文件上传得到答复*/
  244. [weakSelf upLoadFileFunServiceResponseFun:dataDict];
  245. }
  246. else if ([messageType isEqualToString:@"backUpFileRandomReady"]
  247. ||[messageType isEqualToString:@"backUpPartReady"]
  248. ){/*文件备份得到答复*/
  249. [weakSelf applyBackupsFileServiceResponseFun:dataDict];
  250. }
  251. else if ([messageType isEqualToString:@"backUpFileRandomRet"]
  252. ||[messageType isEqualToString:@"backUpFilePartRet"]){/*文件备份得到答复*/
  253. [weakSelf backupsFileFunServiceResponseFun:dataDict];
  254. }
  255. else if ([messageType isEqualToString:@"getBaseInfo"]){/*获取云机的基本信息*/
  256. [weakSelf getCouldPhoneBaseInfoResponseFun:dataDict];
  257. }
  258. else if ([messageType isEqualToString:@"getSysInfo"]){/*获取云机的系统信息*/
  259. [weakSelf getCouldPhoneSysInfoResponseFun:dataDict];
  260. }
  261. else if ([messageType isEqualToString:@"TvStatus"]){/*获取TV投屏信息*/
  262. [weakSelf getCouldPhoneTvStatusResponseFun:dataDict];
  263. }
  264. else if ([messageType isEqualToString:@"TvOff"]){/*关闭TV投屏*/
  265. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  266. [weakSelf getTvStatusFun];
  267. });
  268. }
  269. else if ([messageType isEqualToString:@"wakeupTV"]){/*开启TV投屏*/
  270. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  271. [weakSelf getTvStatusFun];
  272. });
  273. }
  274. else if ([messageType isEqualToString:@"reboot"]){/*重启*/
  275. //[weakSelf stopForceStartTimerFun];
  276. }
  277. else if ([messageType isEqualToString:@"mkdir"]){/*创建文件夹*/
  278. [weakSelf createFolderResponseFun:dataDict];
  279. }
  280. else if ([messageType isEqualToString:@"getBackupPath"]){/*创建文件夹*/
  281. [weakSelf getFolderListResponseFun:dataDict];
  282. }
  283. else if ([messageType isEqualToString:@"search"]){/*创建文件夹*/
  284. [weakSelf searchFileListResponseFun:dataDict];
  285. }
  286. else if ([messageType isEqualToString:@"getExtraFiles"]){/*创建文件夹*/
  287. [weakSelf getExtraFilesResponseFun:dataDict];
  288. }
  289. else if ([messageType isEqualToString:@"extraMediaEvent"]){/*磁盘插拔*/
  290. [weakSelf getExtraMediaEventResponseFun:dataDict];
  291. [weakSelf getExtraFilesListFun];
  292. }
  293. else if ([messageType isEqualToString:@"reset"]){/**/
  294. [weakSelf deleteCommandSendTaskFunWith:@"reset"];
  295. }
  296. } failure:^(NSError *error) {
  297. ksharedAppDelegate.isWebSockLinkOKAginType = NO;
  298. [[errorAlertTool shareInstance] showNetErrorAlertFun:2 didClickBut:^(NSInteger tag) {
  299. }];
  300. [self WebSocketNeedRelinkFun];
  301. }];
  302. }
  303. }
  304. - (void)keepWebSocketOKFun
  305. {
  306. self.webSocketTime = 0;
  307. }
  308. - (void)WebSocketNeedRelinkFun
  309. {
  310. self.webSocketTime = 0;
  311. if(self.commandChannelManager){
  312. [self opencommandChannelManagerrc_openURL];
  313. }
  314. }
  315. - (void)webScoketTimerChange {
  316. //处理websockt是否断开
  317. self.webSocketTime += 5;
  318. //处理其他任务
  319. self.webSocketTaskTime += 5;
  320. if(self.webSocketTime >= 10)
  321. {
  322. [self WebSocketNeedRelinkFun];
  323. }
  324. if(self.webSocketTaskTime >= 10)
  325. {
  326. self.webSocketTaskTime = 0;
  327. [self checkAllTaskFun];
  328. }
  329. }
  330. - (void)checkAllTaskFun
  331. {
  332. RCSocketCloudPhoneStatus status = [self.commandChannelManager rc_socketStatus];
  333. //HLog(@"rc_socketStatus:%ld",status)
  334. if(status == RCSocketCloudPhoneStatusFailed
  335. ||status == RCSocketCloudPhoneStatusClosedByServer
  336. ||status == RCSocketCloudPhoneStatusClosedByUser
  337. ||!ksharedAppDelegate.isWebSockLinkOKAginType//断开了
  338. )
  339. {
  340. HLog(@"WebSocket 链接异常:%ld",status);
  341. return;
  342. }
  343. else{
  344. HLog(@"WebSocket 链接正常:%ld",status);
  345. }
  346. //处理相册备份
  347. [[backupsFileManager shareInstance] checkReBackupsFileFun];
  348. [[uploadFileManager shareInstance] checkReUploadFileFun];
  349. [[downloadManager shareInstance] checkReDownloadFileFun];
  350. [[downloadThumbnailManager shareInstance] checkReDownloadThumbnailFileFun];
  351. [self checkCommandSendTaskFun];
  352. if([AudioSessionObject shareManager].isBackgroundType){
  353. [self checkFileTransfeTaskFun];
  354. }
  355. HLog(@"checkAllTaskFun");
  356. }
  357. //检测是否正在进行的文件传输任务
  358. - (void)checkFileTransfeTaskFun
  359. {
  360. BOOL isBackupsingType = [[backupsFileManager shareInstance] checkBackupsingFun];
  361. BOOL isUploadingType = [[uploadFileManager shareInstance] checkUploadingFun];
  362. BOOL isDownloadingType = [[downloadManager shareInstance] checkDownloadingFun];
  363. BOOL isBackground = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_file_Transfe_working_background)];
  364. BOOL isNasDownloadingType = [customDownloadManager shareManager].isDownLoadIngType;
  365. if ((isBackupsingType || isUploadingType || isDownloadingType ||isNasDownloadingType) && isBackground) {
  366. HLog(@"后台保活中");
  367. [cachesFileManager writeLogsWithMsg:@"Background working"];
  368. }
  369. else{
  370. HLog(@"停止后台保活");
  371. [cachesFileManager writeLogsWithMsg:@"stop Background working"];
  372. [[AudioSessionObject shareManager] stopBackgroundActiveFun];
  373. }
  374. }
  375. -(void)checkCommandSendTaskFun
  376. {
  377. if(commandSendCheckArr && commandSendCheckArr.count >0){
  378. for (commandSendCheckModel *model in commandSendCheckArr) {
  379. if(model.reSendNum < 2){
  380. model.reSendNum ++;
  381. if(model.commandStr){
  382. [self send_data:model.commandStr];
  383. HLog(@"\n\n\n任务重发 重发次数:%ld 指令:%@\n\n\n",model.reSendNum,model.commandStr);
  384. }
  385. // if([model.type isEqualToString:@"offline_notification"]){
  386. // model.reSendNum = 1;//只要不收到
  387. // }
  388. }
  389. }
  390. }
  391. }
  392. - (void)send_data:(NSString *)dataStr
  393. {
  394. [self.commandChannelManager rc_sendData:dataStr];
  395. }
  396. #pragma mark 盒子链接成功后需要处理的各种各样事情
  397. - (void)handlAllMsgAfterDidLinkFun
  398. {
  399. _isRebootIngType = NO;
  400. _isResetingType = NO;
  401. _isChangeBoxType = NO;
  402. ksharedAppDelegate.isWebSockLinkOKAginType = YES;
  403. //获取云机尺寸 兼容 720*1080 &1080*1920 不同分辨率的展示和触控
  404. NSString *getPhoneSizeStr = [RCCommandHelp getPhoneSizecommand];
  405. [self send_data:getPhoneSizeStr];
  406. //判断是否为需要改机
  407. BOOL isNeedRandomChangeParams = [HWDataManager getBoolWithKey:Const_need_random_Change_Params];
  408. if(isNeedRandomChangeParams)
  409. {
  410. NSString *commondStr = @"{\"type\":\"randomChangeParams\"}";
  411. [self send_data:commondStr];
  412. [HWDataManager setBoolWithKey:Const_need_random_Change_Params value:NO];
  413. }
  414. [self fristConnectNeedGiveAMsgFun];
  415. [self updateCopydata];
  416. // 报链接失败 后面又连接上了
  417. [[errorAlertTool shareInstance] dismissErrorAlertFun];
  418. //处理相册备份
  419. [[backupsFileManager shareInstance] AutohandlePhotosBackupsFun];
  420. //获取磁盘外挂
  421. [self getExtraFilesListFun];
  422. [self getBaseInfoFun];
  423. [self getTvStatusFun];
  424. }
  425. #pragma mark 盒子第一次连接成功 给ws发送信息 单点登录 把其他账号挤下去
  426. - (void)fristConnectNeedGiveAMsgFun{
  427. if(!_didSendfristMsg )
  428. {
  429. [self getSysInfoFun];
  430. NSString *curOaidStr = [RcGameWQKeyChain getOaidStringFun];
  431. if(!curOaidStr){
  432. curOaidStr = @"";
  433. }
  434. NSString *commondStr = [[NSString alloc] initWithFormat:@"{\"type\":\"forwardMsg\",\"data\":\"offline_notification\",\"sign\":\"%@\"}",curOaidStr];
  435. //NSString *commondStr = @"{\"type\":\"forwardMsg\",\"data\":\"offline_notification\"}";
  436. [self send_data:commondStr];
  437. [self addCommandSendTaskFunWithType:@"offline_notification" WithCommandStr:commondStr];
  438. _didSendfristMsg = YES;
  439. [self getPreferredLanguage];
  440. NSString *commondStr2 = @"{\"type\":\"TvStatus\"}";
  441. [self send_data:commondStr2];
  442. }
  443. }
  444. #pragma mark 语言和市区 同步云机
  445. -(void)getPreferredLanguage
  446. {//{"data":{"language":"zh-CN","timeZone":"Etc/GMT+8"},"type":"setLanguages"}
  447. // iOS 获取设备当前语言的代码
  448. NSString *preferredLanguage = [[[NSBundle mainBundle] preferredLocalizations] firstObject];
  449. HLog(@"当前语言:%@", preferredLanguage);
  450. //en-US 英文 ja-JP 日文
  451. NSArray *arLanguages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
  452. NSLog(@"arLanguages:%@",arLanguages);
  453. ///获取设备当前地区的代码和APP语言环境
  454. NSString *languageCode = [NSLocale preferredLanguages][0];
  455. //目前支持 中文(简体 繁体) 英文 日语
  456. if([languageCode rangeOfString:@"zh-Hans"].location != NSNotFound)
  457. {
  458. preferredLanguage = @"zh-CN";
  459. }
  460. else if([languageCode rangeOfString:@"zh-Hant"].location != NSNotFound)
  461. {
  462. preferredLanguage = @"zh-HK";
  463. }
  464. else if([languageCode rangeOfString:@"ja-"].location != NSNotFound)
  465. {
  466. preferredLanguage = @"ja-JP";
  467. }
  468. else{
  469. preferredLanguage = @"en-US";
  470. }
  471. // if([languageCode rangeOfString:preferredLanguage].location != NSNotFound){
  472. // preferredLanguage = languageCode;
  473. // }
  474. // else{
  475. // preferredLanguage = @"en-US";
  476. // }
  477. NSString*gmtStr = [self UTCOffset];
  478. HLog(@"%@",gmtStr);
  479. // //获取名字,如“GMT+08:00
  480. NSString *commondStr = [NSString stringWithFormat:@"{\"type\":\"setLanguages\",\"data\":{\"language\":\"%@\",\"timeZone\":\"%@\"}}",preferredLanguage,gmtStr];
  481. [self send_data:commondStr];
  482. }
  483. -(NSString *)UTCOffset {
  484. NSTimeZone *localTZ = [NSTimeZone localTimeZone];
  485. float offset = localTZ.secondsFromGMT/3600.0;
  486. if(offset > 0){
  487. return [NSString stringWithFormat:@"Etc/GMT+%g",offset];
  488. }
  489. return [NSString stringWithFormat:@"Etc/GMT%g",offset];
  490. }
  491. #pragma mark 重启云机
  492. - (void)needToRebootFun
  493. {
  494. NSString *commondStr = @"{\"type\":\"reboot\"}";
  495. [self send_data:commondStr];
  496. //添加到任务监听
  497. [self addCommandSendTaskFunWithType:@"reboot" WithCommandStr:commondStr];
  498. //数据埋点
  499. [[netWorkManager shareInstance] DataEmbeddingPointBy:3 withEventValue:@"Cloud_restart"];
  500. _isRebootIngType = YES;
  501. }
  502. - (void)needToResetFun
  503. {
  504. NSString *commondStr = @"{\"type\":\"reset\"}";
  505. [self send_data:commondStr];
  506. //添加到任务监听
  507. [self addCommandSendTaskFunWithType:@"reset" WithCommandStr:commondStr];
  508. //数据埋点
  509. [[netWorkManager shareInstance] DataEmbeddingPointBy:3 withEventValue:@"Cloud_restore_factory"];
  510. _isResetingType = YES;
  511. }
  512. - (void)updateCopydata{
  513. UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
  514. NSString *str = [pasteboard string];
  515. HLog(@"__________%s______%@____",__func__,str);
  516. if ([str rangeOfString:@"CVLUSTERS_NOUSE_"].location != NSNotFound)
  517. {
  518. str = nil;
  519. }
  520. if (str && str.length >0)
  521. {
  522. //HLog(@"hxd111 cutting %@",str);
  523. /*发送数据*/
  524. NSString *dataStr = [RCCommandHelp commandCuttingWithContent:str];
  525. [self.commandChannelManager rc_sendData:dataStr];
  526. //pasteboard.string = @"";
  527. }
  528. }
  529. #pragma mark 获取云机以及外挂磁盘
  530. - (void)getExtraFilesListFun
  531. {
  532. NSString *ExtraCommondStr = [RCCommandHelp getExtraFilesList];
  533. [self send_data:ExtraCommondStr];
  534. }
  535. -(void)addCommandSendTaskFunWithType:(NSString*)type WithCommandStr:(NSString*)commandStr
  536. {
  537. if(!commandSendCheckArr){
  538. commandSendCheckArr = [NSMutableArray new];
  539. }
  540. BOOL didAddType = NO;
  541. for (commandSendCheckModel *model in commandSendCheckArr) {
  542. if([model.type isEqualToString:type]){
  543. didAddType = YES;
  544. model.reSendNum = 0;
  545. model.sendTimerStamp = [iTools getNowTimeStamp];
  546. break;
  547. }
  548. }
  549. if(!didAddType){
  550. commandSendCheckModel *model = [commandSendCheckModel new];
  551. model.commandStr = commandStr;
  552. model.type = type;
  553. model.reSendNum = 0;
  554. model.sendTimerStamp = [iTools getNowTimeStamp];
  555. [commandSendCheckArr addObject:model];
  556. }
  557. }
  558. -(void)deleteCommandSendTaskFunWith:(NSString*)type
  559. {
  560. if(commandSendCheckArr && commandSendCheckArr.count >0){
  561. NSArray *taskArr = [NSArray arrayWithArray:commandSendCheckArr];
  562. for (commandSendCheckModel *model in taskArr) {
  563. if([type isEqualToString:model.type]){
  564. [commandSendCheckArr removeObject:model];
  565. }
  566. }
  567. }
  568. }
  569. #pragma mark wifi handle
  570. - (void)sync_wifiBackHandleFun
  571. {
  572. [self.commandChannelManager rc_sendData:[RCCommandHelp noSyncWifiBack]];
  573. [[iToast makeText:NSLocalizedString(@"player_Tip_ios_no_wifi_Sync",nil)] show];
  574. }
  575. - (void)getCouldPhoneBaseInfoResponseFun:(NSDictionary *)dataDict
  576. {
  577. couldPhoneBaseInfoModel *model = [[couldPhoneBaseInfoModel alloc] initWithDictionary:dataDict error:nil];
  578. [[NSNotificationCenter defaultCenter] postNotificationName:getCouldPhoneBaseInfoNotification object:model];
  579. }
  580. - (void)getCouldPhoneSysInfoResponseFun:(NSDictionary *)dataDict{
  581. couldphoneSysInfoModel *model = [[couldphoneSysInfoModel alloc] initWithDictionary:dataDict error:nil];
  582. [[NSNotificationCenter defaultCenter] postNotificationName:getCouldPhoneSysInfoNotification object:model];
  583. NSString *hostImgVer = model.data.data.hostImgVer;
  584. NSString *MyNewVersion = model.data.data.MyNewVersion;
  585. //test code
  586. // hostImgVer = @"1.2.3";
  587. // MyNewVersion = @"1.2.0";
  588. //判断当前版本号 待更新版本
  589. if (!hostImgVer || hostImgVer.length < 3
  590. ||!MyNewVersion || MyNewVersion.length < 3) {
  591. return;
  592. }
  593. NSArray *versionArr = [hostImgVer componentsSeparatedByString:@"."];
  594. NSArray *MyNewVersionArr = [MyNewVersion componentsSeparatedByString:@"."];
  595. NSInteger versionArrCount = versionArr.count;
  596. NSInteger MyNewVersionArrCount = MyNewVersionArr.count;
  597. NSInteger maxCount = versionArrCount < MyNewVersionArrCount ? versionArrCount:MyNewVersionArrCount;
  598. BOOL isNeedShowType = NO;
  599. //判断是否要更新镜像框
  600. if(maxCount > 0){
  601. for (int i=0; i<maxCount; i++) {
  602. NSString * numberStr1 = versionArr[i];
  603. NSString * numberStr2 = MyNewVersionArr[i];
  604. if(numberStr2.intValue > numberStr1.intValue){
  605. isNeedShowType =YES;
  606. break;
  607. }
  608. }
  609. }
  610. if(isNeedShowType){
  611. ksharedAppDelegate.isNeedShowImageNewType = YES;
  612. }
  613. //是否禁用文件传输 (1.3以及以上的镜像可以使用文件传输)
  614. if(versionArr.count >= 3)
  615. {
  616. NSString * oneStr = versionArr[0];
  617. NSString * twoStr = versionArr[1];
  618. NSString * threeStr = versionArr[2];
  619. if(oneStr.integerValue <=1 && twoStr.integerValue <=3 && threeStr.integerValue <=0){//禁用
  620. ksharedAppDelegate.DisabledFileTransferType = YES;
  621. if(MyNewVersionArr.count >= 3)
  622. {
  623. NSString * newOneStr = MyNewVersionArr[0];
  624. NSString * newTwoStr = MyNewVersionArr[1];
  625. NSString * newThreeStr = MyNewVersionArr[2];
  626. if(newOneStr.integerValue >=1 && newTwoStr.integerValue >=3 && newThreeStr.integerValue >= 1){
  627. ksharedAppDelegate.isImageNewFor130 = YES;
  628. }
  629. else{
  630. ksharedAppDelegate.isImageNewFor130 = NO;
  631. }
  632. }
  633. }
  634. else{
  635. ksharedAppDelegate.DisabledFileTransferType = NO;
  636. }
  637. }
  638. }
  639. - (void)getCouldPhoneTvStatusResponseFun:(NSDictionary *)dataDict
  640. {
  641. TvStatusModel *model = [[TvStatusModel alloc] initWithDictionary:dataDict error:nil];
  642. ksharedAppDelegate.TvStatusMod = model;
  643. [[NSNotificationCenter defaultCenter] postNotificationName:getCouldPhoneTvStatusNotification object:model];
  644. // if(![model.msg containsString:@"PushStreamBActivity"])
  645. // {
  646. // return;
  647. // }
  648. //
  649. // UIViewController*topVc = self.navigationController.viewControllers.lastObject;
  650. // if([topVc isKindOfClass:[PlayerViewController class]]){
  651. // [[iToast makeText:NSLocalizedString(@"tv_p2p_ing",nil)] show];
  652. // }
  653. }
  654. - (void)createFolderResponseFun:(NSDictionary *)dataDict
  655. {
  656. couldPhoneCommonModel *model = [[couldPhoneCommonModel alloc] initWithDictionary:dataDict error:nil];
  657. if(model){
  658. NSNumber *curNum = [NSNumber numberWithInteger:model.status];
  659. [[NSNotificationCenter defaultCenter] postNotificationName:createFolderDoneNotification object:curNum];/*发送通知*/
  660. }
  661. }
  662. - (void)getFolderListResponseFun:(NSDictionary *)dataDict
  663. {
  664. [[NSNotificationCenter defaultCenter] postNotificationName:getFolderListDoneNotification object:dataDict];/*发送通知*/
  665. }
  666. - (void)searchFileListResponseFun:(NSDictionary *)dataDict
  667. {
  668. [[NSNotificationCenter defaultCenter] postNotificationName:searchFileListDoneNotification object:dataDict];/*发送通知*/
  669. }
  670. #pragma mark 获取云机已经外挂产品
  671. - (void)getExtraFilesResponseFun:(NSDictionary *)dataDict
  672. {
  673. cloudPhoneExtraFileListModel *model = [[cloudPhoneExtraFileListModel alloc] initWithDictionary:dataDict error:nil];
  674. ksharedAppDelegate.cloudPhoneExtraFileListMod = model;
  675. [[NSNotificationCenter defaultCenter] postNotificationName:getExtraFilesDoneNotification object:dataDict];/*发送通知*/
  676. }
  677. - (void)getExtraMediaEventResponseFun:(NSDictionary *)dataDict
  678. {
  679. extraMediaEventModel *model = [[extraMediaEventModel alloc] initWithDictionary:dataDict error:nil];
  680. NSString *tip = nil;
  681. if(model.data.event == 0){
  682. tip = NSLocalizedString(@"disk_insertion_tip",nil);
  683. [self showInsertPopViewFun:model.data.name];
  684. }
  685. else if(model.data.event == 1){
  686. tip = NSLocalizedString(@"disk_extract_tip",nil);
  687. }
  688. else if(model.data.event == 2){
  689. tip = NSLocalizedString(@"disk_save_extract_tip",nil);
  690. }
  691. NSString *totalTips = [[NSString alloc] initWithFormat:@"%@%@",model.data.name,tip];
  692. mainBlock(^{
  693. [[iToast makeText:totalTips] show];
  694. });
  695. }
  696. #pragma mark 显示插入UI弹框
  697. - (void)showInsertPopViewFun:(NSString*)name
  698. {
  699. if(self->curUSBInsertPopV){
  700. [self->curUSBInsertPopV removeFromSuperview];
  701. self->curUSBInsertPopV = nil;
  702. }
  703. self->curUSBInsertPopV = [[USBInsertPopView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_W, SCREEN_H) withName:name];
  704. [[iTools getKeyWindow] addSubview:self->curUSBInsertPopV];
  705. }
  706. - (void)createBackupsFolderBy:(NSString*)backupsDefaultPath
  707. {
  708. NSString *folderName = backupsDefaultPath;
  709. if(folderName && folderName.length >0){
  710. NSString * commandStr = [RCCommandHelp applyForCreateFolderwithFolderName:folderName];
  711. [self.commandChannelManager rc_sendData:commandStr];
  712. }
  713. }
  714. - (void)getBackupFolderListFun
  715. {
  716. NSString * commandStr = [RCCommandHelp getCreateFolderList];
  717. [self.commandChannelManager rc_sendData:commandStr];
  718. }
  719. - (void)searchFileListBeginFun:(NSMutableDictionary *)dict
  720. {
  721. NSMutableDictionary *objectDict = dict;
  722. NSNumber *curNum = @1;
  723. if ([[objectDict allKeys] containsObject:@"type"]) {
  724. curNum = [objectDict objectForKey:@"type"];
  725. }
  726. NSString *pathStr = @"";
  727. if ([[objectDict allKeys] containsObject:@"path"]) {
  728. pathStr = [objectDict objectForKey:@"path"];
  729. }
  730. NSString *fileType = @"video";
  731. if(curNum.boolValue)
  732. {
  733. fileType = @"jpg";
  734. }
  735. NSString * commandStr = [RCCommandHelp searchCouldPhoneFilewithType:fileType withPath:pathStr];
  736. [self.commandChannelManager rc_sendData:commandStr];
  737. }
  738. #pragma mark 获取云机基本信息
  739. - (void)getBaseInfoFun
  740. {
  741. NSString *commondStr = @"{\"type\":\"getBaseInfo\"}";
  742. [self send_data:commondStr];
  743. }
  744. #pragma mark 获取云机系统镜像等信息
  745. - (void)getSysInfoFun
  746. {
  747. NSString *commondStr = @"{\"type\":\"getSysInfo\"}";
  748. [self send_data:commondStr];
  749. }
  750. #pragma mark 云机截图保存到云机图库
  751. - (void)screenshotInCloudPhoneFun{
  752. NSString*taskUid = [iTools getTaskUidStr];
  753. NSString *commondStr = [RCCommandHelp commandCloudPhoneScreenshotWithTaskUid:taskUid];
  754. [self send_data:commondStr];
  755. }
  756. #pragma mark 获取TV投屏状态
  757. - (void)getTvStatusFun
  758. {
  759. NSString *commondStr = @"{\"type\":\"TvStatus\"}";
  760. [self send_data:commondStr];
  761. }
  762. #pragma mark 关闭TV投屏状态
  763. - (void)offTvFun
  764. {
  765. NSString *commondStr = @"{\"type\":\"TvOff\"}";
  766. [self send_data:commondStr];
  767. }
  768. #pragma mark 开启TV投屏状态
  769. - (void)onTvFun
  770. {
  771. NSString *commondStr = @"{\"type\":\"wakeupTV\"}";
  772. [self send_data:commondStr];
  773. }
  774. #pragma mark 单点登录被挤下线弹框
  775. - (void)LogoutByOtherFun
  776. {
  777. if(logoutAlertVC){
  778. return;
  779. }
  780. //通知音视频断开链接
  781. [[NSNotificationCenter defaultCenter] postNotificationName:logoutByOtherNotification object:nil];
  782. //yyyy-MM-dd HH:mm:ss
  783. NSString*dateStr = [iTools getNowTimeString2];
  784. if(dateStr && dateStr.length == 19){
  785. dateStr = [dateStr substringWithRange:NSMakeRange(11, 5)];
  786. }
  787. NSString *LogoutTimerStr = [[NSString alloc] initWithFormat:@"%@%@%@",NSLocalizedString(@"single_sign_on_Tips_one",nil),dateStr,NSLocalizedString(@"single_sign_on_Tips_two",nil)];
  788. NSString * loginAgainStr = NSLocalizedString(@"single_sign_on_login_again",nil);
  789. BOOL isOkBtnHighlight = YES;
  790. if(![connectDeviceManager shareInstance].DeviceThirdIdMod.data.isPrivacyMode){
  791. loginAgainStr = @"";
  792. isOkBtnHighlight = NO;
  793. }
  794. _isLogoutByOtherType = YES;
  795. _didSendfristMsg = NO;
  796. //被挤下线 ws断开
  797. [self.commandChannelManager rc_close];
  798. self.commandChannelManager = nil;
  799. /*弹窗提示重启*/
  800. //KWeakSelf
  801. logoutAlertVC = [[ComontAlretViewController alloc] initWithTiTle:NSLocalizedString(@"single_sign_on_Tips_logout",nil)
  802. msg:LogoutTimerStr
  803. imageStr:@""
  804. cancelTitle:NSLocalizedString(@"single_sign_on_exit",nil)
  805. okTitle:loginAgainStr isOkBtnHighlight:isOkBtnHighlight
  806. didClickOk:^{
  807. //[weakSelf tryAgain];
  808. //[[webSocketManager shareInstance] WebSocketNeedRelinkFun];
  809. self->_isLogoutByOtherType = NO;
  810. [[NSNotificationCenter defaultCenter] postNotificationName:lockBypwdNotification object:nil];
  811. } didClickCancel:^{
  812. exit(0);/*强制退出app*/
  813. }];
  814. logoutAlertVC.modalPresentationStyle = UIModalPresentationCustom;
  815. [[iTools appRootViewController] presentViewController:logoutAlertVC animated:YES completion:^{
  816. self->logoutAlertVC.view.superview.backgroundColor = [UIColor clearColor];
  817. }];
  818. }
  819. @end