webRtcManager.m 34 KB

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