webSocketManager.m 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. //
  2. // webSocketManager.m
  3. // 双子星云手机
  4. //
  5. // Created by xd h on 2024/6/20.
  6. //
  7. #import "webSocketManager.h"
  8. @interface webSocketManager ()
  9. {
  10. NSMutableArray *commandSendCheckArr;//需要检测任务是否发出的的指令
  11. }
  12. @property(copy,nonatomic)NSString *curIp;
  13. /**定时器计数*/
  14. @property (nonatomic, assign) NSInteger webSocketTime;
  15. /**定时器计数 任务检测*/
  16. @property (nonatomic, assign) NSInteger webSocketTaskTime;
  17. @property (nonatomic, copy) NSTimer *timer; // 定时器-控制按钮
  18. //第一次链接设备 要发送指令信息 实现单点登录
  19. @property (nonatomic, assign)BOOL didSendfristMsg;
  20. @end
  21. @implementation webSocketManager
  22. static webSocketManager *webSocketManagerInstance = nil;
  23. +(webSocketManager *)shareInstance;
  24. {
  25. static dispatch_once_t onceToken;
  26. dispatch_once(&onceToken, ^{
  27. webSocketManagerInstance = [[webSocketManager alloc] init];
  28. });
  29. return webSocketManagerInstance;
  30. }
  31. - (void)initOtherFun
  32. {
  33. if(_timer){
  34. //[_timer invalidate];
  35. return;
  36. }
  37. _timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(timerChange) userInfo:nil repeats:YES];
  38. [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
  39. commandSendCheckArr = [NSMutableArray new];
  40. }
  41. - (void)opencommandChannelManagerrc_openURL
  42. {
  43. if(self.commandChannelManager){
  44. if([self.commandChannelManager rc_socketStatus] == RCSocketCloudPhoneStatusConnected
  45. ||[self.commandChannelManager rc_socketStatus] == RCSocketCloudPhoneStatusReceived){
  46. //链接中不处理
  47. HLog(@"WebSocket 链接时已经存在并且链接中");
  48. }
  49. else{
  50. HLog(@"WebSocket 链接时已经存在并且链接失效");
  51. [self.commandChannelManager rc_close];
  52. self.commandChannelManager = nil;
  53. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  54. [self opencommandChannelManagerrc_openURL];
  55. });
  56. }
  57. return;
  58. }
  59. KWeakSelf
  60. //初始化指令通道
  61. self.commandChannelManager = [[RCCommandChannelManager alloc] init];
  62. NSString *wsPort = @"";
  63. if([connectDeviceManager shareInstance].isPingOk
  64. && [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWiFi){
  65. _curIp = [connectDeviceManager shareInstance].DeviceThirdIdMod.data.ip;
  66. wsPort = @"9300";
  67. }
  68. else{
  69. _curIp = ruiyunlinkIp;
  70. wsPort = [[connectDeviceManager shareInstance] tcpPortStr];
  71. }
  72. NSString *instructionsChannelUrl = [NSString stringWithFormat:@"ws://%@:%@/businessChannel",_curIp,wsPort];
  73. if (instructionsChannelUrl && instructionsChannelUrl.length > 0) { //当都有值才可连接
  74. HLog(@"WebSocket11111指令通道连接开始11111 url = %@ ",instructionsChannelUrl);
  75. [self.commandChannelManager rc_openURL:instructionsChannelUrl connected:^{
  76. HLog(@"WebSocket11111指令通道连接成功11111 url = %@ ",instructionsChannelUrl);
  77. if (weakSelf.commandChannelManager.rc_socketStatus == RCSocketCloudPhoneStatusConnected){
  78. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  79. [weakSelf initOtherFun];
  80. [weakSelf handlAllMsgAfterDidLinkFun];
  81. });
  82. }
  83. } receive:^(id message, FLSocketCloudPhoneReceiveType type) {
  84. if([message isKindOfClass:[NSData class]] && [message length] == 0){
  85. if(type == RCSocketCloudPhoneReceiveTypeForPong)
  86. {
  87. [weakSelf keepWebSocketOKFun];
  88. }
  89. return;
  90. }
  91. HLog(@"webSocket指令通道接收消息:------------------\n%@",message);
  92. if([message isKindOfClass:[NSMutableString class]] || [message isKindOfClass:[NSString class]])
  93. {
  94. message = [(NSString *)message dataUsingEncoding:(NSUTF8StringEncoding)];
  95. }
  96. NSError *error = nil;
  97. NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:message options:NSJSONReadingMutableContainers error:&error];
  98. // if(!dataDict){
  99. // [weakSelf handleDownloadResponseFunBy:message];
  100. // return;
  101. // }
  102. //
  103. // if(![dataDict isKindOfClass:[NSDictionary class]]){
  104. // //[__NSCFString allKeys] unrecognized selector sent to ins
  105. // return;
  106. // }
  107. //
  108. // NSString *messageType = dataDict[@"type"];
  109. //
  110. // if ([messageType isEqualToString:@"cutting"]) {
  111. // //[[iToast makeText:@"复制成功"] show];
  112. // }
  113. // else if ([messageType isEqualToString:@"forwardMsgRep"]){/*转发的回复*/
  114. //
  115. // cloudPhoneCommonModel *model = [[cloudPhoneCommonModel alloc] initWithDictionary:dataDict error:nil];
  116. // if(!model){
  117. // return;
  118. // }
  119. //
  120. // if([model.data.msg isEqualToString:@"only one socket"]){
  121. // [weakSelf deleteCommandSendTaskFunWith:@"offline_notification"];
  122. // }
  123. // }
  124. // else if ([messageType isEqualToString:@"forwardMsg"]){/*转发*/
  125. // /*获取指令类型*/
  126. // NSString *code = nil;
  127. // if ([[dataDict allKeys] containsObject:@"data"]) {
  128. // NSDictionary *data = dataDict[@"data"];
  129. //
  130. // if([data isKindOfClass:[NSString class]]){
  131. // NSString * dataStr = (NSString*)data;
  132. // if([dataStr isEqualToString:@"offline_notification"]){
  133. // HLog(@"被别人挤下线了");
  134. // [weakSelf LogoutByOtherFun];
  135. // }
  136. //
  137. // return;
  138. // }
  139. // else if ([data isKindOfClass:[NSDictionary class]] && [[data allKeys] containsObject:@"code"]) {
  140. // code = [data objectForKey:@"code"];
  141. //
  142. // if (![code isKindOfClass:[NSString class]]) {
  143. // code = [NSString stringWithFormat:@"%ld",[code integerValue]];
  144. // }
  145. // }
  146. // }
  147. //
  148. // /*获取用户名*/
  149. // NSString *useName = nil;
  150. // if ([[dataDict allKeys] containsObject:@"data"]) {
  151. // NSDictionary *data = dataDict[@"data"];
  152. // if ([[data allKeys] containsObject:@"userName"]) {
  153. // useName = [data objectForKey:@"userName"];
  154. // }
  155. // }
  156. //
  157. //
  158. // if ([code isEqualToString:@"phoneSizeChange"]){/*分辨率改变*/
  159. // if ([[dataDict allKeys] containsObject:@"data"]) {
  160. // NSDictionary *data = dataDict[@"data"];
  161. // if ([[data allKeys] containsObject:@"width"]) {
  162. // ksharedAppDelegate.couldPhone_W_PHONE = [[data objectForKey:@"width"] integerValue];
  163. // }
  164. // if ([[data allKeys] containsObject:@"height"]) {
  165. // ksharedAppDelegate.couldPhone_H_PHONE = [[data objectForKey:@"height"] integerValue];
  166. // }
  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 ([[dataDict allKeys] containsObject:@"data"]) {
  179. // NSDictionary *data = dataDict[@"data"];
  180. //
  181. // if ([[data allKeys] containsObject:@"status"]) {
  182. // NSInteger status = [[data objectForKey:@"status"] integerValue];
  183. //
  184. // if (status == 0) {/*不是当前设备直接返回*/
  185. // if ([[data allKeys] containsObject:@"width"]) {
  186. // ksharedAppDelegate.couldPhone_W_PHONE = [[data objectForKey:@"width"] integerValue];
  187. // }
  188. // if ([[data allKeys] containsObject:@"height"]) {
  189. // ksharedAppDelegate.couldPhone_H_PHONE = [[data objectForKey:@"height"] integerValue];
  190. // }
  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. //
  202. //
  203. // }
  204. // else if ([messageType isEqualToString:@"sync_wifi"]){
  205. // [weakSelf sync_wifiBackHandleFun];
  206. // }
  207. // else if ([messageType isEqualToString:@"reProduceText"]){
  208. // if ([[dataDict allKeys] containsObject:@"data"]) {
  209. // NSDictionary *data = dataDict[@"data"];
  210. //
  211. // if ([[data allKeys] containsObject:@"text"]) {
  212. // NSString *pasteboardStr = [data objectForKey:@"text"];
  213. // UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
  214. // pasteboard.string = pasteboardStr;
  215. // }
  216. // }
  217. // }
  218. // else if ([messageType isEqualToString:@"downAdnInstallRep"]){
  219. // if ([[dataDict allKeys] containsObject:@"data"]) {
  220. // NSDictionary *data = dataDict[@"data"];
  221. //
  222. // if ([[data allKeys] containsObject:@"status"]) {
  223. // NSString *status = [data objectForKey:@"status"];
  224. // if ([status isEqualToString:@"1"]) {
  225. // mainBlock(^{
  226. // // [[iToast makeText:@"App下载完成"] show];
  227. // });
  228. // }else if ([status isEqualToString:@"0"]){
  229. // mainBlock(^{
  230. // //[[iToast makeText:@"App下载中"] show];
  231. // });
  232. // }
  233. // }
  234. // }
  235. // }
  236. // else if ([messageType isEqualToString:@"shakeit"]){
  237. // HLog(@"\n-----摇一摇成功------");
  238. // }else if ([messageType isEqualToString:@"keyboardFeedbackBean"]){/*调起键盘*/
  239. // [weakSelf keyboardFeedbackBeanFun];
  240. // }else if ([messageType isEqualToString:@"FileRandomReady"]
  241. // ||[messageType isEqualToString:@"FilePartReady"]
  242. // ){/*申请文件上传得到答复*/
  243. // [weakSelf applyUploadFileServiceResponseFun:dataDict];
  244. // }
  245. // else if ([messageType isEqualToString:@"uploadFileRandomRet"]
  246. // ||[messageType isEqualToString:@"uploadFilePartRet"]
  247. // ){/*文件上传得到答复*/
  248. // [weakSelf upLoadFileFunServiceResponseFun:dataDict];
  249. // }
  250. // else if ([messageType isEqualToString:@"backUpFileRandomReady"]
  251. // ||[messageType isEqualToString:@"backUpPartReady"]
  252. // ){/*文件备份得到答复*/
  253. // [weakSelf applyBackupsFileServiceResponseFun:dataDict];
  254. // }
  255. // else if ([messageType isEqualToString:@"backUpFileRandomRet"]
  256. // ||[messageType isEqualToString:@"backUpFilePartRet"]){/*文件备份得到答复*/
  257. // [weakSelf backupsFileFunServiceResponseFun:dataDict];
  258. // }
  259. // else if ([messageType isEqualToString:@"getBaseInfo"]){/*获取云机的基本信息*/
  260. // [weakSelf getCouldPhoneBaseInfoResponseFun:dataDict];
  261. // }
  262. // else if ([messageType isEqualToString:@"getSysInfo"]){/*获取云机的系统信息*/
  263. // [weakSelf getCouldPhoneSysInfoResponseFun:dataDict];
  264. // }
  265. // else if ([messageType isEqualToString:@"TvStatus"]){/*获取TV投屏信息*/
  266. // [weakSelf getCouldPhoneTvStatusResponseFun:dataDict];
  267. // }
  268. // else if ([messageType isEqualToString:@"reboot"]){/*重启*/
  269. // [weakSelf stopForceStartTimerFun];
  270. // }
  271. // else if ([messageType isEqualToString:@"mkdir"]){/*创建文件夹*/
  272. // [weakSelf createFolderResponseFun:dataDict];
  273. // }
  274. // else if ([messageType isEqualToString:@"getBackupPath"]){/*创建文件夹*/
  275. // [weakSelf getFolderListResponseFun:dataDict];
  276. // }
  277. // else if ([messageType isEqualToString:@"search"]){/*创建文件夹*/
  278. // [weakSelf searchFileListResponseFun:dataDict];
  279. // }
  280. // else if ([messageType isEqualToString:@"getExtraFiles"]){/*创建文件夹*/
  281. // [weakSelf getExtraFilesResponseFun:dataDict];
  282. // }
  283. // else if ([messageType isEqualToString:@"extraMediaEvent"]){/*磁盘插拔*/
  284. // [weakSelf getExtraMediaEventResponseFun:dataDict];
  285. // [weakSelf getExtraFilesListFun];
  286. // }
  287. // else if ([messageType isEqualToString:@"reset"]){/**/
  288. // [weakSelf deleteCommandSendTaskFunWith:@"reset"];
  289. // }
  290. } failure:^(NSError *error) {
  291. ksharedAppDelegate.isWebSockLinkOKAginType = NO;
  292. // [self showNetErrorAlertFun:2];
  293. // [self WebSocketNeedRelinkFun];
  294. }];
  295. }
  296. }
  297. - (void)keepWebSocketOKFun
  298. {
  299. self.webSocketTime = 0;
  300. }
  301. - (void)WebSocketNeedRelinkFun
  302. {
  303. self.webSocketTime = 0;
  304. if(self.commandChannelManager){
  305. [self opencommandChannelManagerrc_openURL];
  306. }
  307. }
  308. - (void)timerChange {
  309. //处理websockt是否断开
  310. self.webSocketTime += 2;
  311. //处理其他任务
  312. self.webSocketTaskTime += 2;
  313. if(self.webSocketTime > 8)
  314. {
  315. [self WebSocketNeedRelinkFun];
  316. }
  317. if(self.webSocketTaskTime > 5)
  318. {
  319. self.webSocketTaskTime = 0;
  320. [self checkAllTaskFun];
  321. }
  322. }
  323. - (void)checkAllTaskFun
  324. {
  325. if([self.commandChannelManager rc_socketStatus] == RCSocketCloudPhoneStatusConnected
  326. ||[self.commandChannelManager rc_socketStatus] == RCSocketCloudPhoneStatusReceived){
  327. HLog(@"WebSocket 链接正常");
  328. }
  329. else{
  330. HLog(@"WebSocket 链接异常:%ld",[self.commandChannelManager rc_socketStatus]);
  331. return;
  332. }
  333. //处理相册备份
  334. [[backupsFileManager shareInstance] checkReBackupsFileFun];
  335. [[uploadFileManager shareInstance] checkReUploadFileFun];
  336. [[downloadManager shareInstance] checkReDownloadFileFun];
  337. [[downloadThumbnailManager shareInstance] checkReDownloadThumbnailFileFun];
  338. [self checkCommandSendTaskFun];
  339. if([AudioSessionObject shareManager].isBackgroundType){
  340. [self checkFileTransfeTaskFun];
  341. }
  342. HLog(@"checkAllTaskFun");
  343. }
  344. //检测是否正在进行的文件传输任务
  345. - (void)checkFileTransfeTaskFun
  346. {
  347. BOOL isBackupsingType = [[backupsFileManager shareInstance] checkBackupsingFun];
  348. BOOL isUploadingType = [[uploadFileManager shareInstance] checkUploadingFun];
  349. BOOL isDownloadingType = [[downloadManager shareInstance] checkDownloadingFun];
  350. BOOL isBackground = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_file_Transfe_working_background)];
  351. if ((isBackupsingType || isUploadingType || isDownloadingType) && isBackground) {
  352. HLog(@"后台保活中");
  353. [cachesFileManager writeLogsWithMsg:@"Background working"];
  354. }
  355. else{
  356. HLog(@"停止后台保活");
  357. [cachesFileManager writeLogsWithMsg:@"stop Background working"];
  358. [[AudioSessionObject shareManager] stopBackgroundActiveFun];
  359. }
  360. }
  361. -(void)checkCommandSendTaskFun
  362. {
  363. if(commandSendCheckArr && commandSendCheckArr.count >0){
  364. for (commandSendCheckModel *model in commandSendCheckArr) {
  365. if(model.reSendNum < 3){
  366. model.reSendNum ++;
  367. if(model.commandStr){
  368. [self send_data:model.commandStr];
  369. HLog(@"\n\n\n任务重发 重发次数:%ld 指令:%@\n\n\n",model.reSendNum,model.commandStr);
  370. }
  371. // if([model.type isEqualToString:@"offline_notification"]){
  372. // model.reSendNum = 1;//只要不收到
  373. // }
  374. }
  375. }
  376. }
  377. }
  378. - (void)send_data:(NSString *)dataStr
  379. {
  380. [self.commandChannelManager rc_sendData:dataStr];
  381. }
  382. #pragma mark 盒子链接成功后需要处理的各种各样事情
  383. - (void)handlAllMsgAfterDidLinkFun
  384. {
  385. ksharedAppDelegate.isWebSockLinkOKAginType = YES;
  386. //获取云机尺寸 兼容 720*1080 &1080*1920 不同分辨率的展示和触控
  387. NSString *getPhoneSizeStr = [RCCommandHelp getPhoneSizecommand];
  388. [self send_data:getPhoneSizeStr];
  389. //判断是否为需要改机
  390. BOOL isNeedRandomChangeParams = [HWDataManager getBoolWithKey:Const_need_random_Change_Params];
  391. if(isNeedRandomChangeParams)
  392. {
  393. NSString *commondStr = @"{\"type\":\"randomChangeParams\"}";
  394. [self send_data:commondStr];
  395. [HWDataManager setBoolWithKey:Const_need_random_Change_Params value:NO];
  396. }
  397. [self fristConnectNeedGiveAMsgFun];
  398. [self updateCopydata];
  399. // 报链接失败 后面又连接上了
  400. // if(linkFailAlretVC && linkFailAlretVC.view.tag == 2){
  401. // mainBlock(^{
  402. // [self->linkFailAlretVC dismissViewControllerAnimated:YES completion:^{
  403. //
  404. // }];
  405. // self->linkFailAlretVC = nil;
  406. // });
  407. // }
  408. //处理相册备份
  409. [[backupsFileManager shareInstance] AutohandlePhotosBackupsFun];
  410. //获取磁盘外挂
  411. [self getExtraFilesListFun];
  412. //self.webSocketConcentTime = [iTools getNowTimeStamp];
  413. }
  414. #pragma mark 盒子第一次连接成功 给ws发送信息 单点登录 把其他账号挤下去
  415. - (void)fristConnectNeedGiveAMsgFun{
  416. if(!_didSendfristMsg )
  417. {
  418. NSString *commondStr3 = @"{\"type\":\"getSysInfo\"}";
  419. [self send_data:commondStr3];
  420. // NSString *commondStr = @"{\"type\":\"forwardMsg\",\"data\":\"offline_notification\"}";
  421. // [self send_data:commondStr];
  422. // [self addCommandSendTaskFunWithType:@"offline_notification" WithCommandStr:commondStr];
  423. _didSendfristMsg = true;
  424. [self getPreferredLanguage];
  425. NSString *commondStr2 = @"{\"type\":\"TvStatus\"}";
  426. [self send_data:commondStr2];
  427. }
  428. }
  429. #pragma mark 语言和市区 同步云机
  430. -(void)getPreferredLanguage
  431. {//{"data":{"language":"zh-CN","timeZone":"Etc/GMT+8"},"type":"setLanguages"}
  432. // iOS 获取设备当前语言的代码
  433. NSString *preferredLanguage = [[[NSBundle mainBundle] preferredLocalizations] firstObject];
  434. HLog(@"当前语言:%@", preferredLanguage);
  435. //en-US 英文 ja-JP 日文
  436. NSArray *arLanguages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
  437. NSLog(@"arLanguages:%@",arLanguages);
  438. ///获取设备当前地区的代码和APP语言环境
  439. NSString *languageCode = [NSLocale preferredLanguages][0];
  440. //目前支持 中文(简体 繁体) 英文 日语
  441. if([languageCode rangeOfString:@"zh-Hans"].location != NSNotFound)
  442. {
  443. preferredLanguage = @"zh-CN";
  444. }
  445. else if([languageCode rangeOfString:@"zh-Hant"].location != NSNotFound)
  446. {
  447. preferredLanguage = @"zh-HK";
  448. }
  449. else if([languageCode rangeOfString:@"ja-"].location != NSNotFound)
  450. {
  451. preferredLanguage = @"ja-JP";
  452. }
  453. else{
  454. preferredLanguage = @"en-US";
  455. }
  456. // if([languageCode rangeOfString:preferredLanguage].location != NSNotFound){
  457. // preferredLanguage = languageCode;
  458. // }
  459. // else{
  460. // preferredLanguage = @"en-US";
  461. // }
  462. NSString*gmtStr = [self UTCOffset];
  463. HLog(@"%@",gmtStr);
  464. // //获取名字,如“GMT+08:00
  465. NSString *commondStr = [NSString stringWithFormat:@"{\"type\":\"setLanguages\",\"data\":{\"language\":\"%@\",\"timeZone\":\"%@\"}}",preferredLanguage,gmtStr];
  466. [self send_data:commondStr];
  467. }
  468. -(NSString *)UTCOffset {
  469. NSTimeZone *localTZ = [NSTimeZone localTimeZone];
  470. float offset = localTZ.secondsFromGMT/3600.0;
  471. if(offset > 0){
  472. return [NSString stringWithFormat:@"Etc/GMT+%g",offset];
  473. }
  474. return [NSString stringWithFormat:@"Etc/GMT%g",offset];
  475. }
  476. - (void)updateCopydata{
  477. UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
  478. NSString *str = [pasteboard string];
  479. HLog(@"__________%s______%@____",__func__,str);
  480. if ([str rangeOfString:@"CVLUSTERS_NOUSE_"].location != NSNotFound)
  481. {
  482. str = nil;
  483. }
  484. if (str && str.length >0)
  485. {
  486. //HLog(@"hxd111 cutting %@",str);
  487. /*发送数据*/
  488. NSString *dataStr = [RCCommandHelp commandCuttingWithContent:str];
  489. [self.commandChannelManager rc_sendData:dataStr];
  490. //pasteboard.string = @"";
  491. }
  492. }
  493. #pragma mark 获取外挂产品
  494. - (void)getExtraFilesListFun
  495. {
  496. NSString *ExtraCommondStr = [RCCommandHelp getExtraFilesList];
  497. [self send_data:ExtraCommondStr];
  498. }
  499. @end