LiveCenterManager.m 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179
  1. //
  2. // LiveCenterManager.m
  3. // BuguLive
  4. //
  5. // Created by 岳克奎 on 16/12/13.
  6. // Copyright © 2016年 xfg. All rights reserved.
  7. //
  8. #import "LiveCenterManager.h"
  9. #define JUMP_HOME_PAGE 0
  10. #import "BGVoiceController.h"
  11. #import "RoomCloseMoreView.h"
  12. #import "UIButton+XYButton.h"
  13. @implementation LiveCenterManager
  14. BogoSingletonM(Instance);
  15. #pragma mark ------------------------------------------- 直播间开启部分 -------------------------------------------
  16. #pragma mark 主播开直播
  17. /**
  18. 主播开直播开直播
  19. @param dic API请求直播需要dic的参数
  20. @param isSusWindow 是否开启悬浮
  21. @param isSmallScreen 是否小屏幕直播
  22. @param block 处理回调
  23. * @Step:1 .首先API请求
  24. * @Step:2. 创建直播对应类型下的直播间VC
  25. * @Step:3. 悬浮部分 显示window层
  26. * @Step:4 处理手势 手势里回调+动画
  27. * @Step:5 动画加载悬浮
  28. *
  29. * @discussion: 1.主播开直播 先请求拿到后台直播类型 云||互动 代码包含 悬浮和非悬浮 悬浮部分要动画加载
  30. * @attention : 一定要注意参数,如果调悬浮达不到预想结果,请优先查看参数,特别是 isSusWindow和isSmallScreen 还有有些方法传递的直播间VC 和直播间UIVC,一定要区分!!!
  31. */
  32. - (void)showLiveOfAPIPramaDic:(NSMutableDictionary *)dic isSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen block:(FWIsFinishedBlock)block
  33. {
  34. [[AppDelegate sharedAppDelegate] isShowHud:YES hideTime:6];
  35. // 悬浮记录悬浮状态
  36. SUS_WINDOW.isSusWindow = isSusWindow;
  37. SUS_WINDOW.isSmallSusWindow = isSmallScreen;
  38. __weak typeof(self)weak_Self = self;
  39. // H1 首先API请求 内部悬浮记录 直播类型+是不是观众
  40. [[LiveCenterAPIManager sharedInstance] liveCenterAPIOfShowHostLiveOfDic:dic block:^(NSDictionary *responseJson, BOOL finished, NSError *error) {
  41. [[AppDelegate sharedAppDelegate] hideHud];
  42. if (finished && !error && responseJson)
  43. {
  44. // H2 API请求成功后 设置房间信息
  45. IMAHost *host = [IMAPlatform sharedInstance].host;
  46. TCShowUser *user = [[TCShowUser alloc] init];
  47. user.avatar = [host imUserIconUrl];
  48. user.uid = [host imUserId];
  49. user.username = [host imUserName];
  50. TCShowLiveListItem *liveRoom = [[TCShowLiveListItem alloc] init];
  51. liveRoom.host = user;
  52. liveRoom.avRoomId = [responseJson toInt:@"room_id"];
  53. liveRoom.title = [NSString stringWithFormat:@"%d",liveRoom.avRoomId];
  54. liveRoom.vagueImgUrl = [[IMAPlatform sharedInstance].host.customInfoDict toString:@"head_image"];
  55. // SUS_WINDOW 去记录直播间类型 这是不是观众
  56. liveRoom.liveType = SUS_WINDOW.liveType;
  57. liveRoom.isHost = SUS_WINDOW.isHost;
  58. // 2 开直播间 直播间类型很多需要判断
  59. UIViewController *tempLiveViewController = [weak_Self showNewLiveOfTCShowLiveListItem:liveRoom withModelArr:nil];
  60. // h3 如果开启了悬浮 悬浮动画处理+加载处理 非悬浮不做处理
  61. if(isSusWindow)
  62. {
  63. [weak_Self showSusWindowPartOfIsSusWindow:isSusWindow isSmallScreen:isSmallScreen liveViewControleller:tempLiveViewController block:^(BOOL isFinished) {
  64. if(block)
  65. {
  66. block(isFinished);
  67. }
  68. }];
  69. }
  70. else
  71. {
  72. if(block)
  73. {
  74. block(YES);
  75. }
  76. }
  77. }
  78. else
  79. {
  80. if(block)
  81. {
  82. block(NO);
  83. }
  84. }
  85. }];
  86. }
  87. /**
  88. 开启直播
  89. @param responseJson 开播参数
  90. @param isSusWindow 是否需要悬浮窗
  91. @param isSmallScreen 是否需要悬浮小屏
  92. @param block 回调
  93. */
  94. - (void)showLiveOfAPIResponseJson:(NSMutableDictionary *)responseJson isSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen block:(FWIsFinishedBlock)block
  95. {
  96. // 悬浮记录悬浮状态
  97. SUS_WINDOW.isSusWindow = isSusWindow;
  98. SUS_WINDOW.isSmallSusWindow = isSmallScreen;
  99. __weak typeof(self)weak_Self = self;
  100. // API请求成功后,设置房间信息
  101. IMAHost *host = [IMAPlatform sharedInstance].host;
  102. if (!host)
  103. {
  104. [[BGIMLoginManager sharedInstance] loginImSDK:YES succ:nil failed:nil];
  105. if (block)
  106. {
  107. block(NO);
  108. }
  109. return;
  110. }
  111. [GlobalVariables sharedInstance].appModel.spear_live = @"1";
  112. TCShowUser *user = [[TCShowUser alloc] init];
  113. user.avatar = [host imUserIconUrl];
  114. user.uid = [host imUserId];
  115. user.username = [host imUserName];
  116. TCShowLiveListItem *liveRoom = [[TCShowLiveListItem alloc] init];
  117. liveRoom.host = user;
  118. liveRoom.avRoomId = [responseJson toInt:@"room_id"];
  119. liveRoom.title = [NSString stringWithFormat:@"%d",liveRoom.avRoomId];
  120. liveRoom.vagueImgUrl = [[IMAPlatform sharedInstance].host.customInfoDict toString:@"head_image"];
  121. //SUS_WINDOW 去记录直播间类型 这是不是观众
  122. liveRoom.liveType = SUS_WINDOW.liveType;
  123. liveRoom.isHost = SUS_WINDOW.isHost;
  124. if([responseJson toInt:@"is_voice"] == 1)
  125. {
  126. liveRoom.is_voice = 1;
  127. }
  128. else
  129. {
  130. liveRoom.is_voice = 0;
  131. }
  132. //2 开直播间 直播间类型很多需要判断
  133. UIViewController *tempLiveViewController = [weak_Self showNewLiveOfTCShowLiveListItem:liveRoom withModelArr:nil];
  134. //h3 如果开启了悬浮 悬浮动画处理+加载处理 非悬浮不做处理
  135. if(isSusWindow)
  136. {
  137. [weak_Self showSusWindowPartOfIsSusWindow:isSusWindow isSmallScreen:isSmallScreen liveViewControleller:tempLiveViewController block:^(BOOL isFinished) {
  138. if(block)
  139. {
  140. block(isFinished);
  141. }
  142. }];
  143. }
  144. else
  145. {
  146. if(block)
  147. {
  148. block(YES);
  149. }
  150. }
  151. }
  152. /**
  153. 观众进直播
  154. @param dic 参数
  155. @param isSusWindow 是否需要悬浮Window
  156. @param isSmallScreen 是否需要悬浮小Window
  157. @param block 回调
  158. */
  159. - (void)showLiveOfAudienceLiveofPramaDic:(NSMutableDictionary *)dic isSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen block:(FWIsFinishedBlock)block
  160. {
  161. //判断是否实现协议 isSusWindow 为NO isSmallScreen 必须也为NO
  162. if (!isSusWindow && isSmallScreen)
  163. {
  164. [FanweMessage alertHUD:ASLocalizedString(@"直播间预加载参数出错")];
  165. }
  166. if (![[IMAPlatform sharedInstance].host conformsToProtocol:@protocol(AVUserAble)])
  167. {
  168. [[BGHUDHelper sharedInstance] loading:@"" delay:2 execute:^{
  169. [[BGIMLoginManager sharedInstance] loginImSDK:YES succ:nil failed:nil];
  170. } completion:^{
  171. }];
  172. return;
  173. }
  174. // // 判断dic 是否符合要求
  175. // if(![[dic allKeys] containsObject:@"group_id"] || ![[dic allKeys] containsObject:@"room_id"] || ![[dic allKeys] containsObject:@"head_image"] || ![[dic allKeys] containsObject:@"user_id"] || ![[dic allKeys] containsObject:@"live_in"])
  176. // {
  177. // [FanweMessage alertHUD:ASLocalizedString(@"抱歉,房间信息出错")];
  178. // return;
  179. // }
  180. TCShowLiveListItem *item = [[TCShowLiveListItem alloc]init];
  181. item.chatRoomId = dic[@"group_id"];
  182. item.avRoomId = (int)[dic[@"room_id"] integerValue];
  183. item.title = StringFromInt(item.avRoomId);
  184. item.vagueImgUrl = dic[@"head_image"];
  185. TCShowUser *showUser = [[TCShowUser alloc]init];
  186. showUser.uid = dic[@"user_id"];
  187. showUser.avatar = item.vagueImgUrl;
  188. item.host = showUser;
  189. if ([dic[@"live_in"] integerValue] == FW_LIVE_STATE_ING)
  190. {
  191. item.liveType = FW_LIVE_TYPE_AUDIENCE;
  192. }
  193. else
  194. {
  195. [FanweMessage alert:ASLocalizedString(@"视频已结束或正在创建中!")];
  196. return;
  197. }
  198. SUS_WINDOW.sdkType = [[GlobalVariables sharedInstance].appModel.sdk_type intValue];
  199. SUS_WINDOW.liveType = (int)item.liveType;
  200. SUS_WINDOW.isSusWindow = isSusWindow;
  201. // 应该是这样理解,当前处于满屏状态。。然后呢,经过动画处理就变成了 小屏幕
  202. SUS_WINDOW.isSmallSusWindow = isSmallScreen;
  203. SUS_WINDOW.isHost = NO;
  204. __weak typeof(self)weak_Self = self;
  205. //G 1
  206. UIViewController *tempLiveViewController = [weak_Self showNewLiveOfTCShowLiveListItem:item withModelArr:nil];
  207. //G 2
  208. if(SUS_WINDOW.isSusWindow)
  209. {
  210. [SUS_WINDOW makeKeyWindow];
  211. SUS_WINDOW.hidden = NO;
  212. [weak_Self showSusWindowPartOfIsSusWindow:isSusWindow isSmallScreen:isSmallScreen liveViewControleller:tempLiveViewController block:^(BOOL isFinished) {
  213. }];
  214. }
  215. }
  216. /**
  217. 观众进直播
  218. @param item 进入直播间实体
  219. @param isSusWindow 是否需要悬浮Window
  220. @param isSmallScreen 是否需要悬浮小Window
  221. @param block 回调
  222. */
  223. #pragma mark - 直播列表进直播,观众进
  224. //观众进入
  225. - (void)showLiveOfAudienceLiveofTCShowLiveListItem:(TCShowLiveListItem *)item modelArr:(NSArray *)modelArr isSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen block:(FWIsFinishedBlock)block
  226. {
  227. #warning 由于把腾讯SDK和金山SDK发在一块后,用腾讯SDK光看回看会闪退,所以回看默认用金山SDK,后期有待观察
  228. NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
  229. [dict setObject:@"video" forKey:@"ctl"];
  230. [dict setObject:@"check_status" forKey:@"act"];
  231. [dict setValue:StringFromInt(item.avRoomId) forKey:@"room_id"];
  232. if(item.is_voice)
  233. {
  234. [dict setValue:@"voice" forKey:@"ctl"];
  235. [dict setValue:@"voice_status" forKey:@"act"];
  236. }
  237. [[NetHttpsManager manager] POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson) {
  238. [[BGHUDHelper sharedInstance] syncStopLoading];
  239. if ([responseJson toInt:@"status"] == 1) {
  240. [GlobalVariables sharedInstance].isOtherPush = NO;
  241. SUS_WINDOW.liveType = [[GlobalVariables sharedInstance].appModel.sdk_type intValue];
  242. SUS_WINDOW.isSusWindow = isSusWindow;
  243. // 应该是这样理解,当前处于满屏状态。。然后呢,经过动画处理就变成了 小屏幕
  244. SUS_WINDOW.isSmallSusWindow = isSmallScreen;
  245. SUS_WINDOW.isHost = NO;
  246. __weak typeof(self)weak_Self = self;
  247. //G 1 BGTLiveController
  248. UIViewController *tempLiveViewController = [weak_Self showNewLiveOfTCShowLiveListItem:item withModelArr:modelArr];
  249. //G 2
  250. if(SUS_WINDOW.isSusWindow)
  251. {
  252. [SUS_WINDOW makeKeyWindow];
  253. SUS_WINDOW.hidden = NO;
  254. [weak_Self showSusWindowPartOfIsSusWindow:isSusWindow isSmallScreen:isSmallScreen liveViewControleller:tempLiveViewController block:^(BOOL isFinished) {
  255. }];
  256. }
  257. }
  258. else
  259. {
  260. [BGHUDHelper alert:responseJson[@"error"]];
  261. }
  262. } FailureBlock:^(NSError *error) {
  263. [[BGHUDHelper sharedInstance] syncStopLoading];
  264. }];
  265. }
  266. #pragma mark -private methods ------------------------------------------ 私人方法区域 ------------------------------------------
  267. /**
  268. 开创直播间VC,主播、观众直播通用代码,注意这里未开悬浮状态下是:[APP_DELEGATE pushViewController:liveVC];
  269. @param item 进入直播间实体
  270. @return 返回当前vc
  271. */
  272. - (UIViewController *)showNewLiveOfTCShowLiveListItem:(TCShowLiveListItem *)item withModelArr:(NSArray *)modelArr
  273. {
  274. SUS_WINDOW.sdkType = [[GlobalVariables sharedInstance].appModel.sdk_type integerValue];
  275. // 云 主播 || 云观众
  276. //是否是语音房间 1是,0不是
  277. if(item.is_voice == 1)
  278. {
  279. BGVoiceController *liveVC = [[BGVoiceController alloc]initWith:item modelArr:modelArr];
  280. SUS_WINDOW.recordFWTLiveController = liveVC;
  281. if (SUS_WINDOW.isSusWindow)
  282. {
  283. // 如果开启悬浮
  284. SUS_WINDOW.rootViewController = [[UINavigationController alloc]initWithRootViewController:liveVC];
  285. }
  286. else
  287. {
  288. [APP_DELEGATE pushViewController:liveVC animated:YES];
  289. }
  290. return liveVC;
  291. }
  292. //视频直播
  293. if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_TXY)
  294. {
  295. BGTLiveController *liveVC = [[BGTLiveController alloc]initWith:item modelArr:modelArr];
  296. SUS_WINDOW.recordFWTLiveController = liveVC;
  297. if (SUS_WINDOW.isSusWindow)
  298. {
  299. // 如果开启悬浮
  300. SUS_WINDOW.rootViewController = [[UINavigationController alloc]initWithRootViewController:liveVC];
  301. }
  302. else
  303. {
  304. [APP_DELEGATE pushViewController:liveVC animated:YES];
  305. }
  306. return liveVC;
  307. }
  308. else if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_VOICE)
  309. {
  310. BGVoiceController *liveVC = [[BGVoiceController alloc]initWith:item modelArr:modelArr];
  311. SUS_WINDOW.recordFWTLiveController = liveVC;
  312. if (SUS_WINDOW.isSusWindow)
  313. {
  314. // 如果开启悬浮
  315. SUS_WINDOW.rootViewController = [[UINavigationController alloc]initWithRootViewController:liveVC];
  316. }
  317. else
  318. {
  319. [APP_DELEGATE pushViewController:liveVC animated:YES];
  320. }
  321. return liveVC;
  322. }
  323. return nil;
  324. }
  325. /**
  326. 先设置参数再利用参数判断动画,主播、观众通用代码
  327. @param isSusWindow 是否需要悬浮Window
  328. @param isSmallScreen 是否需要悬浮小Window
  329. @param liveViewControleller 直播vc
  330. @param block 回调
  331. */
  332. - (void)showSusWindowPartOfIsSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen liveViewControleller:(UIViewController *)liveViewControleller block:(FWIsFinishedBlock)block
  333. {
  334. [SUS_WINDOW makeKeyWindow];
  335. SUS_WINDOW.hidden = NO;
  336. SUS_WINDOW.isSusWindow = isSusWindow;
  337. SUS_WINDOW.isSmallSusWindow = isSmallScreen;
  338. //H4
  339. [SuspenionWindow showLoadGeatureOfSusWindow];
  340. //H5
  341. [SuspenionWindow showAnimationOfSusWindowSizeBlock:^(BOOL finished) {
  342. if (finished)
  343. {
  344. //手势 处理
  345. }
  346. if(block)
  347. {
  348. block(finished);
  349. }
  350. }];
  351. }
  352. #pragma mark ------------------------------------------- 直播间关闭 部分 -------------------------------------------
  353. #pragma mark - 直播间关闭启动预处理
  354. /**
  355. 开始启动直播间关闭处理
  356. @param liveViewController 需要退出的vc
  357. @param paiTimeNum 用来判断竞拍倒计时是否存在
  358. @param isDirectCloseLive 是否直接关闭直播
  359. @param isHostShowAlert 主播是否显示关闭直播的提示
  360. @param block 回调
  361. */
  362. - (void)closeLiveOfPramaOfLiveViewController:(UIViewController *)liveViewController paiTimeNum:(int)paiTimeNum alertExitLive:(BOOL)isDirectCloseLive isHostShowAlert:(BOOL)isHostShowAlert colseLivecomplete:(FWIsFinishedBlock)block
  363. {
  364. // 音乐存在必须 要关闭
  365. // if (ST_M_CENTER.stMusicPlayingState != STMusicPlayingStateDefault)
  366. // {
  367. // [ST_M_CENTER setStMusicPlayingState:STMusicPlayingStateDefault];
  368. // }
  369. MUSIC_CENTER_MANAGER.musicPlayingState = NO;
  370. // 这个判断这里执行。后面再调方法没必要判断
  371. if (!liveViewController)
  372. {
  373. if(block)
  374. {
  375. block(NO);// 不退出
  376. }
  377. return;
  378. }
  379. // 参数的记录感觉 放在 这里
  380. SUS_WINDOW.isDirectCloseLive = isDirectCloseLive; //记录 当前需不需要 finishVC NO需要
  381. SUS_WINDOW.isHostShowAlert = isHostShowAlert;//记录当前需不需要 提示
  382. // 键盘退出
  383. [BGUtils closeKeyboard];
  384. __weak typeof(self)weak_Self = self;
  385. // 悬浮类有关 假如存在悬浮 优先让悬浮恢复到满屏 再做退出处理
  386. // 悬浮的写在 悬浮类里面
  387. [SuspenionWindow closeSuswindowUIComplete:^(BOOL finished) {
  388. SUS_WINDOW.window_Pan_Ges.enabled = NO;
  389. // 执行直播层(非悬浮)退出 先判断+后真退出
  390. if(finished)
  391. {
  392. [weak_Self closeLiveAfterClosedOfSusWindowUIOfLiveViewController:liveViewController paiTimeNum:paiTimeNum closeComplete:^(BOOL isFinished) {
  393. if(block)
  394. {
  395. block(isFinished);
  396. }
  397. }];
  398. }
  399. }];
  400. }
  401. /**
  402. 非悬浮关闭处理:
  403. 1.判断悬浮;
  404. 2.判断音乐;
  405. 3.判断是不是主播 观众基本直接退出去;
  406. 4.悬浮参数的退出;
  407. @param liveViewControlelr 直播vc
  408. @param paiTimeNum 竞拍倒计时
  409. @param block 回调
  410. */
  411. - (void)closeLiveAfterClosedOfSusWindowUIOfLiveViewController:(UIViewController *)liveViewControlelr paiTimeNum:(int)paiTimeNum closeComplete:(FWIsFinishedBlock)block
  412. {
  413. // 拿到对应liveC
  414. __weak typeof(self)weak_Self = self;
  415. __weak BGTLiveController *tLiveC;
  416. // __weak BGKSYLiveController *ksyLiveC;
  417. //不可删
  418. if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_TXY)
  419. {
  420. tLiveC =(BGTLiveController *)liveViewControlelr;
  421. tLiveC.isDirectCloseLive = SUS_WINDOW.isDirectCloseLive;
  422. // 暂停播放背景音乐
  423. [tLiveC.publishController.txLivePublisher pauseBGM];
  424. }
  425. // 判断 提示 竞拍存在
  426. // 竞拍 之 云 主0 互主 3 host
  427. if (paiTimeNum)
  428. {
  429. if (SUS_WINDOW.liveType == FW_LIVE_TYPE_HOST)
  430. {
  431. if(block)
  432. {
  433. block(NO); // 不退出
  434. }
  435. return;
  436. }
  437. else if (SUS_WINDOW.liveType == FW_LIVE_TYPE_AUDIENCE)
  438. {
  439. if(SUS_WINDOW.isHostShowAlert)
  440. {
  441. // 调退出直播方法
  442. [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
  443. if(block)
  444. {
  445. block(YES);
  446. }
  447. }];
  448. }
  449. }
  450. }
  451. // 云主 0 观主 3
  452. if(SUS_WINDOW.liveType == FW_LIVE_TYPE_HOST)
  453. {
  454. // if(SUS_WINDOW.isHostShowAlert)
  455. // {
  456. //语音房间添加
  457. if([liveViewControlelr.class isEqual:[BGVoiceController class]])
  458. {
  459. __weak __typeof(self)weakSelf = self;
  460. RoomCloseMoreView *moreView = [RoomCloseMoreView getView];
  461. moreView.frame = liveViewControlelr.view.bounds;
  462. [moreView.shareBtn addTapBlock:^(UIButton *btn) {
  463. [moreView hide];
  464. [((BGVoiceController *)liveViewControlelr).liveServiceController clickShareBtn:nil];
  465. }];
  466. // [moreView.colseBtn addTapBlock:^(UIButton *btn) {
  467. // [moreView hide];
  468. //
  469. //
  470. // }];
  471. [moreView.cancelBtn addTapBlock:^(UIButton *btn) {
  472. __strong __typeof(weakSelf)strongSelf = weakSelf;
  473. [moreView hide];
  474. }];
  475. #pragma mark - 关闭语音直播
  476. [moreView.colseBtn addTapBlock:^(UIButton *btn) {
  477. BGVoiceController *livevc = (BGVoiceController *)liveViewControlelr;
  478. NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
  479. [dict setValue:@"voice" forKey:@"ctl"];
  480. [dict setValue:@"close_voice" forKey:@"act"];
  481. [dict setValue:livevc.liveInfo.room_id forKey:@"room_id"];
  482. [[NetHttpsManager manager] POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson) {
  483. // 调退出直播方法
  484. [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
  485. if(block)
  486. {
  487. block(YES);
  488. }
  489. }];
  490. } FailureBlock:^(NSError *error) {
  491. NSLog(ASLocalizedString(@"结束PK请求失败error:%@"),error);
  492. }];
  493. }];
  494. [liveViewControlelr.view addSubview:moreView];
  495. [moreView show:liveViewControlelr.view type:FDPopTypeCenter];
  496. // FDActionSheet *actionSheet = [[FDActionSheet alloc] initWithTitle:@"" message:@""];
  497. //
  498. // [actionSheet addAction:[FDAction actionWithTitle:ASLocalizedString(@"关闭直播间") type:FDActionTypeDefault CallBack:^{
  499. //
  500. // BGVoiceController *livevc = (BGVoiceController *)liveViewControlelr;
  501. // NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
  502. // [dict setValue:@"voice" forKey:@"ctl"];
  503. // [dict setValue:@"close_voice" forKey:@"act"];
  504. // [dict setValue:livevc.liveInfo.room_id forKey:@"room_id"];
  505. //
  506. // [[NetHttpsManager manager] POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson) {
  507. //
  508. // // 调退出直播方法
  509. // [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
  510. // if(block)
  511. // {
  512. // block(YES);
  513. // }
  514. // }];
  515. //
  516. // } FailureBlock:^(NSError *error) {
  517. // NSLog(ASLocalizedString(@"结束PK请求失败error:%@"),error);
  518. // }];
  519. //
  520. //
  521. //
  522. // }]];
  523. // [actionSheet show:[UIApplication sharedApplication].keyWindow];
  524. }
  525. else
  526. {
  527. [FanweMessage alert:nil message:ASLocalizedString(@"确定要结束直播吗?")destructiveAction:^{
  528. //结束PK
  529. NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
  530. [dict setValue:@"pk_tencent" forKey:@"ctl"];
  531. [dict setValue:@"request_end_pk" forKey:@"act"];
  532. [[NetHttpsManager manager] POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson) {
  533. if ([responseJson toInt:@"status"] == 1) {
  534. NSLog(ASLocalizedString(@"结束PK请求成功responseJson:%@"),responseJson);
  535. }else{
  536. NSLog(ASLocalizedString(@"结束PK请求失败responseJson:%@"),responseJson);
  537. }
  538. } FailureBlock:^(NSError *error) {
  539. NSLog(ASLocalizedString(@"结束PK请求失败error:%@"),error);
  540. }];
  541. // 调退出直播方法
  542. [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
  543. if(block)
  544. {
  545. block(YES);
  546. }
  547. }];
  548. } cancelAction:^{
  549. // 不退出
  550. if(block)
  551. {
  552. block(NO);
  553. }
  554. }];
  555. }
  556. // }
  557. // else
  558. // {
  559. // // 调退出直播方法
  560. // [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
  561. // if(block)
  562. // {
  563. // block(YES);
  564. // }
  565. // }];
  566. // }
  567. }
  568. // 观众 直接退出
  569. if (SUS_WINDOW.liveType == FW_LIVE_TYPE_AUDIENCE)
  570. {
  571. __weak __typeof(self)weakSelf = self;
  572. if([liveViewControlelr.class isEqual:[BGVoiceController class]])
  573. {
  574. RoomCloseMoreView *moreView = [RoomCloseMoreView getView];
  575. moreView.frame = liveViewControlelr.view.bounds;
  576. [moreView.shareBtn addTapBlock:^(UIButton *btn) {
  577. [moreView hide];
  578. [((BGVoiceController *)liveViewControlelr).liveServiceController clickShareBtn:nil];
  579. }];
  580. // [moreView.colseBtn addTapBlock:^(UIButton *btn) {
  581. // [moreView hide];
  582. //
  583. //
  584. // }];
  585. [moreView.cancelBtn addTapBlock:^(UIButton *btn) {
  586. __strong __typeof(weakSelf)strongSelf = weakSelf;
  587. [moreView hide];
  588. }];
  589. [moreView.colseBtn addTapBlock:^(UIButton *btn) {
  590. // 调退出直播方法
  591. [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
  592. if(block)
  593. {
  594. block(YES);
  595. }
  596. }];
  597. }];
  598. [liveViewControlelr.view addSubview:moreView];
  599. [moreView show:liveViewControlelr.view type:FDPopTypeCenter];
  600. }
  601. else
  602. {
  603. // 调退出直播方法
  604. [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
  605. if(block)
  606. {
  607. block(YES);
  608. }
  609. }];
  610. }
  611. }
  612. }
  613. #pragma mark -private methods ------------------------------------------ 私人方法区域 ------------------------------------------
  614. /**
  615. 调SDK等相关退出
  616. @param liveViewController 需要退出的vc,要区分一下开始掉关闭预加载时候的参数,让悬浮去记录
  617. @param block 回到
  618. */
  619. - (void)closeLiveRealOfSDKWithLiveViewController:(UIViewController *)liveViewController complete:(FWIsFinishedBlock)block
  620. {
  621. // 目前 下面走的是 NO 需要
  622. __weak BGTLiveController *tLiveC;
  623. // __weak BGKSYLiveController *ksyLiveC;
  624. __weak typeof(self)weak_self = self;
  625. // 云部分
  626. if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_TXY)
  627. {
  628. tLiveC =(BGTLiveController *)liveViewController;
  629. //执行退出
  630. [tLiveC realExitLive:^{
  631. [weak_self resetSuswindowPramaComple:^(BOOL isFinished) {
  632. if(block)
  633. {
  634. block(YES);
  635. }
  636. }];
  637. } failed:^(int errId, NSString *errMsg) {
  638. [weak_self resetSuswindowPramaComple:^(BOOL isFinished) {
  639. if(block)
  640. {
  641. block(YES);
  642. }
  643. }];
  644. }];
  645. }
  646. }
  647. - (void)resetSuswindowPramaComple:(FWIsFinishedBlock)block
  648. {
  649. if (![BGUtils isBlankString:SUS_WINDOW.switchedRoomId])
  650. {
  651. NSString *tmpStr = SUS_WINDOW.switchedRoomId;
  652. SUS_WINDOW.switchedRoomId = nil;
  653. [BGLiveSDKViewModel checkVideoStatus:tmpStr successBlock:^(NSDictionary *responseJson) {
  654. TCShowLiveListItem *item = [[TCShowLiveListItem alloc]init];
  655. item.chatRoomId = [responseJson toString:@"group_id"];
  656. item.avRoomId = [[responseJson toString:@"room_id"] intValue];
  657. item.title = [responseJson toString:@"room_id"];
  658. NSInteger live_in = [responseJson toInt:@"live_in"];
  659. if (live_in == FW_LIVE_STATE_ING)
  660. {
  661. item.liveType = FW_LIVE_TYPE_AUDIENCE;
  662. BOOL isSusWindow = [[LiveCenterManager sharedInstance] judgeIsSusWindow];
  663. [[LiveCenterManager sharedInstance]showLiveOfAudienceLiveofTCShowLiveListItem:item modelArr:nil isSusWindow:isSusWindow isSmallScreen:NO block:^(BOOL isFinished) {
  664. }];
  665. }
  666. else
  667. {
  668. [FanweMessage alert:ASLocalizedString(@"该直播已结束")];
  669. }
  670. } failureBlock:^(NSError *error) {
  671. }];
  672. }
  673. // 为NO 需要finish界面
  674. if(!SUS_WINDOW.isDirectCloseLive)
  675. {
  676. if(block)
  677. {
  678. block(NO);
  679. }
  680. return;
  681. }
  682. // 悬浮层处理
  683. [SuspenionWindow resetSusWindowPramaWhenLiveClosedComplete:^(BOOL finished) {
  684. if (block)
  685. {
  686. block(finished);
  687. }
  688. }];
  689. }
  690. /**
  691. 屏幕大小缩放处理,使用前提:需要悬浮挂起或挂起小屏幕后再恢复满屏幕
  692. @param isSmallScreen 是否悬浮小Window
  693. @param block 回调
  694. */
  695. - (void)showChangeLiveScreenSOfIsSmallScreen:(BOOL)isSmallScreen complete:(FWIsFinishedBlock)block
  696. {
  697. if (!SUS_WINDOW.isSusWindow)
  698. {
  699. return;
  700. }
  701. SUS_WINDOW.isSmallSusWindow = isSmallScreen;
  702. //动画
  703. [SuspenionWindow showAnimationOfSusWindowSizeBlock:^(BOOL finished) {
  704. if (block)
  705. {
  706. block(finished);
  707. }
  708. }];
  709. }
  710. #pragma mark ----------------------------------------- 竞拍区域 ------------------------------------------------------
  711. /**
  712. 竞拍屏幕处理大小处理,使用前提:竞拍开启直播后,需要悬浮挂起或挂起小屏幕后再恢复满屏幕
  713. @param isSmallScreen 是否悬浮小Window
  714. @param nextViewController 你回到满屏,可为nil
  715. @param delegateWindowRCNameStr 当你去下个VC,可为nil
  716. @param block 回调
  717. */
  718. - (void)showChangeAuctionLiveScreenSOfIsSmallScreen:(BOOL)isSmallScreen nextViewController:(UIViewController *)nextViewController delegateWindowRCNameStr:(NSString *)delegateWindowRCNameStr complete:(FWIsFinishedBlock)block
  719. {
  720. // 判断
  721. if (!SUS_WINDOW.isSusWindow)
  722. {
  723. return;
  724. }
  725. // 最好做安全判断
  726. if (!((isSmallScreen&&nextViewController) || (!isSmallScreen&& ![delegateWindowRCNameStr isEmpty])))
  727. {
  728. [FanweMessage alertHUD:ASLocalizedString(@"参数错误!")];
  729. return;
  730. }
  731. // 记录屏幕状态
  732. SUS_WINDOW.isSmallSusWindow = isSmallScreen;
  733. // 去下个界面,要优先于动画
  734. if (isSmallScreen&&nextViewController)
  735. {
  736. BGNavigationController *nav = [[BGNavigationController alloc] initWithRootViewController:nextViewController];
  737. APP_DELEGATE.window.rootViewController = nav;
  738. }
  739. // 回到满屏幕
  740. [SuspenionWindow showAnimationOfSusWindowSizeBlock:^(BOOL finished) {
  741. // 恢复满屏幕路 动画要优先执行完毕
  742. if (finished)
  743. {
  744. if( !isSmallScreen&& ![delegateWindowRCNameStr isEmpty])
  745. {
  746. [SuspenionWindow closeSanwichLayerOfNetRootVCStr:delegateWindowRCNameStr complete:^(BOOL finished) {
  747. if (block)
  748. {
  749. block(finished);
  750. }
  751. }];
  752. }
  753. else
  754. {
  755. if (block)
  756. {
  757. block(finished);
  758. }
  759. }
  760. }
  761. }];
  762. }
  763. #pragma mark ---------------------------------------- 踢下线通知 -------------------------------------------------------
  764. /**
  765. 踢下线通知
  766. @param imAPlatform 里监听到有互踢消息执行对应的方法,这个方法主要解决先视频的退出问题
  767. @param block 回调
  768. */
  769. - (void)showOffLineWarningwithIMAPlatform:(IMAPlatform *)imAPlatform complete:(FWIsFinishedBlock)block
  770. {
  771. //音乐存在的话,必须先关闭
  772. // if (ST_M_CENTER.stMusicPlayingState != STMusicPlayingStateDefault)
  773. // {
  774. // [ST_M_CENTER setStMusicPlayingState:STMusicPlayingStateDefault];
  775. // }
  776. [FanweMessage alert:ASLocalizedString(@"下线通知")message:ASLocalizedString(@"您的账号在其他设备登录,如果不是您的操作,请及时修改密码")destructiveAction:^{
  777. if (block)
  778. {
  779. block(YES);
  780. }
  781. // 退出
  782. if(SUS_WINDOW.liveType == 0 || SUS_WINDOW.liveType == 1 || SUS_WINDOW.liveType == 2)
  783. {
  784. if (SUS_WINDOW.recordFWTLiveController)
  785. {
  786. [SUS_WINDOW.recordFWTLiveController alertExitLive:YES isHostShowAlert:NO succ:^{
  787. [imAPlatform doLogout];
  788. } failed:^(int errId, NSString *errMsg) {
  789. [imAPlatform doLogout];
  790. }];
  791. }
  792. else if (SUS_WINDOW.threeFWKSYLiveController)
  793. {
  794. [SUS_WINDOW.threeFWKSYLiveController alertExitLive:YES isHostShowAlert:NO succ:^{
  795. [imAPlatform doLogout];
  796. } failed:^(int errId, NSString *errMsg) {
  797. [imAPlatform doLogout];
  798. }];
  799. }
  800. else
  801. {
  802. [imAPlatform doLogout];
  803. }
  804. }
  805. } cancelAction:^{
  806. if (block)
  807. {
  808. block(YES);
  809. }
  810. // 退出
  811. if(SUS_WINDOW.liveType == 0 || SUS_WINDOW.liveType == 1 || SUS_WINDOW.liveType == 2)
  812. {
  813. if (SUS_WINDOW.recordFWTLiveController)
  814. {
  815. [SUS_WINDOW.recordFWTLiveController alertExitLive:YES isHostShowAlert:NO succ:^{
  816. [imAPlatform doLogout];
  817. } failed:^(int errId, NSString *errMsg) {
  818. [imAPlatform doLogout];
  819. }];
  820. }
  821. else if (SUS_WINDOW.threeFWKSYLiveController)
  822. {
  823. [SUS_WINDOW.threeFWKSYLiveController alertExitLive:YES isHostShowAlert:NO succ:^{
  824. [imAPlatform doLogout];
  825. } failed:^(int errId, NSString *errMsg) {
  826. [imAPlatform doLogout];
  827. }];
  828. }
  829. else
  830. {
  831. [imAPlatform doLogout];
  832. }
  833. }
  834. }];
  835. }
  836. /**
  837. 进入直播
  838. @param liveListItem 进入直播间实体
  839. @param liveWindowType LiveWindowType
  840. @param liveType 视频类型
  841. @param liveSDKType SDK类型
  842. @param block 回调
  843. */
  844. //主播开播进入
  845. - (void)showLiveOfTCShowLiveListItem:(TCShowLiveListItem *)liveListItem andLiveWindowType:(LiveWindowType)liveWindowType andLiveType:(FW_LIVE_TYPE)liveType andLiveSDKType:(FW_LIVESDK_TYPE)liveSDKType andCompleteBlock:(FWIsFinishedBlock)block
  846. {
  847. // 开直播间 直播间类型很多需要判断
  848. BOOL isOpenSusWindow = false;
  849. BOOL isOpenNormalWindow = false;
  850. UIViewController *liveVC;
  851. //云
  852. if(liveSDKType == FW_LIVESDK_TYPE_TXY)
  853. {
  854. liveVC = [[BGTLiveController alloc]initWith:liveListItem modelArr:nil];
  855. //创建liveVC后需要设置悬浮代理
  856. [_stSuspensionWindow setDelegate:(BGTLiveController *)liveVC];
  857. //悬浮
  858. if(liveWindowType == liveWindowTypeOfSusOfFullSize || liveWindowType ==LiveWindowTypeOfSusSmallSize)
  859. {
  860. //如果开启悬浮
  861. isOpenSusWindow = YES;
  862. //非悬浮
  863. }else if(liveWindowType ==LiveWindowTypeOfNormolOfFullSize || liveWindowType == LiveWindowTypeOfNormolSmallSize){
  864. isOpenNormalWindow = YES;
  865. }else{
  866. //1.请正确方式填写枚举类型,不准用数字代替 //目前只扩展了4种,默认情况上面已经过滤
  867. }
  868. }
  869. else if(liveSDKType == FW_LIVESDK_TYPE_VOICE)
  870. {
  871. liveVC = [[BGVoiceController alloc]initWith:liveListItem modelArr:nil];
  872. //创建liveVC后需要设置悬浮代理
  873. [_stSuspensionWindow setDelegate:(BGVoiceController *)liveVC];
  874. //悬浮
  875. if(liveWindowType == liveWindowTypeOfSusOfFullSize || liveWindowType ==LiveWindowTypeOfSusSmallSize)
  876. {
  877. //如果开启悬浮
  878. isOpenSusWindow = YES;
  879. //非悬浮
  880. }else if(liveWindowType ==LiveWindowTypeOfNormolOfFullSize || liveWindowType == LiveWindowTypeOfNormolSmallSize){
  881. isOpenNormalWindow = YES;
  882. }else{
  883. //1.请正确方式填写枚举类型,不准用数字代替 //目前只扩展了4种,默认情况上面已经过滤
  884. }
  885. }
  886. else
  887. {
  888. //其他直播代码暂时不支持
  889. }
  890. //悬浮和非悬浮必定有个为YES
  891. if ((isOpenSusWindow && !isOpenNormalWindow)||(!isOpenSusWindow && isOpenNormalWindow))
  892. {
  893. //悬浮
  894. if (isOpenSusWindow && !isOpenNormalWindow)
  895. {
  896. _stSuspensionWindow.rootViewController = [[UINavigationController alloc]initWithRootViewController:liveVC];
  897. _stSuspensionWindow.windowLevel = 3005;
  898. [_stSuspensionWindow makeKeyWindow];
  899. _stSuspensionWindow.hidden = NO;
  900. }
  901. else
  902. {
  903. //非悬浮
  904. [APP_DELEGATE pushViewController:liveVC animated:YES];
  905. }
  906. //只有开启了直播,必须是动画完成才是真正赋值管理中心采取 记录最新状态,否则管理中心数据为默认无直播状态
  907. [self setLiveSDKType:liveSDKType];
  908. [self setLiveType:liveType];
  909. [self setRecordLiveViewC:liveVC];
  910. [self setLiveWindowType:liveWindowType];
  911. if(block)
  912. {
  913. block(YES);
  914. }
  915. //动画加载出来
  916. }
  917. else
  918. {
  919. //参数设置出问题,检查代码
  920. if(block){
  921. block(NO);
  922. }
  923. }
  924. }
  925. #pragma mark ---------------------------------------- 关直播 -------------------------------------------------------
  926. // 键盘退出 最好写在外面
  927. // 音乐暂停
  928. - (void)showCloseLiveComplete:(FWIsFinishedBlock)block
  929. {
  930. // 直播得存在
  931. if (!_recordLiveViewC)
  932. {
  933. if (block)
  934. {
  935. block(NO);
  936. }
  937. return;
  938. }
  939. // 键盘退出
  940. [BGUtils closeKeyboard];
  941. // 处理满屏问题
  942. // 因为进直播的时候已经记录直播类型
  943. // 当前为悬浮小
  944. if (_liveWindowType == LiveWindowTypeOfSusSmallSize )
  945. {
  946. // 小-->大
  947. [self setLiveWindowType:liveWindowTypeOfSusOfFullSize];
  948. }
  949. // 当前为满屏
  950. else if(_liveWindowType == liveWindowTypeOfSusOfFullSize || _liveWindowType == LiveWindowTypeOfNormolOfFullSize)
  951. {
  952. [self setLiveWindowType:_liveWindowType];
  953. }
  954. else
  955. {
  956. // 暂时其余枚举类型,代码不支持
  957. if (block)
  958. {
  959. block(NO);
  960. }
  961. return;
  962. }
  963. // 只有当悬浮层退出后,才真正执行直播退出
  964. if (block)
  965. {
  966. block(YES);
  967. }
  968. }
  969. // 判断是否需要悬浮Window
  970. - (BOOL)judgeIsSusWindow
  971. {
  972. BOOL isSusWindow = NO;
  973. // if(kSupportH5Shopping)
  974. // {
  975. // isSusWindow = NO;
  976. // }
  977. // else if ([GlobalVariables sharedInstance].appModel.open_podcast_goods == 1)
  978. // {
  979. // isSusWindow = NO;
  980. // }
  981. // else if ([[GlobalVariables sharedInstance].appModel.shopping_goods integerValue] == 1 || [[GlobalVariables sharedInstance].appModel.open_pai_module integerValue] == 1)
  982. // {
  983. // isSusWindow = YES;
  984. // }
  985. // else
  986. // {
  987. // isSusWindow = NO;
  988. // }
  989. return isSusWindow;
  990. }
  991. // 判断是否需要悬浮小Window
  992. - (BOOL)judgeIsSmallSusWindow
  993. {
  994. if ([self judgeIsSusWindow])
  995. {
  996. return NO;
  997. }
  998. else
  999. {
  1000. return NO;
  1001. }
  1002. }
  1003. #pragma mark --------------------------- get方法区域
  1004. - (STSuspensionWindow *)stSuspensionWindow
  1005. {
  1006. if (!_stSuspensionWindow)
  1007. {
  1008. _stSuspensionWindow = [STSuspensionWindow showWindowTypeOfSTBaseSuspensionWindowOfFrameRect:CGRectMake(0, 0, kScreenW, kScreenH) ofSTBaseSuspensionWindowLevelValue: 3050 complete:^(BOOL finished, STSuspensionWindow *stSuspensionWindow) {
  1009. }];
  1010. }
  1011. return _stSuspensionWindow;
  1012. }
  1013. #pragma mark --------------------------- set方法区域
  1014. - (void)setLiveWindowType:(LiveWindowType)liveWindowType
  1015. {
  1016. if (_liveWindowType != liveWindowType)
  1017. {
  1018. if(_stSuspensionWindow)
  1019. {
  1020. _liveWindowType = liveWindowType;
  1021. }
  1022. // 动画
  1023. [_stSuspensionWindow setStSusWindowShowState:stSusWindowShowYES];
  1024. [_stSuspensionWindow setIsSmallSize:(liveWindowType == LiveWindowTypeOfNormolSmallSize ? YES : NO)];
  1025. }
  1026. }
  1027. -(void)setItemModel:(TCShowLiveListItem *)itemModel{
  1028. _itemModel=itemModel;
  1029. }
  1030. @end