| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179 |
- //
- // LiveCenterManager.m
- // BuguLive
- //
- // Created by 岳克奎 on 16/12/13.
- // Copyright © 2016年 xfg. All rights reserved.
- //
- #import "LiveCenterManager.h"
- #define JUMP_HOME_PAGE 0
- #import "BGVoiceController.h"
- #import "RoomCloseMoreView.h"
- #import "UIButton+XYButton.h"
- @implementation LiveCenterManager
- BogoSingletonM(Instance);
- #pragma mark ------------------------------------------- 直播间开启部分 -------------------------------------------
- #pragma mark 主播开直播
- /**
- 主播开直播开直播
-
- @param dic API请求直播需要dic的参数
- @param isSusWindow 是否开启悬浮
- @param isSmallScreen 是否小屏幕直播
- @param block 处理回调
-
- * @Step:1 .首先API请求
- * @Step:2. 创建直播对应类型下的直播间VC
- * @Step:3. 悬浮部分 显示window层
- * @Step:4 处理手势 手势里回调+动画
- * @Step:5 动画加载悬浮
- *
- * @discussion: 1.主播开直播 先请求拿到后台直播类型 云||互动 代码包含 悬浮和非悬浮 悬浮部分要动画加载
- * @attention : 一定要注意参数,如果调悬浮达不到预想结果,请优先查看参数,特别是 isSusWindow和isSmallScreen 还有有些方法传递的直播间VC 和直播间UIVC,一定要区分!!!
-
- */
- - (void)showLiveOfAPIPramaDic:(NSMutableDictionary *)dic isSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen block:(FWIsFinishedBlock)block
- {
- [[AppDelegate sharedAppDelegate] isShowHud:YES hideTime:6];
- // 悬浮记录悬浮状态
- SUS_WINDOW.isSusWindow = isSusWindow;
- SUS_WINDOW.isSmallSusWindow = isSmallScreen;
-
- __weak typeof(self)weak_Self = self;
- // H1 首先API请求 内部悬浮记录 直播类型+是不是观众
- [[LiveCenterAPIManager sharedInstance] liveCenterAPIOfShowHostLiveOfDic:dic block:^(NSDictionary *responseJson, BOOL finished, NSError *error) {
-
- [[AppDelegate sharedAppDelegate] hideHud];
-
- if (finished && !error && responseJson)
- {
- // H2 API请求成功后 设置房间信息
- IMAHost *host = [IMAPlatform sharedInstance].host;
- TCShowUser *user = [[TCShowUser alloc] init];
- user.avatar = [host imUserIconUrl];
- user.uid = [host imUserId];
- user.username = [host imUserName];
-
- TCShowLiveListItem *liveRoom = [[TCShowLiveListItem alloc] init];
- liveRoom.host = user;
- liveRoom.avRoomId = [responseJson toInt:@"room_id"];
- liveRoom.title = [NSString stringWithFormat:@"%d",liveRoom.avRoomId];
- liveRoom.vagueImgUrl = [[IMAPlatform sharedInstance].host.customInfoDict toString:@"head_image"];
- // SUS_WINDOW 去记录直播间类型 这是不是观众
- liveRoom.liveType = SUS_WINDOW.liveType;
- liveRoom.isHost = SUS_WINDOW.isHost;
- // 2 开直播间 直播间类型很多需要判断
- UIViewController *tempLiveViewController = [weak_Self showNewLiveOfTCShowLiveListItem:liveRoom withModelArr:nil];
- // h3 如果开启了悬浮 悬浮动画处理+加载处理 非悬浮不做处理
- if(isSusWindow)
- {
- [weak_Self showSusWindowPartOfIsSusWindow:isSusWindow isSmallScreen:isSmallScreen liveViewControleller:tempLiveViewController block:^(BOOL isFinished) {
-
- if(block)
- {
- block(isFinished);
- }
-
- }];
- }
- else
- {
- if(block)
- {
- block(YES);
- }
- }
- }
- else
- {
- if(block)
- {
- block(NO);
- }
- }
- }];
- }
- /**
- 开启直播
-
- @param responseJson 开播参数
- @param isSusWindow 是否需要悬浮窗
- @param isSmallScreen 是否需要悬浮小屏
- @param block 回调
- */
- - (void)showLiveOfAPIResponseJson:(NSMutableDictionary *)responseJson isSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen block:(FWIsFinishedBlock)block
- {
- // 悬浮记录悬浮状态
- SUS_WINDOW.isSusWindow = isSusWindow;
- SUS_WINDOW.isSmallSusWindow = isSmallScreen;
-
- __weak typeof(self)weak_Self = self;
- // API请求成功后,设置房间信息
- IMAHost *host = [IMAPlatform sharedInstance].host;
- if (!host)
- {
- [[BGIMLoginManager sharedInstance] loginImSDK:YES succ:nil failed:nil];
- if (block)
- {
- block(NO);
- }
- return;
- }
- [GlobalVariables sharedInstance].appModel.spear_live = @"1";
- TCShowUser *user = [[TCShowUser alloc] init];
- user.avatar = [host imUserIconUrl];
- user.uid = [host imUserId];
- user.username = [host imUserName];
-
- TCShowLiveListItem *liveRoom = [[TCShowLiveListItem alloc] init];
- liveRoom.host = user;
- liveRoom.avRoomId = [responseJson toInt:@"room_id"];
- liveRoom.title = [NSString stringWithFormat:@"%d",liveRoom.avRoomId];
- liveRoom.vagueImgUrl = [[IMAPlatform sharedInstance].host.customInfoDict toString:@"head_image"];
- //SUS_WINDOW 去记录直播间类型 这是不是观众
- liveRoom.liveType = SUS_WINDOW.liveType;
- liveRoom.isHost = SUS_WINDOW.isHost;
- if([responseJson toInt:@"is_voice"] == 1)
- {
- liveRoom.is_voice = 1;
- }
- else
- {
- liveRoom.is_voice = 0;
- }
- //2 开直播间 直播间类型很多需要判断
- UIViewController *tempLiveViewController = [weak_Self showNewLiveOfTCShowLiveListItem:liveRoom withModelArr:nil];
- //h3 如果开启了悬浮 悬浮动画处理+加载处理 非悬浮不做处理
- if(isSusWindow)
- {
- [weak_Self showSusWindowPartOfIsSusWindow:isSusWindow isSmallScreen:isSmallScreen liveViewControleller:tempLiveViewController block:^(BOOL isFinished) {
- if(block)
- {
- block(isFinished);
- }
- }];
- }
- else
- {
- if(block)
- {
- block(YES);
- }
- }
- }
- /**
- 观众进直播
-
- @param dic 参数
- @param isSusWindow 是否需要悬浮Window
- @param isSmallScreen 是否需要悬浮小Window
- @param block 回调
- */
- - (void)showLiveOfAudienceLiveofPramaDic:(NSMutableDictionary *)dic isSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen block:(FWIsFinishedBlock)block
- {
- //判断是否实现协议 isSusWindow 为NO isSmallScreen 必须也为NO
- if (!isSusWindow && isSmallScreen)
- {
- [FanweMessage alertHUD:ASLocalizedString(@"直播间预加载参数出错")];
- }
-
- if (![[IMAPlatform sharedInstance].host conformsToProtocol:@protocol(AVUserAble)])
- {
- [[BGHUDHelper sharedInstance] loading:@"" delay:2 execute:^{
- [[BGIMLoginManager sharedInstance] loginImSDK:YES succ:nil failed:nil];
- } completion:^{
-
- }];
- return;
- }
-
- // // 判断dic 是否符合要求
- // 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"])
- // {
- // [FanweMessage alertHUD:ASLocalizedString(@"抱歉,房间信息出错")];
- // return;
- // }
-
- TCShowLiveListItem *item = [[TCShowLiveListItem alloc]init];
- item.chatRoomId = dic[@"group_id"];
- item.avRoomId = (int)[dic[@"room_id"] integerValue];
- item.title = StringFromInt(item.avRoomId);
- item.vagueImgUrl = dic[@"head_image"];
-
- TCShowUser *showUser = [[TCShowUser alloc]init];
- showUser.uid = dic[@"user_id"];
- showUser.avatar = item.vagueImgUrl;
- item.host = showUser;
-
- if ([dic[@"live_in"] integerValue] == FW_LIVE_STATE_ING)
- {
- item.liveType = FW_LIVE_TYPE_AUDIENCE;
- }
- else
- {
- [FanweMessage alert:ASLocalizedString(@"视频已结束或正在创建中!")];
- return;
- }
-
- SUS_WINDOW.sdkType = [[GlobalVariables sharedInstance].appModel.sdk_type intValue];
- SUS_WINDOW.liveType = (int)item.liveType;
- SUS_WINDOW.isSusWindow = isSusWindow;
- // 应该是这样理解,当前处于满屏状态。。然后呢,经过动画处理就变成了 小屏幕
- SUS_WINDOW.isSmallSusWindow = isSmallScreen;
- SUS_WINDOW.isHost = NO;
- __weak typeof(self)weak_Self = self;
- //G 1
- UIViewController *tempLiveViewController = [weak_Self showNewLiveOfTCShowLiveListItem:item withModelArr:nil];
- //G 2
- if(SUS_WINDOW.isSusWindow)
- {
- [SUS_WINDOW makeKeyWindow];
- SUS_WINDOW.hidden = NO;
- [weak_Self showSusWindowPartOfIsSusWindow:isSusWindow isSmallScreen:isSmallScreen liveViewControleller:tempLiveViewController block:^(BOOL isFinished) {
- }];
- }
- }
- /**
- 观众进直播
-
- @param item 进入直播间实体
- @param isSusWindow 是否需要悬浮Window
- @param isSmallScreen 是否需要悬浮小Window
- @param block 回调
- */
- #pragma mark - 直播列表进直播,观众进
- //观众进入
- - (void)showLiveOfAudienceLiveofTCShowLiveListItem:(TCShowLiveListItem *)item modelArr:(NSArray *)modelArr isSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen block:(FWIsFinishedBlock)block
- {
- #warning 由于把腾讯SDK和金山SDK发在一块后,用腾讯SDK光看回看会闪退,所以回看默认用金山SDK,后期有待观察
-
-
- NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
- [dict setObject:@"video" forKey:@"ctl"];
- [dict setObject:@"check_status" forKey:@"act"];
-
- [dict setValue:StringFromInt(item.avRoomId) forKey:@"room_id"];
-
- if(item.is_voice)
- {
- [dict setValue:@"voice" forKey:@"ctl"];
- [dict setValue:@"voice_status" forKey:@"act"];
- }
-
- [[NetHttpsManager manager] POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson) {
- [[BGHUDHelper sharedInstance] syncStopLoading];
- if ([responseJson toInt:@"status"] == 1) {
-
- [GlobalVariables sharedInstance].isOtherPush = NO;
-
- SUS_WINDOW.liveType = [[GlobalVariables sharedInstance].appModel.sdk_type intValue];
- SUS_WINDOW.isSusWindow = isSusWindow;
- // 应该是这样理解,当前处于满屏状态。。然后呢,经过动画处理就变成了 小屏幕
- SUS_WINDOW.isSmallSusWindow = isSmallScreen;
- SUS_WINDOW.isHost = NO;
- __weak typeof(self)weak_Self = self;
- //G 1 BGTLiveController
- UIViewController *tempLiveViewController = [weak_Self showNewLiveOfTCShowLiveListItem:item withModelArr:modelArr];
- //G 2
- if(SUS_WINDOW.isSusWindow)
- {
- [SUS_WINDOW makeKeyWindow];
- SUS_WINDOW.hidden = NO;
- [weak_Self showSusWindowPartOfIsSusWindow:isSusWindow isSmallScreen:isSmallScreen liveViewControleller:tempLiveViewController block:^(BOOL isFinished) {
- }];
- }
- }
- else
- {
- [BGHUDHelper alert:responseJson[@"error"]];
- }
- } FailureBlock:^(NSError *error) {
- [[BGHUDHelper sharedInstance] syncStopLoading];
- }];
-
- }
- #pragma mark -private methods ------------------------------------------ 私人方法区域 ------------------------------------------
- /**
- 开创直播间VC,主播、观众直播通用代码,注意这里未开悬浮状态下是:[APP_DELEGATE pushViewController:liveVC];
-
- @param item 进入直播间实体
- @return 返回当前vc
- */
- - (UIViewController *)showNewLiveOfTCShowLiveListItem:(TCShowLiveListItem *)item withModelArr:(NSArray *)modelArr
- {
- SUS_WINDOW.sdkType = [[GlobalVariables sharedInstance].appModel.sdk_type integerValue];
- // 云 主播 || 云观众
-
- //是否是语音房间 1是,0不是
- if(item.is_voice == 1)
- {
- BGVoiceController *liveVC = [[BGVoiceController alloc]initWith:item modelArr:modelArr];
- SUS_WINDOW.recordFWTLiveController = liveVC;
- if (SUS_WINDOW.isSusWindow)
- {
- // 如果开启悬浮
- SUS_WINDOW.rootViewController = [[UINavigationController alloc]initWithRootViewController:liveVC];
- }
- else
- {
- [APP_DELEGATE pushViewController:liveVC animated:YES];
- }
- return liveVC;
- }
-
- //视频直播
- if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_TXY)
- {
- BGTLiveController *liveVC = [[BGTLiveController alloc]initWith:item modelArr:modelArr];
- SUS_WINDOW.recordFWTLiveController = liveVC;
- if (SUS_WINDOW.isSusWindow)
- {
- // 如果开启悬浮
- SUS_WINDOW.rootViewController = [[UINavigationController alloc]initWithRootViewController:liveVC];
- }
- else
- {
- [APP_DELEGATE pushViewController:liveVC animated:YES];
- }
- return liveVC;
- }
- else if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_VOICE)
- {
-
- BGVoiceController *liveVC = [[BGVoiceController alloc]initWith:item modelArr:modelArr];
- SUS_WINDOW.recordFWTLiveController = liveVC;
- if (SUS_WINDOW.isSusWindow)
- {
- // 如果开启悬浮
- SUS_WINDOW.rootViewController = [[UINavigationController alloc]initWithRootViewController:liveVC];
- }
- else
- {
- [APP_DELEGATE pushViewController:liveVC animated:YES];
- }
- return liveVC;
-
-
-
- }
-
- return nil;
- }
- /**
- 先设置参数再利用参数判断动画,主播、观众通用代码
-
- @param isSusWindow 是否需要悬浮Window
- @param isSmallScreen 是否需要悬浮小Window
- @param liveViewControleller 直播vc
- @param block 回调
- */
- - (void)showSusWindowPartOfIsSusWindow:(BOOL)isSusWindow isSmallScreen:(BOOL)isSmallScreen liveViewControleller:(UIViewController *)liveViewControleller block:(FWIsFinishedBlock)block
- {
- [SUS_WINDOW makeKeyWindow];
- SUS_WINDOW.hidden = NO;
- SUS_WINDOW.isSusWindow = isSusWindow;
- SUS_WINDOW.isSmallSusWindow = isSmallScreen;
- //H4
- [SuspenionWindow showLoadGeatureOfSusWindow];
- //H5
- [SuspenionWindow showAnimationOfSusWindowSizeBlock:^(BOOL finished) {
- if (finished)
- {
- //手势 处理
- }
- if(block)
- {
- block(finished);
- }
- }];
- }
- #pragma mark ------------------------------------------- 直播间关闭 部分 -------------------------------------------
- #pragma mark - 直播间关闭启动预处理
- /**
- 开始启动直播间关闭处理
-
- @param liveViewController 需要退出的vc
- @param paiTimeNum 用来判断竞拍倒计时是否存在
- @param isDirectCloseLive 是否直接关闭直播
- @param isHostShowAlert 主播是否显示关闭直播的提示
- @param block 回调
- */
- - (void)closeLiveOfPramaOfLiveViewController:(UIViewController *)liveViewController paiTimeNum:(int)paiTimeNum alertExitLive:(BOOL)isDirectCloseLive isHostShowAlert:(BOOL)isHostShowAlert colseLivecomplete:(FWIsFinishedBlock)block
- {
- // 音乐存在必须 要关闭
- // if (ST_M_CENTER.stMusicPlayingState != STMusicPlayingStateDefault)
- // {
- // [ST_M_CENTER setStMusicPlayingState:STMusicPlayingStateDefault];
- // }
- MUSIC_CENTER_MANAGER.musicPlayingState = NO;
- // 这个判断这里执行。后面再调方法没必要判断
- if (!liveViewController)
- {
- if(block)
- {
- block(NO);// 不退出
- }
- return;
- }
-
- // 参数的记录感觉 放在 这里
- SUS_WINDOW.isDirectCloseLive = isDirectCloseLive; //记录 当前需不需要 finishVC NO需要
- SUS_WINDOW.isHostShowAlert = isHostShowAlert;//记录当前需不需要 提示
-
- // 键盘退出
- [BGUtils closeKeyboard];
-
- __weak typeof(self)weak_Self = self;
- // 悬浮类有关 假如存在悬浮 优先让悬浮恢复到满屏 再做退出处理
- // 悬浮的写在 悬浮类里面
- [SuspenionWindow closeSuswindowUIComplete:^(BOOL finished) {
- SUS_WINDOW.window_Pan_Ges.enabled = NO;
- // 执行直播层(非悬浮)退出 先判断+后真退出
-
- if(finished)
- {
- [weak_Self closeLiveAfterClosedOfSusWindowUIOfLiveViewController:liveViewController paiTimeNum:paiTimeNum closeComplete:^(BOOL isFinished) {
- if(block)
- {
- block(isFinished);
- }
- }];
- }
- }];
- }
- /**
- 非悬浮关闭处理:
- 1.判断悬浮;
- 2.判断音乐;
- 3.判断是不是主播 观众基本直接退出去;
- 4.悬浮参数的退出;
-
- @param liveViewControlelr 直播vc
- @param paiTimeNum 竞拍倒计时
- @param block 回调
- */
- - (void)closeLiveAfterClosedOfSusWindowUIOfLiveViewController:(UIViewController *)liveViewControlelr paiTimeNum:(int)paiTimeNum closeComplete:(FWIsFinishedBlock)block
- {
- // 拿到对应liveC
- __weak typeof(self)weak_Self = self;
- __weak BGTLiveController *tLiveC;
- // __weak BGKSYLiveController *ksyLiveC;
- //不可删
- if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_TXY)
- {
- tLiveC =(BGTLiveController *)liveViewControlelr;
- tLiveC.isDirectCloseLive = SUS_WINDOW.isDirectCloseLive;
- // 暂停播放背景音乐
- [tLiveC.publishController.txLivePublisher pauseBGM];
- }
-
- // 判断 提示 竞拍存在
- // 竞拍 之 云 主0 互主 3 host
- if (paiTimeNum)
- {
- if (SUS_WINDOW.liveType == FW_LIVE_TYPE_HOST)
- {
- if(block)
- {
- block(NO); // 不退出
- }
- return;
- }
- else if (SUS_WINDOW.liveType == FW_LIVE_TYPE_AUDIENCE)
- {
- if(SUS_WINDOW.isHostShowAlert)
- {
- // 调退出直播方法
- [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
- if(block)
- {
- block(YES);
- }
- }];
- }
- }
- }
-
- // 云主 0 观主 3
- if(SUS_WINDOW.liveType == FW_LIVE_TYPE_HOST)
- {
-
-
-
- // if(SUS_WINDOW.isHostShowAlert)
- // {
-
- //语音房间添加
- if([liveViewControlelr.class isEqual:[BGVoiceController class]])
- {
- __weak __typeof(self)weakSelf = self;
-
- RoomCloseMoreView *moreView = [RoomCloseMoreView getView];
- moreView.frame = liveViewControlelr.view.bounds;
- [moreView.shareBtn addTapBlock:^(UIButton *btn) {
- [moreView hide];
- [((BGVoiceController *)liveViewControlelr).liveServiceController clickShareBtn:nil];
-
- }];
-
- // [moreView.colseBtn addTapBlock:^(UIButton *btn) {
- // [moreView hide];
- //
- //
- // }];
-
-
- [moreView.cancelBtn addTapBlock:^(UIButton *btn) {
- __strong __typeof(weakSelf)strongSelf = weakSelf;
- [moreView hide];
- }];
- #pragma mark - 关闭语音直播
- [moreView.colseBtn addTapBlock:^(UIButton *btn) {
- BGVoiceController *livevc = (BGVoiceController *)liveViewControlelr;
- NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
- [dict setValue:@"voice" forKey:@"ctl"];
- [dict setValue:@"close_voice" forKey:@"act"];
- [dict setValue:livevc.liveInfo.room_id forKey:@"room_id"];
-
- [[NetHttpsManager manager] POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson) {
-
- // 调退出直播方法
- [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
- if(block)
- {
- block(YES);
- }
- }];
-
- } FailureBlock:^(NSError *error) {
- NSLog(ASLocalizedString(@"结束PK请求失败error:%@"),error);
- }];
- }];
- [liveViewControlelr.view addSubview:moreView];
- [moreView show:liveViewControlelr.view type:FDPopTypeCenter];
-
- // FDActionSheet *actionSheet = [[FDActionSheet alloc] initWithTitle:@"" message:@""];
- //
- // [actionSheet addAction:[FDAction actionWithTitle:ASLocalizedString(@"关闭直播间") type:FDActionTypeDefault CallBack:^{
- //
- // BGVoiceController *livevc = (BGVoiceController *)liveViewControlelr;
- // NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
- // [dict setValue:@"voice" forKey:@"ctl"];
- // [dict setValue:@"close_voice" forKey:@"act"];
- // [dict setValue:livevc.liveInfo.room_id forKey:@"room_id"];
- //
- // [[NetHttpsManager manager] POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson) {
- //
- // // 调退出直播方法
- // [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
- // if(block)
- // {
- // block(YES);
- // }
- // }];
- //
- // } FailureBlock:^(NSError *error) {
- // NSLog(ASLocalizedString(@"结束PK请求失败error:%@"),error);
- // }];
- //
- //
- //
- // }]];
- // [actionSheet show:[UIApplication sharedApplication].keyWindow];
- }
- else
- {
- [FanweMessage alert:nil message:ASLocalizedString(@"确定要结束直播吗?")destructiveAction:^{
- //结束PK
- NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
- [dict setValue:@"pk_tencent" forKey:@"ctl"];
- [dict setValue:@"request_end_pk" forKey:@"act"];
- [[NetHttpsManager manager] POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson) {
- if ([responseJson toInt:@"status"] == 1) {
- NSLog(ASLocalizedString(@"结束PK请求成功responseJson:%@"),responseJson);
- }else{
- NSLog(ASLocalizedString(@"结束PK请求失败responseJson:%@"),responseJson);
- }
- } FailureBlock:^(NSError *error) {
- NSLog(ASLocalizedString(@"结束PK请求失败error:%@"),error);
- }];
- // 调退出直播方法
- [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
- if(block)
- {
- block(YES);
- }
- }];
-
- } cancelAction:^{
-
- // 不退出
- if(block)
- {
- block(NO);
- }
-
- }];
- }
-
- // }
- // else
- // {
- // // 调退出直播方法
- // [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
- // if(block)
- // {
- // block(YES);
- // }
- // }];
- // }
- }
-
- // 观众 直接退出
- if (SUS_WINDOW.liveType == FW_LIVE_TYPE_AUDIENCE)
- {
- __weak __typeof(self)weakSelf = self;
-
- if([liveViewControlelr.class isEqual:[BGVoiceController class]])
- {
- RoomCloseMoreView *moreView = [RoomCloseMoreView getView];
- moreView.frame = liveViewControlelr.view.bounds;
- [moreView.shareBtn addTapBlock:^(UIButton *btn) {
- [moreView hide];
- [((BGVoiceController *)liveViewControlelr).liveServiceController clickShareBtn:nil];
-
- }];
-
- // [moreView.colseBtn addTapBlock:^(UIButton *btn) {
- // [moreView hide];
- //
- //
- // }];
-
-
- [moreView.cancelBtn addTapBlock:^(UIButton *btn) {
- __strong __typeof(weakSelf)strongSelf = weakSelf;
- [moreView hide];
- }];
-
- [moreView.colseBtn addTapBlock:^(UIButton *btn) {
- // 调退出直播方法
- [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
- if(block)
- {
- block(YES);
- }
- }];
- }];
- [liveViewControlelr.view addSubview:moreView];
- [moreView show:liveViewControlelr.view type:FDPopTypeCenter];
- }
- else
- {
- // 调退出直播方法
- [weak_Self closeLiveRealOfSDKWithLiveViewController:liveViewControlelr complete:^(BOOL isFinished) {
- if(block)
- {
- block(YES);
- }
- }];
- }
-
- }
- }
- #pragma mark -private methods ------------------------------------------ 私人方法区域 ------------------------------------------
- /**
- 调SDK等相关退出
-
- @param liveViewController 需要退出的vc,要区分一下开始掉关闭预加载时候的参数,让悬浮去记录
- @param block 回到
- */
- - (void)closeLiveRealOfSDKWithLiveViewController:(UIViewController *)liveViewController complete:(FWIsFinishedBlock)block
- {
- // 目前 下面走的是 NO 需要
- __weak BGTLiveController *tLiveC;
- // __weak BGKSYLiveController *ksyLiveC;
-
- __weak typeof(self)weak_self = self;
-
- // 云部分
- if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_TXY)
- {
- tLiveC =(BGTLiveController *)liveViewController;
-
- //执行退出
- [tLiveC realExitLive:^{
- [weak_self resetSuswindowPramaComple:^(BOOL isFinished) {
- if(block)
- {
- block(YES);
- }
- }];
- } failed:^(int errId, NSString *errMsg) {
-
- [weak_self resetSuswindowPramaComple:^(BOOL isFinished) {
- if(block)
- {
- block(YES);
- }
- }];
- }];
- }
-
- }
- - (void)resetSuswindowPramaComple:(FWIsFinishedBlock)block
- {
- if (![BGUtils isBlankString:SUS_WINDOW.switchedRoomId])
- {
- NSString *tmpStr = SUS_WINDOW.switchedRoomId;
- SUS_WINDOW.switchedRoomId = nil;
-
- [BGLiveSDKViewModel checkVideoStatus:tmpStr successBlock:^(NSDictionary *responseJson) {
-
- TCShowLiveListItem *item = [[TCShowLiveListItem alloc]init];
- item.chatRoomId = [responseJson toString:@"group_id"];
- item.avRoomId = [[responseJson toString:@"room_id"] intValue];
- item.title = [responseJson toString:@"room_id"];
-
- NSInteger live_in = [responseJson toInt:@"live_in"];
-
- if (live_in == FW_LIVE_STATE_ING)
- {
- item.liveType = FW_LIVE_TYPE_AUDIENCE;
- BOOL isSusWindow = [[LiveCenterManager sharedInstance] judgeIsSusWindow];
- [[LiveCenterManager sharedInstance]showLiveOfAudienceLiveofTCShowLiveListItem:item modelArr:nil isSusWindow:isSusWindow isSmallScreen:NO block:^(BOOL isFinished) {
-
- }];
- }
- else
- {
- [FanweMessage alert:ASLocalizedString(@"该直播已结束")];
- }
-
- } failureBlock:^(NSError *error) {
-
- }];
- }
-
- // 为NO 需要finish界面
- if(!SUS_WINDOW.isDirectCloseLive)
- {
- if(block)
- {
- block(NO);
- }
- return;
- }
- // 悬浮层处理
- [SuspenionWindow resetSusWindowPramaWhenLiveClosedComplete:^(BOOL finished) {
- if (block)
- {
- block(finished);
- }
- }];
- }
- /**
- 屏幕大小缩放处理,使用前提:需要悬浮挂起或挂起小屏幕后再恢复满屏幕
-
- @param isSmallScreen 是否悬浮小Window
- @param block 回调
- */
- - (void)showChangeLiveScreenSOfIsSmallScreen:(BOOL)isSmallScreen complete:(FWIsFinishedBlock)block
- {
- if (!SUS_WINDOW.isSusWindow)
- {
- return;
- }
-
- SUS_WINDOW.isSmallSusWindow = isSmallScreen;
- //动画
- [SuspenionWindow showAnimationOfSusWindowSizeBlock:^(BOOL finished) {
- if (block)
- {
- block(finished);
- }
- }];
- }
- #pragma mark ----------------------------------------- 竞拍区域 ------------------------------------------------------
- /**
- 竞拍屏幕处理大小处理,使用前提:竞拍开启直播后,需要悬浮挂起或挂起小屏幕后再恢复满屏幕
-
- @param isSmallScreen 是否悬浮小Window
- @param nextViewController 你回到满屏,可为nil
- @param delegateWindowRCNameStr 当你去下个VC,可为nil
- @param block 回调
- */
- - (void)showChangeAuctionLiveScreenSOfIsSmallScreen:(BOOL)isSmallScreen nextViewController:(UIViewController *)nextViewController delegateWindowRCNameStr:(NSString *)delegateWindowRCNameStr complete:(FWIsFinishedBlock)block
- {
- // 判断
- if (!SUS_WINDOW.isSusWindow)
- {
- return;
- }
- // 最好做安全判断
- if (!((isSmallScreen&&nextViewController) || (!isSmallScreen&& ![delegateWindowRCNameStr isEmpty])))
- {
- [FanweMessage alertHUD:ASLocalizedString(@"参数错误!")];
- return;
- }
-
- // 记录屏幕状态
- SUS_WINDOW.isSmallSusWindow = isSmallScreen;
- // 去下个界面,要优先于动画
- if (isSmallScreen&&nextViewController)
- {
- BGNavigationController *nav = [[BGNavigationController alloc] initWithRootViewController:nextViewController];
- APP_DELEGATE.window.rootViewController = nav;
- }
- // 回到满屏幕
- [SuspenionWindow showAnimationOfSusWindowSizeBlock:^(BOOL finished) {
- // 恢复满屏幕路 动画要优先执行完毕
- if (finished)
- {
- if( !isSmallScreen&& ![delegateWindowRCNameStr isEmpty])
- {
- [SuspenionWindow closeSanwichLayerOfNetRootVCStr:delegateWindowRCNameStr complete:^(BOOL finished) {
- if (block)
- {
- block(finished);
- }
- }];
- }
- else
- {
- if (block)
- {
- block(finished);
- }
- }
- }
- }];
- }
- #pragma mark ---------------------------------------- 踢下线通知 -------------------------------------------------------
- /**
- 踢下线通知
-
- @param imAPlatform 里监听到有互踢消息执行对应的方法,这个方法主要解决先视频的退出问题
- @param block 回调
- */
- - (void)showOffLineWarningwithIMAPlatform:(IMAPlatform *)imAPlatform complete:(FWIsFinishedBlock)block
- {
- //音乐存在的话,必须先关闭
- // if (ST_M_CENTER.stMusicPlayingState != STMusicPlayingStateDefault)
- // {
- // [ST_M_CENTER setStMusicPlayingState:STMusicPlayingStateDefault];
- // }
-
-
-
- [FanweMessage alert:ASLocalizedString(@"下线通知")message:ASLocalizedString(@"您的账号在其他设备登录,如果不是您的操作,请及时修改密码")destructiveAction:^{
-
- if (block)
- {
- block(YES);
- }
- // 退出
- if(SUS_WINDOW.liveType == 0 || SUS_WINDOW.liveType == 1 || SUS_WINDOW.liveType == 2)
- {
- if (SUS_WINDOW.recordFWTLiveController)
- {
- [SUS_WINDOW.recordFWTLiveController alertExitLive:YES isHostShowAlert:NO succ:^{
- [imAPlatform doLogout];
-
- } failed:^(int errId, NSString *errMsg) {
- [imAPlatform doLogout];
-
- }];
- }
- else if (SUS_WINDOW.threeFWKSYLiveController)
- {
- [SUS_WINDOW.threeFWKSYLiveController alertExitLive:YES isHostShowAlert:NO succ:^{
- [imAPlatform doLogout];
-
- } failed:^(int errId, NSString *errMsg) {
- [imAPlatform doLogout];
-
- }];
- }
- else
- {
- [imAPlatform doLogout];
- }
- }
-
- } cancelAction:^{
-
- if (block)
- {
- block(YES);
- }
- // 退出
- if(SUS_WINDOW.liveType == 0 || SUS_WINDOW.liveType == 1 || SUS_WINDOW.liveType == 2)
- {
- if (SUS_WINDOW.recordFWTLiveController)
- {
- [SUS_WINDOW.recordFWTLiveController alertExitLive:YES isHostShowAlert:NO succ:^{
- [imAPlatform doLogout];
-
- } failed:^(int errId, NSString *errMsg) {
- [imAPlatform doLogout];
-
- }];
- }
- else if (SUS_WINDOW.threeFWKSYLiveController)
- {
- [SUS_WINDOW.threeFWKSYLiveController alertExitLive:YES isHostShowAlert:NO succ:^{
- [imAPlatform doLogout];
-
- } failed:^(int errId, NSString *errMsg) {
- [imAPlatform doLogout];
-
- }];
- }
- else
- {
- [imAPlatform doLogout];
- }
- }
-
- }];
- }
- /**
- 进入直播
-
- @param liveListItem 进入直播间实体
- @param liveWindowType LiveWindowType
- @param liveType 视频类型
- @param liveSDKType SDK类型
- @param block 回调
- */
- //主播开播进入
- - (void)showLiveOfTCShowLiveListItem:(TCShowLiveListItem *)liveListItem andLiveWindowType:(LiveWindowType)liveWindowType andLiveType:(FW_LIVE_TYPE)liveType andLiveSDKType:(FW_LIVESDK_TYPE)liveSDKType andCompleteBlock:(FWIsFinishedBlock)block
- {
- // 开直播间 直播间类型很多需要判断
- BOOL isOpenSusWindow = false;
- BOOL isOpenNormalWindow = false;
- UIViewController *liveVC;
- //云
- if(liveSDKType == FW_LIVESDK_TYPE_TXY)
- {
- liveVC = [[BGTLiveController alloc]initWith:liveListItem modelArr:nil];
- //创建liveVC后需要设置悬浮代理
- [_stSuspensionWindow setDelegate:(BGTLiveController *)liveVC];
- //悬浮
- if(liveWindowType == liveWindowTypeOfSusOfFullSize || liveWindowType ==LiveWindowTypeOfSusSmallSize)
- {
- //如果开启悬浮
- isOpenSusWindow = YES;
- //非悬浮
- }else if(liveWindowType ==LiveWindowTypeOfNormolOfFullSize || liveWindowType == LiveWindowTypeOfNormolSmallSize){
- isOpenNormalWindow = YES;
- }else{
- //1.请正确方式填写枚举类型,不准用数字代替 //目前只扩展了4种,默认情况上面已经过滤
- }
- }
- else if(liveSDKType == FW_LIVESDK_TYPE_VOICE)
- {
- liveVC = [[BGVoiceController alloc]initWith:liveListItem modelArr:nil];
- //创建liveVC后需要设置悬浮代理
- [_stSuspensionWindow setDelegate:(BGVoiceController *)liveVC];
- //悬浮
- if(liveWindowType == liveWindowTypeOfSusOfFullSize || liveWindowType ==LiveWindowTypeOfSusSmallSize)
- {
- //如果开启悬浮
- isOpenSusWindow = YES;
- //非悬浮
- }else if(liveWindowType ==LiveWindowTypeOfNormolOfFullSize || liveWindowType == LiveWindowTypeOfNormolSmallSize){
- isOpenNormalWindow = YES;
- }else{
- //1.请正确方式填写枚举类型,不准用数字代替 //目前只扩展了4种,默认情况上面已经过滤
- }
- }
- else
- {
- //其他直播代码暂时不支持
- }
-
- //悬浮和非悬浮必定有个为YES
- if ((isOpenSusWindow && !isOpenNormalWindow)||(!isOpenSusWindow && isOpenNormalWindow))
- {
- //悬浮
- if (isOpenSusWindow && !isOpenNormalWindow)
- {
- _stSuspensionWindow.rootViewController = [[UINavigationController alloc]initWithRootViewController:liveVC];
- _stSuspensionWindow.windowLevel = 3005;
- [_stSuspensionWindow makeKeyWindow];
- _stSuspensionWindow.hidden = NO;
- }
- else
- {
- //非悬浮
- [APP_DELEGATE pushViewController:liveVC animated:YES];
- }
- //只有开启了直播,必须是动画完成才是真正赋值管理中心采取 记录最新状态,否则管理中心数据为默认无直播状态
- [self setLiveSDKType:liveSDKType];
- [self setLiveType:liveType];
- [self setRecordLiveViewC:liveVC];
- [self setLiveWindowType:liveWindowType];
- if(block)
- {
- block(YES);
- }
- //动画加载出来
- }
- else
- {
- //参数设置出问题,检查代码
- if(block){
- block(NO);
- }
- }
- }
- #pragma mark ---------------------------------------- 关直播 -------------------------------------------------------
- // 键盘退出 最好写在外面
- // 音乐暂停
- - (void)showCloseLiveComplete:(FWIsFinishedBlock)block
- {
- // 直播得存在
- if (!_recordLiveViewC)
- {
- if (block)
- {
- block(NO);
- }
- return;
- }
- // 键盘退出
- [BGUtils closeKeyboard];
-
- // 处理满屏问题
- // 因为进直播的时候已经记录直播类型
- // 当前为悬浮小
- if (_liveWindowType == LiveWindowTypeOfSusSmallSize )
- {
- // 小-->大
- [self setLiveWindowType:liveWindowTypeOfSusOfFullSize];
- }
- // 当前为满屏
- else if(_liveWindowType == liveWindowTypeOfSusOfFullSize || _liveWindowType == LiveWindowTypeOfNormolOfFullSize)
- {
- [self setLiveWindowType:_liveWindowType];
- }
- else
- {
- // 暂时其余枚举类型,代码不支持
- if (block)
- {
- block(NO);
- }
- return;
- }
- // 只有当悬浮层退出后,才真正执行直播退出
- if (block)
- {
- block(YES);
- }
- }
- // 判断是否需要悬浮Window
- - (BOOL)judgeIsSusWindow
- {
- BOOL isSusWindow = NO;
- // if(kSupportH5Shopping)
- // {
- // isSusWindow = NO;
- // }
- // else if ([GlobalVariables sharedInstance].appModel.open_podcast_goods == 1)
- // {
- // isSusWindow = NO;
- // }
- // else if ([[GlobalVariables sharedInstance].appModel.shopping_goods integerValue] == 1 || [[GlobalVariables sharedInstance].appModel.open_pai_module integerValue] == 1)
- // {
- // isSusWindow = YES;
- // }
- // else
- // {
- // isSusWindow = NO;
- // }
- return isSusWindow;
- }
- // 判断是否需要悬浮小Window
- - (BOOL)judgeIsSmallSusWindow
- {
- if ([self judgeIsSusWindow])
- {
- return NO;
- }
- else
- {
- return NO;
- }
- }
- #pragma mark --------------------------- get方法区域
- - (STSuspensionWindow *)stSuspensionWindow
- {
- if (!_stSuspensionWindow)
- {
- _stSuspensionWindow = [STSuspensionWindow showWindowTypeOfSTBaseSuspensionWindowOfFrameRect:CGRectMake(0, 0, kScreenW, kScreenH) ofSTBaseSuspensionWindowLevelValue: 3050 complete:^(BOOL finished, STSuspensionWindow *stSuspensionWindow) {
-
- }];
- }
- return _stSuspensionWindow;
- }
- #pragma mark --------------------------- set方法区域
- - (void)setLiveWindowType:(LiveWindowType)liveWindowType
- {
- if (_liveWindowType != liveWindowType)
- {
- if(_stSuspensionWindow)
- {
- _liveWindowType = liveWindowType;
- }
-
- // 动画
- [_stSuspensionWindow setStSusWindowShowState:stSusWindowShowYES];
- [_stSuspensionWindow setIsSmallSize:(liveWindowType == LiveWindowTypeOfNormolSmallSize ? YES : NO)];
- }
- }
- -(void)setItemModel:(TCShowLiveListItem *)itemModel{
- _itemModel=itemModel;
- }
- @end
|