webSocketManager.m 38 KB

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