webSocketManager.m 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056
  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. [self initOtherFun];//timer 检测链接情况
  75. NSString *wsPort = @"";
  76. if([connectDeviceManager shareInstance].isPingOk
  77. && [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWiFi){
  78. _curIp = [connectDeviceManager shareInstance].DeviceThirdIdMod.data.ip;
  79. wsPort = @"9300";
  80. }
  81. else if([connectDeviceManager shareInstance].tcpPortStr
  82. &&[connectDeviceManager shareInstance].tcpPortStr.length > 0) {
  83. _curIp = ruiyunlinkIp;
  84. wsPort = [[connectDeviceManager shareInstance] tcpPortStr];
  85. }
  86. else{
  87. //
  88. HLog(@"非内网而且瑞云未链接完成");
  89. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  90. [weakSelf opencommandChannelManagerrc_openURL];
  91. });
  92. return;
  93. }
  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. }
  649. - (void)getCouldPhoneTvStatusResponseFun:(NSDictionary *)dataDict
  650. {
  651. TvStatusModel *model = [[TvStatusModel alloc] initWithDictionary:dataDict error:nil];
  652. ksharedAppDelegate.TvStatusMod = model;
  653. [[NSNotificationCenter defaultCenter] postNotificationName:getCouldPhoneTvStatusNotification object:model];
  654. // if(![model.msg containsString:@"PushStreamBActivity"])
  655. // {
  656. // return;
  657. // }
  658. //
  659. // UIViewController*topVc = self.navigationController.viewControllers.lastObject;
  660. // if([topVc isKindOfClass:[PlayerViewController class]]){
  661. // [[iToast makeText:NSLocalizedString(@"tv_p2p_ing",nil)] show];
  662. // }
  663. }
  664. - (void)createFolderResponseFun:(NSDictionary *)dataDict
  665. {
  666. couldPhoneCommonModel *model = [[couldPhoneCommonModel alloc] initWithDictionary:dataDict error:nil];
  667. if(model){
  668. NSNumber *curNum = [NSNumber numberWithInteger:model.status];
  669. [[NSNotificationCenter defaultCenter] postNotificationName:createFolderDoneNotification object:curNum];/*发送通知*/
  670. }
  671. }
  672. - (void)getFolderListResponseFun:(NSDictionary *)dataDict
  673. {
  674. [[NSNotificationCenter defaultCenter] postNotificationName:getFolderListDoneNotification object:dataDict];/*发送通知*/
  675. }
  676. - (void)searchFileListResponseFun:(NSDictionary *)dataDict
  677. {
  678. [[NSNotificationCenter defaultCenter] postNotificationName:searchFileListDoneNotification object:dataDict];/*发送通知*/
  679. }
  680. #pragma mark 获取云机已经外挂产品
  681. - (void)getExtraFilesResponseFun:(NSDictionary *)dataDict
  682. {
  683. cloudPhoneExtraFileListModel *model = [[cloudPhoneExtraFileListModel alloc] initWithDictionary:dataDict error:nil];
  684. ksharedAppDelegate.cloudPhoneExtraFileListMod = model;
  685. [[NSNotificationCenter defaultCenter] postNotificationName:getExtraFilesDoneNotification object:dataDict];/*发送通知*/
  686. }
  687. - (void)getExtraMediaEventResponseFun:(NSDictionary *)dataDict
  688. {
  689. extraMediaEventModel *model = [[extraMediaEventModel alloc] initWithDictionary:dataDict error:nil];
  690. NSString *tip = nil;
  691. if(model.data.event == 0){
  692. tip = NSLocalizedString(@"disk_insertion_tip",nil);
  693. [self showInsertPopViewFun:model.data.name];
  694. }
  695. else if(model.data.event == 1){
  696. tip = NSLocalizedString(@"disk_extract_tip",nil);
  697. }
  698. else if(model.data.event == 2){
  699. tip = NSLocalizedString(@"disk_save_extract_tip",nil);
  700. }
  701. NSString *totalTips = [[NSString alloc] initWithFormat:@"%@%@",model.data.name,tip];
  702. mainBlock(^{
  703. [[iToast makeText:totalTips] show];
  704. });
  705. }
  706. #pragma mark 显示插入UI弹框
  707. - (void)showInsertPopViewFun:(NSString*)name
  708. {
  709. if(self->curUSBInsertPopV){
  710. [self->curUSBInsertPopV removeFromSuperview];
  711. self->curUSBInsertPopV = nil;
  712. }
  713. self->curUSBInsertPopV = [[USBInsertPopView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_W, SCREEN_H) withName:name];
  714. [[iTools getKeyWindow] addSubview:self->curUSBInsertPopV];
  715. }
  716. - (void)createBackupsFolderBy:(NSString*)backupsDefaultPath
  717. {
  718. NSString *folderName = backupsDefaultPath;
  719. if(folderName && folderName.length >0){
  720. NSString * commandStr = [RCCommandHelp applyForCreateFolderwithFolderName:folderName];
  721. [self.commandChannelManager rc_sendData:commandStr];
  722. }
  723. }
  724. - (void)getBackupFolderListFun
  725. {
  726. NSString * commandStr = [RCCommandHelp getCreateFolderList];
  727. [self.commandChannelManager rc_sendData:commandStr];
  728. }
  729. - (void)searchFileListBeginFun:(NSMutableDictionary *)dict
  730. {
  731. NSMutableDictionary *objectDict = dict;
  732. NSNumber *curNum = @1;
  733. if ([[objectDict allKeys] containsObject:@"type"]) {
  734. curNum = [objectDict objectForKey:@"type"];
  735. }
  736. NSString *pathStr = @"";
  737. if ([[objectDict allKeys] containsObject:@"path"]) {
  738. pathStr = [objectDict objectForKey:@"path"];
  739. }
  740. NSString *fileType = @"video";
  741. if(curNum.boolValue)
  742. {
  743. fileType = @"jpg";
  744. }
  745. NSString * commandStr = [RCCommandHelp searchCouldPhoneFilewithType:fileType withPath:pathStr];
  746. [self.commandChannelManager rc_sendData:commandStr];
  747. }
  748. #pragma mark 获取云机基本信息
  749. - (void)getBaseInfoFun
  750. {
  751. NSString *commondStr = @"{\"type\":\"getBaseInfo\"}";
  752. [self send_data:commondStr];
  753. }
  754. #pragma mark 获取云机系统镜像等信息
  755. - (void)getSysInfoFun
  756. {
  757. NSString *commondStr = @"{\"type\":\"getSysInfo\"}";
  758. [self send_data:commondStr];
  759. }
  760. #pragma mark 云机截图保存到云机图库
  761. - (void)screenshotInCloudPhoneFun{
  762. NSString*taskUid = [iTools getTaskUidStr];
  763. NSString *commondStr = [RCCommandHelp commandCloudPhoneScreenshotWithTaskUid:taskUid];
  764. [self send_data:commondStr];
  765. }
  766. #pragma mark 获取TV投屏状态
  767. - (void)getTvStatusFun
  768. {
  769. NSString *commondStr = @"{\"type\":\"TvStatus\"}";
  770. [self send_data:commondStr];
  771. }
  772. #pragma mark 关闭TV投屏状态
  773. - (void)offTvFun
  774. {
  775. NSString *commondStr = @"{\"type\":\"TvOff\"}";
  776. [self send_data:commondStr];
  777. }
  778. #pragma mark 开启TV投屏状态
  779. - (void)onTvFun
  780. {
  781. NSString *commondStr = @"{\"type\":\"wakeupTV\"}";
  782. [self send_data:commondStr];
  783. }
  784. #pragma mark 告诉别的ws收到的挤下线消息
  785. - (void)didReceiveLogoutMsgFun
  786. {
  787. NSString *curOaidStr = [RcGameWQKeyChain getOaidStringFun];
  788. if(!curOaidStr){
  789. curOaidStr = @"";
  790. }
  791. NSString *commondStr = [[NSString alloc] initWithFormat:@"{\"type\":\"forwardMsg\",\"data\":\"only one socket2\",\"sign\":\"%@\"}",curOaidStr];
  792. //NSString *commondStr = @"{\"type\":\"forwardMsg\",\"data\":\"offline_notification\"}";
  793. [self send_data:commondStr];
  794. }
  795. #pragma mark 单点登录被挤下线弹框
  796. - (void)LogoutByOtherFun
  797. {
  798. if(logoutAlertVC){
  799. return;
  800. }
  801. [self didReceiveLogoutMsgFun];
  802. //通知音视频断开链接
  803. [[NSNotificationCenter defaultCenter] postNotificationName:logoutByOtherNotification object:nil];
  804. //yyyy-MM-dd HH:mm:ss
  805. NSString*dateStr = [iTools getNowTimeString2];
  806. if(dateStr && dateStr.length == 19){
  807. dateStr = [dateStr substringWithRange:NSMakeRange(11, 5)];
  808. }
  809. NSString *LogoutTimerStr = [[NSString alloc] initWithFormat:@"%@%@%@",NSLocalizedString(@"single_sign_on_Tips_one",nil),dateStr,NSLocalizedString(@"single_sign_on_Tips_two",nil)];
  810. NSString * loginAgainStr = NSLocalizedString(@"single_sign_on_login_again",nil);
  811. BOOL isOkBtnHighlight = YES;
  812. if(![connectDeviceManager shareInstance].DeviceThirdIdMod.data.isPrivacyMode){
  813. loginAgainStr = @"";
  814. isOkBtnHighlight = NO;
  815. }
  816. _isLogoutByOtherType = YES;
  817. _didSendfristMsg = NO;
  818. _isWaitShowLogoutAlert = YES;
  819. //被挤下线 ws断开
  820. [self.commandChannelManager rc_close];
  821. self.commandChannelManager = nil;
  822. if([DFPlayer sharedPlayer].currentAudioModel
  823. &&([DFPlayer sharedPlayer].state == DFPlayerStateBuffering
  824. || [DFPlayer sharedPlayer].state == DFPlayerStatePlaying)
  825. ){
  826. [[DFPlayer sharedPlayer] df_pause];
  827. }
  828. if(ksharedAppDelegate.isDidShowPwdType){
  829. KWeakSelf
  830. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  831. [weakSelf LogoutByOtherFun];
  832. HLog(@"weakSelf LogoutByOtherFun")
  833. });
  834. return;
  835. }
  836. _isWaitShowLogoutAlert = NO;;
  837. /*弹窗提示重启*/
  838. //KWeakSelf
  839. logoutAlertVC = [[ComontAlretViewController alloc] initWithTiTle:NSLocalizedString(@"single_sign_on_Tips_logout",nil)
  840. msg:LogoutTimerStr
  841. imageStr:@""
  842. cancelTitle:NSLocalizedString(@"single_sign_on_exit",nil)
  843. okTitle:loginAgainStr isOkBtnHighlight:isOkBtnHighlight
  844. didClickOk:^{
  845. //[weakSelf tryAgain];
  846. //[[webSocketManager shareInstance] WebSocketNeedRelinkFun];
  847. self->_isLogoutByOtherType = NO;
  848. self->logoutAlertVC = nil;
  849. [[NSNotificationCenter defaultCenter] postNotificationName:lockBypwdNotification object:nil];
  850. } didClickCancel:^{
  851. exit(0);/*强制退出app*/
  852. }];
  853. logoutAlertVC.modalPresentationStyle = UIModalPresentationCustom;
  854. [[iTools appRootViewController] presentViewController:logoutAlertVC animated:YES completion:^{
  855. self->logoutAlertVC.view.superview.backgroundColor = [UIColor clearColor];
  856. }];
  857. }
  858. @end