Files
peko-ios/YuMi/Modules/YMTabbar/View/TabbarViewController.m
eggmanQQQ 627748d230 #916
save code
2024-06-21 01:37:38 +08:00

1120 lines
48 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// ViewController.m
// YUMI
//
// Created by admin on 2023/3/9.
//
#import <UIKit/UIKit.h>
///Third
#import <ReactiveObjC/ReactiveObjC.h>
#import <NIMSDK/NIMSDK.h>
#import <Masonry/Masonry.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AFNetworkReachabilityManager.h>
#import <POP.h>
#import <AFNetworking.h>
///Tool
#import "YUMIMacroUitls.h"
#import "DJDKMIMOMColor.h"
#import "UIImage+Utils.h"
#import "NSObject+MJExtension.h"
#import "XNDJTDDLoadingTool.h"
#import "AccountInfoStorage.h"
#import "TTPopup.h"
#import "YUMIConstant.h"
#import "XPRoomMiniManager.h"
#import "ClientConfig.h"
#import "RtcManager.h"
#import "XCCurrentVCStackManager.h"
#import "Api+Home.h"
#import "YUMIConstant.h"
#import "StatisticsServiceHelper.h"
#import "Api+Monents.h"
#import "XPAdImageTool.h"
#import "YYUtility.h"
#import "XPWeakTimer.h"
#import "PLTimeUtil.h"
#import "Api+MSRoomGameApi.h"
///Model
#import "MSRoomGameModel.h"
#import "AccountModel.h"
#import "RoomInfoModel.h"
#import "AttachmentModel.h"
#import "XPMineVisitorUnReadModel.h"
#import "InviteUserInfoModel.h"
#import "NewUserGreetModel.h"
#import "FindNewGreetMessageModel.h"
#import "XPTabAnchorCardModel.h"
#import "FirstRechargeModel.h"
#import "MonentsUnReadModel.h"
#import "XPRedPacketModel.h"
#import "GiftReceiveInfoModel.h"
#import "XPVersionUpdateModel.h"
#import "MSRoomGameQuitGameView.h"
///VC
#import "TabbarViewController.h"
#import "XPBlankViewController.h"
#import "XPLoginViewController.h"
#import "BaseNavigationController.h"
#import "LoginBindPhoneViewController.h"
#import "LoginFullInfoViewController.h"
#import "XPMineViewController.h"
#import "XPSessionMainViewController.h"
#import "XPNewHomeViewController.h"
#import "XPMiniRoomView.h"
#import "XPRoomViewController.h"
#import "XPSessionFindNewAlertView.h"
#import "XPAnchorCardView.h"
#import "XPTaskCompleteTipView.h"
#import "XPWebViewController.h"
#import "XPMineUserInfoViewController.h"
#import "MSTabbarRoomGameVC.h"
#import "MSRoomGameVC.h"
#import "XPMonentsRecommendViewController.h"
#import "XPMomentsViewController.h"
#import "XPReceiveRedPacketView.h"
#import "XPRoomYearActivityView.h"
#import "XPUpgradeView.h"
#import "XPLoginAuthCodeVC.h"
///Present
#import "MainPresenter.h"
#import "MainProtocol.h"
#import "RoomHostDelegate.h"
#import "XPSkillCardPlayerManager.h"
#import "PIFullScreenBannerAnimation.h"
#import <SVGA.h>
#import "Api+Gift.h"
#import "UploadFile.h"
#import "XPTabBar.h"
#import "XPHomePagingViewController.h"
NSString * const kUserFirstLoginKey = @"kUserFirstLoginKey";
NSString * const kHadLaunchApp = @"kHadLaunchApp";
NSString * const kLastShowAnchorCardTime = @"kLastShowAnchorCardTime";
NSString * const kNetworkReachabilityKey = @"kNetworkReachabilityKey";
UIKIT_EXTERN NSString * kNewUserRechargeKey;
UIKIT_EXTERN NSString *kTabShowAnchorCardKey;
@interface TabbarViewController () <BaseMvpProtocol, MainProtocol, NIMLoginManagerDelegate, NIMSystemNotificationManagerDelegate, NIMChatManagerDelegate,XPLoginAuthCodeVCDelegate, XPAnchorCardViewDelegate, NIMBroadcastManagerDelegate, XPRoomYearActivityViewDelegate,MSRoomGameQuitGameViewDelegate>
{
NSTimer * timer;
}
///用户信息
@property (nonatomic,strong) UserInfoModel *userInfo;
@property (nonatomic, strong) MainPresenter *presenter;
///房间最小化
@property (nonatomic,strong) XPMiniRoomView *roomMineView;
///需要显示新用户充值优惠弹窗
@property (nonatomic, assign) BOOL needShowNewUserRecharge;
///需要展示主播卡片(首次)
@property (nonatomic, assign) BOOL needShowAnchorCard;
///延迟弹出主播卡片
@property (nonatomic, assign) BOOL delayShowAnchorCard;
///主播卡片
@property (nonatomic, strong) XPAnchorCardView *anchorCardView;
///任务完成提示
@property (nonatomic, strong) XPTaskCompleteTipView *taskTipView;
///全服广播 年度飘屏
@property (nonatomic,strong) NSMutableArray<GiftReceiveInfoModel *> *giftBroadcastQueue;
///是否是的第一次链接网络
@property (nonatomic,assign) BOOL isFirstReachability;
///是否刷新了
@property (nonatomic,assign) BOOL isReload;
///是否刷新了
@property (nonatomic,assign) BOOL isInitReload;
@property(nonatomic,assign) BOOL isReloadTicket;
///房间外的飘屏
@property(nonatomic,strong) PIFullScreenBannerAnimation *roomAnimation;
@end
@implementation TabbarViewController
- (void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self];
[[NIMSDK sharedSDK].loginManager removeDelegate:self];
[[NIMSDK sharedSDK].chatManager removeDelegate:self];
[[NIMSDK sharedSDK].systemNotificationManager removeDelegate:self];
[[NIMSDK sharedSDK].broadcastManager removeDelegate:self];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.presenter autoLogin];
[self configTheme];
[self initTabs:NO];
if([ClientConfig shareConfig].isLoad == NO){
[[ClientConfig shareConfig] clientInit];
[ClientConfig shareConfig].isLoad = YES;
}
[[NIMSDK sharedSDK].loginManager addDelegate:self];
[[NIMSDK sharedSDK].chatManager addDelegate:self];
[[NIMSDK sharedSDK].systemNotificationManager addDelegate:self];
[[NIMSDK sharedSDK].broadcastManager addDelegate:self];
[self networkReachability];
[self.view addSubview:self.roomMineView];
@kWeakify(self);
[[NSNotificationCenter defaultCenter] addObserverForName:kRoomMiniNotificationKey object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
@kStrongify(self);
[self configRoomMiniNView:note.userInfo];
}];
[[NSNotificationCenter defaultCenter] addObserverForName:@"reloadnewtab" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
@kStrongify(self);
if (self.isInitReload == NO) {
[self initTabs:YES];
self.isReload = YES;
}
}];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showNewUserRecharge) name:kNewUserRechargeKey object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showAnchorCardKey:) name:kTabShowAnchorCardKey object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(switchLanguage:) name:@"kSwitchLanguage" object:nil];
}
-(void)switchLanguage:(NSNotification *)not{
[self initTabs:YES];
self.selectedIndex = 4;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
self.isReloadTicket = YES;
if ([XPRoomMiniManager shareManager].getRoomInfo == nil) {
[self.roomMineView hiddenRoomMiniView];
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.delayShowAnchorCard = NO;
[self.anchorCardView removeFromSuperview];
self.anchorCardView = nil;
}
- (MainPresenter *)presenter {
if (_presenter == nil) {
_presenter = [[MainPresenter alloc] init];
[_presenter attatchView:self];
}
return _presenter;
}
/** 登录成功通过token且换取ticket后
1. 登录云信。
2. 获取用户信息。
3. 其实目前多余回调V层可以在P层里自行做这个逻辑。
*/
- (void)autoLoginSuccess {
[self.presenter loginNIM];
[self.presenter getUserInfo];
[[UploadFile share]initQCloud];
///登录成功之后 在验证是否有漏单的行为
[self.presenter checkTranscation];
///检查更新
[self.presenter getVersionUpdate];
if (self.inviteCode && self.inviteCode.length > 0) {
///邀请码进房
[self.presenter checkInviteUserInfo:self.inviteCode];
}
[self requestGiftList];
///主要功能:给主播分流
// [self clientStartApp];
// ///开启心跳 记录用户登录状态
// [[ClientConfig shareConfig] addHeartBratTimer];
XPAdImageTool.shareImageTool.isImLogin = YES;
if ([self hadLaunchApp] && [self canShowAnchorCard]) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (self.view.window && self.isViewLoaded) {
[self.presenter getAnchorCardInfo];
}
});
}
if (self.needShowAnchorCard && !self.delayShowAnchorCard) {
[self.presenter getAnchorCardInfo];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:kHadLaunchApp];///第一次弹主播卡片
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
-(void)getRoomGameInfo{
[Api getRoomGameDetailsForHoem:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
if(code == 200){
MSRoomGameModel *model = [MSRoomGameModel modelWithJSON:data.data];
if(model.data.matchStatus == 1 && model.data.roundStatus == 0){
MSTabbarRoomGameItemModel *chooseGameModel = [MSTabbarRoomGameItemModel new];
chooseGameModel.scores = model.data.scores;
chooseGameModel.roomId = model.roomId;
MSRoomGameQuitGameView *quitGameView = [[MSRoomGameQuitGameView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)];
quitGameView.chooseGameModel = chooseGameModel;
quitGameView.delegate = self;
[TTPopup popupView:quitGameView style:TTPopupStyleAlert];
}
}
}];
}
#pragma mark -MSRoomGameQuitGameViewDelegate
///退出游戏
- (void)closeGameActionWithModel:(MSTabbarRoomGameItemModel *)model{
[Api closeRoomGame:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
} roomId:model.roomId];
}
///强杀app打开后,是否重新玩游戏
-(void)replayTheGameWithModel:(MSTabbarRoomGameItemModel *)model{
MSRoomGameVC *gameVC = [MSRoomGameVC new];
gameVC.chooseGameModel = model;
gameVC.userinfo = self.userInfo;
BaseNavigationController *nav = [[BaseNavigationController alloc]initWithRootViewController:gameVC];
nav.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:nav animated:YES completion:nil];
}
/// 获取用户信息后检查1、是否绑定手机号2、是否需要完善用户信息。
/// 该逻辑仅在刷新ticket后执行一次。
/// 当前服务端接口是有未完善信息的全局拦截的在BaseMvpPresenter里会触发1415去完善用户信息。
- (void)getUserInfoSuccess:(UserInfoModel *)userInfo {
if (!userInfo.isBindPhone && [ClientConfig shareConfig].iosPhoneBind) {
LoginBindPhoneViewController * bindPhoneVC = [[LoginBindPhoneViewController alloc] init];
BaseNavigationController * nav = [[BaseNavigationController alloc] initWithRootViewController:bindPhoneVC];
nav.modalPresentationStyle = UIModalPresentationFullScreen;
[self.navigationController presentViewController:nav animated:YES completion:nil];
return;
}
self.userInfo = userInfo;
[self getRoomGameInfo];
[AccountInfoStorage instance].name = self.userInfo.nick;
if ((userInfo.nick == nil || userInfo.avatar == nil) && self.isFormLogin == NO) {
[self completeUserInfo];
return;
}
if(self.isReload == NO){
[self initTabs:YES];
self.isInitReload = YES;
}
if (self.inviteCode.length <= 0) {
[self initQuickEnterRoom];
}
if (self.inviteCode) {
self.inviteCode = nil;
}
[self monentsUnReadCount];
}
-(void)loginIng{
if ((self.userInfo.nick == nil || self.userInfo.avatar == nil) && self.isFormLogin == NO) {
[self completeUserInfo];
return;
}
if(self.isReload == NO){
[self initTabs:YES];
self.isInitReload = YES;
}
if (self.inviteCode.length <= 0) {
[self initQuickEnterRoom];
}
if (self.inviteCode) {
self.inviteCode = nil;
}
[self monentsUnReadCount];
}
- (void)getAuthorizationCodeInfoWithPhonefail{
[self completeUserInfo];
}
-(void)getAuthorizationCodeInfoWithPhoneSuccess:(BOOL)flag{
if(flag == NO){
XPLoginAuthCodeVC *vc = [[XPLoginAuthCodeVC alloc]init];
vc.delegate = self;
vc.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:vc animated:YES completion:nil];
return;
}
[self completeUserInfo];
}
#pragma mark - XPLoginAuthCodeVCDelegate
- (void)bindCodeSuccess{
[self completeUserInfo];
}
///缓存礼物特效
-(void)requestGiftList{
[self removeOldVersionCacheFromOldMethod];
@kWeakify(self);
AFNetworkReachabilityManager *networkManager = [AFNetworkReachabilityManager sharedManager];
[networkManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
@kStrongify(self);
if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
if(self.isFirstReachability == NO){
[Api requestCacheGiftDynamicEffectList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
if(code == 200){
self.isFirstReachability = YES;
NSArray *allResourceList = data.data;
NSSet *allResourceSet = [[NSSet alloc] initWithArray:allResourceList];
NSMutableArray *allResourceURLs = @[@"https://image.hfighting.com/fenjie2.mp4",
@"https://image.hfighting.com/treasure_fairy_ten.mp4",
@"https://image.hfighting.com/hecheng3.mp4",
@"https://image.hfighting.com/treasure_fairy_one.mp4"].mutableCopy;
for (NSString *url in allResourceSet) {
NSString *encodingUrl = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
[allResourceURLs addObject:encodingUrl];
}
[[UploadFile share] startBatchDownloadWithURLs:allResourceURLs];
}
}];
} else {
[[UploadFile share] resumeBatchDownload];
}
} else {
[[UploadFile share] pauseBatchDownload];
}
}];
[networkManager startMonitoring];
}
-(void)removeOldVersionCacheFromOldMethod{
//MARK: 删除旧数据缓存,预计 2 个版本后可以删除此方法
NSString *svgaFileName = @"/GiftSvga";
NSString *svgaFilePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:svgaFileName];
if ([[NSFileManager defaultManager] fileExistsAtPath:svgaFilePath]) {
BOOL isSuccess = [[NSFileManager defaultManager]removeItemAtPath:svgaFilePath error:nil];
if(isSuccess == YES){
NSLog(@"删除成功");
}
}
NSString *mp4FileName = @"/GiftMp4";
NSString *mp4FilePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:mp4FileName];
if ([[NSFileManager defaultManager] fileExistsAtPath:mp4FilePath]) {
BOOL isSuccess = [[NSFileManager defaultManager]removeItemAtPath:mp4FilePath error:nil];
if(isSuccess == YES){
NSLog(@"删除成功");
}
}
}
- (void)checkInviteUserInfoSuccess:(InviteUserInfoModel *)inviteInfo {
if (inviteInfo && inviteInfo.isInRoom) {
[XPRoomViewController openRoom:inviteInfo.roomUid fromNick:inviteInfo.inviteNick fromType:inviteInfo.fromType fromUid:inviteInfo.inviteUid viewController:self];
} else { //不在房间
[self.presenter getShortCutRecommendRoom];
}
}
- (void)getShortCutRecommendRoomSuccces:(NSString *)roomUid {
if (roomUid.length > 0) {
[XPRoomViewController openRoom:roomUid viewController:self];
}
}
#pragma mark - app 启动调用此接口 主要功能: 给主播分流
- (void)clientStartApp {
// [self.presenter clientStartApp];
}
#pragma mark - 网络状态监听
- (void)networkReachability{
// @kWeakify(self);
// [[AFNetworkReachabilityManager sharedManager] startMonitoring];
// [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// @kStrongify(self);
// switch (status) {
// case AFNetworkReachabilityStatusUnknown:
// self.isFirstReachability = YES;
// break;
// case AFNetworkReachabilityStatusNotReachable:
// self.isFirstReachability = YES;
// break;
// case AFNetworkReachabilityStatusReachableViaWWAN:
// case AFNetworkReachabilityStatusReachableViaWiFi:
// {
// if (self.isFirstReachability) {
// [[NSNotificationCenter defaultCenter] postNotificationName:kNetworkReachabilityKey object:nil userInfo:nil];
// [self.presenter autoLogin];
// [[ClientConfig shareConfig] clientInit];
// }
// self.isFirstReachability = YES;
// }
// break;
// default:
// break;
// }
// }];
}
#pragma mark - BaseMvpProtocol
- (void)tokenInvalid {
XPLoginViewController *lvc = [[XPLoginViewController alloc] init];
BaseNavigationController * nav = [[BaseNavigationController alloc] initWithRootViewController:lvc];
nav.modalPresentationStyle = UIModalPresentationFullScreen;
kWindow.rootViewController = nav;
XPAdImageTool.shareImageTool.isImLogin = NO;
}
- (void)completeUserInfo {
LoginFullInfoViewController * bindPhoneVC = [[LoginFullInfoViewController alloc] init];
BaseNavigationController * nav = [[BaseNavigationController alloc] initWithRootViewController:bindPhoneVC];
nav.modalPresentationStyle = UIModalPresentationFullScreen;
kWindow.rootViewController = nav;
}
///获取主播卡片信息成功
- (void)getAnchorCardInfoSuccess:(XPTabAnchorCardModel *)cardInfo {
if (!self.anchorCardView.superview && cardInfo && self.isViewLoaded && self.view.window) {
self.anchorCardView.frame = CGRectMake(0, -90-kStatusBarHeight, KScreenWidth, 90);
[UIView animateWithDuration:0.5 animations:^{
self.anchorCardView.frame = CGRectMake(0, kStatusBarHeight, KScreenWidth, 90);
} completion:nil];
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//默认震动效果
long time = (long)([[NSDate date] timeIntervalSince1970]*1000);
[[NSUserDefaults standardUserDefaults] setObject:@(time) forKey:kLastShowAnchorCardTime];
[[NSUserDefaults standardUserDefaults] synchronize];
self.anchorCardView.cardInfo = cardInfo;
[self.view addSubview:self.anchorCardView];
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleAnchorCardSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
[self.anchorCardView addGestureRecognizer:recognizer];
[StatisticsServiceHelper trackEventWithKey:StatisticsServiceEventPersonalshowTopCardShow];
}
}
///获取更新版本信息成功
- (void)getVersionUpdate:(XPVersionUpdateModel *)versionModel {
XPUpgradeView *view = [[XPUpgradeView alloc] init];
view.versionModel = versionModel;
TTPopupService * service = [[TTPopupService alloc] init];
service.contentView = view;
service.shouldDismissOnBackgroundTouch = NO;
[TTPopup popupWithConfig:service];
}
#pragma mark - NIMLoginManagerDelegate
- (void)onAutoLoginFailed:(NSError *)error {
// 如果非上次登录设备 autoLogin 会返回 417
if (error.code == 417) {
@weakify(self);
AccountModel* accountModel = [AccountInfoStorage instance].getCurrentAccountInfo;
[[NIMSDK sharedSDK].loginManager login:accountModel.uid token:accountModel.netEaseToken completion:^(NSError * _Nullable error) {
if (error) {
@strongify(self);
[self.presenter logout];
}
}];
return;
}
[self.presenter logout];
}
- (void)onKickout:(NIMLoginKickoutResult *)result {
[XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"TabbarViewController0")];
UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([rootViewController presentedViewController]) { //有一个被present出来的控制器 要先dismiss
[[rootViewController presentedViewController] dismissViewControllerAnimated:YES completion:^{
if ([[XCCurrentVCStackManager shareManager] getCurrentVC].navigationController.viewControllers.count > 1) {
[[[XCCurrentVCStackManager shareManager] getCurrentVC].navigationController popToRootViewControllerAnimated:YES];
}
if ([[UIApplication sharedApplication].delegate.window.rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tabVC = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;
if (tabVC.selectedViewController.navigationController) {
[tabVC.selectedViewController.navigationController popToRootViewControllerAnimated:YES];
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[tabVC setSelectedIndex:0];
});
}
}];
}else { //不是被present出来的 就有可能是rootvc或者是被push出来的 所以要判断nav是不是只有一个vc 如果有多个就pop
if ([[XCCurrentVCStackManager shareManager] getCurrentVC].navigationController.viewControllers.count > 1) {
[[[XCCurrentVCStackManager shareManager] getCurrentVC].navigationController popToRootViewControllerAnimated:YES];
}
if ([[UIApplication sharedApplication].delegate.window.rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tabVC = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;
if (tabVC.selectedViewController) {
if ([tabVC.selectedViewController isKindOfClass:[UINavigationController class]]) {
[tabVC.selectedViewController popToRootViewControllerAnimated:YES];
} else {
[tabVC.selectedViewController.navigationController popToRootViewControllerAnimated:YES];
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[tabVC setSelectedIndex:0];
});
}
}
}
if ([XPRoomMiniManager shareManager].getRoomInfo) {
[[RtcManager instance] exitRoom];
[[NIMSDK sharedSDK].chatroomManager exitChatroom:[NSString stringWithFormat:@"%ld", [XPRoomMiniManager shareManager].getRoomInfo.roomId] completion:nil];
[self.roomMineView hiddenRoomMiniView];
}
[self.presenter logout];
}
#pragma mark - NIMChatManagerDelegate
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages {
if ([AccountInfoStorage instance].getTicket.length == 0) {
return;
}
for (NIMMessage * message in messages) {
if (message.session.sessionType == NIMSessionTypeP2P) {
if(message.messageType == NIMMessageTypeCustom) {
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
AttachmentModel * attachment = (AttachmentModel *)obj.attachment;
if (attachment.first == CustomMessageType_FindNew && attachment.second == Custom_Message_Find_New_Greet_New_User) {
FindNewGreetMessageModel * greetInfo = [FindNewGreetMessageModel modelWithDictionary:attachment.data];
if (greetInfo.uid.integerValue != [AccountInfoStorage instance].getUid.integerValue) {
[TTPopup dismiss];
XPSessionFindNewAlertView * alertView = [[XPSessionFindNewAlertView alloc] init];
alertView.userInfo = greetInfo;
TTPopupService *service = [[TTPopupService alloc] init];
service.contentView = alertView;
service.shouldDismissOnBackgroundTouch = NO;
service.style = TTPopupStyleAlert;
[TTPopup popupWithConfig:service];
}
}
}
}
}
}
}
- (void)onReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage {
if ([AccountInfoStorage instance].getUid.length == 0) {
return;
}
if (broadcastMessage.content) {
NSDictionary *msgDictionary = [broadcastMessage.content toJSONObject];
AttachmentModel *attachment = [AttachmentModel modelWithJSON:msgDictionary[@"body"]];
NSString *partitionId = [NSString stringWithFormat:@"%@",attachment.data[@"partitionId"]];
if(![partitionId isEqualToString:self.userInfo.partitionId]){
return;
}
// MARK: 要复查这里的 if else 嵌套
if (attachment.first == CustomMessageType_RedPacket) {
[self receiveRedPacketDealWithData:attachment];
} else if (attachment.first == CustomMessageType_Gift && attachment.second == Custom_Message_Sub_Gift_ChannelNotify){///广播 年度飘屏
[self receiveBroadcastGift:attachment];
}else if(attachment.first == CustomMessageType_Version_Update && attachment.second == Custom_Message_Version_Update_Value){
NSString *osValue = attachment.data[@"updateOs"];
if([osValue isEqualToString:@"ios"] && [AccountInfoStorage instance].getUid.length > 0){
XPVersionUpdateModel *updateModel = [XPVersionUpdateModel modelWithDictionary:attachment.data];
[self getVersionUpdate:updateModel];
}
}else if(attachment.first == CustomMessageType_LuckyBag && attachment.second == Custom_Message_Sub_Room_Gift_LuckBag_FullScree){
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveLuckyGiftBigPrize:attachment];
}else if(attachment.first == CustomMessageType_Graffiti_Star_Kitchen && attachment.second == Custom_Message_Sub_Star_Kitchen_FullScreen){
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveRoomGraffitiStarKitchen:attachment];
}else if(attachment.first == CustomMessageType_Look_Love && attachment.second == Custom_Message_Sub_Look_Love_InRoom_NeedAllMicSend){
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveCandyTreeGiftHighLevle:attachment];
}else if (attachment.first == CustomMessageType_Treasure_Fairy && (attachment.second == Custom_Message_Sub_Treasure_Fairy_Draw_Gift_L4 || attachment.second == Custom_Message_Sub_Treasure_Fairy_Draw_Gift_L5 || attachment.second == Custom_Message_Sub_Treasure_Fairy_Convert_L1 || attachment.second == Custom_Message_Sub_Treasure_Fairy_Convert_L2 || attachment.second == Custom_Message_Sub_Treasure_Fairy_Convert_L3)) { //夺宝精灵
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveTreasureFairyGiftHighLevel:attachment];
}else if (attachment.first == CustomMessageType_Tarot && (attachment.second == Custom_Message_Sub_Tarot_Advanced || attachment.second == Custom_Message_Sub_Tarot_Intermediate)){
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveTarotBanner:attachment];
}else if(attachment.first == CustomMessageType_Common_H5 && (attachment.second == Custom_Message_Sub_Common_H5_Novice || attachment.second == Custom_Message_Sub_Common_H5_Advanced)){
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveCommonH5Banner:attachment];
}else if (attachment.first == CustomMessageType_Anchor_Hour_Rank && attachment.second == Custom_Message_Sub_Anchor_Hour_Rank) {///个播小时榜
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveAnchorHourRank:attachment];
} else if (attachment.first == CustomMessageType_Licnese_Hour_Rank && attachment.second == Custom_Message_Sub_Licnese_Hour_Rank) {///牌照房小时榜
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveAnchorHourRank:attachment];
}else if (attachment.first == CustomMessageType_Noble_VIP && attachment.second == Custom_Message_Sub_Room_Noble_LevelUp_Suspend) {///VIP升级全服飘屏
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveNobleLevelUp:attachment];
}else if (attachment.first == CustomMessageType_General_Floating_Screen && attachment.second == Custom_Message_Sub_General_Floating_Screen_All_Room){
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveRoomGeneralFloatingScreen:attachment];
}
}
}
///收到红包,处理数据
-(void)receiveRedPacketDealWithData:(AttachmentModel *)attachment{
if(attachment.second != Custom_Message_Sub_AllDiamandRedPacket)return;
XPRedPacketModel *data = [XPRedPacketModel modelWithDictionary:attachment.data];
data.validityType = 0;
data.kind = 1;
data.redEnvelopeId = attachment.data[@"redEnvelopeId"];
//判断是否在房间
__block BOOL isInRoom;
[[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController.viewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[XPRoomViewController class]]) {
*stop = YES;
isInRoom = YES;
}
}];
if (!isInRoom) {
UIViewController *currentVc = [[XCCurrentVCStackManager shareManager] getCurrentVC];
XPReceiveRedPacketView *view = [[XPReceiveRedPacketView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)];
view.inAllPacketRoom = NO;
view.receiveModel = data;
[currentVc.view addSubview:view];
[currentVc.view bringSubviewToFront:view];
}
}
///判断是否在房间
-(BOOL)isInRoomWithData{
//判断是否在房间
__block BOOL isInRoom;
[[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController.viewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[XPRoomViewController class]]) {
*stop = YES;
isInRoom = YES;
}
}];
return isInRoom;
}
/**
* 收到消息被撤回的通知
*
* @param notification 被撤回的消息信息
* @discusssion 云信在收到消息撤回后,会先从本地数据库中找到对应消息并进行删除,之后通知上层消息已删除
*/
- (void)onRecvRevokeMessageNotification:(NIMRevokeMessageNotification *)notification {
NIMMessage * message = notification.message;
if (message) {
NIMMessage * revokeMessage = [[NIMMessage alloc] init];
[revokeMessage setValue:message.session forKey:@"session"];
[revokeMessage setValue:@(NIMMessageTypeTip) forKey:@"messageType"];
revokeMessage.timestamp = [PLTimeUtil getNowTimeTimestampMillisecond].longLongValue;
revokeMessage.text = YMLocalizedString(@"TabbarViewController1");
[[NIMSDK sharedSDK].conversationManager saveMessage:revokeMessage forSession:message.session completion:nil];
}
}
- (void)configTheme {
self.view.backgroundColor = [DJDKMIMOMColor tabbarViewColor];
[[UITabBar appearance] setBackgroundImage:[UIImage imageWithColor:[DJDKMIMOMColor tabbarViewColor]
size:CGSizeMake(KScreenWidth, kTabBarHeight)]];
[[UITabBar appearance] setShadowImage:[[UIImage alloc]init]];
if (@available(iOS 10.0, *)) {
[[UITabBar appearance] setUnselectedItemTintColor:[DJDKMIMOMColor tabbarNormalColor]];
}
}
- (void)initTabs:(BOOL)isLogin {
self.viewControllers = nil;
NSArray *normalImageNames = @[@"tab_gameHome_normal",
@"tab_gameHome_game_normal",
@"tab_monents_normal",
@"tab_message_normal",
@"tab_mine_normal"];
NSArray *selectImageNames = @[@"tab_gameHome_selected",
@"tab_gameHome_game_selected",
@"tab_monents_select",
@"tab_message_selected",
@"tab_mine_selected"];
NSArray *tabLabels = @[YMLocalizedString(@"TabbarViewController2"),
YMLocalizedString(@"TabbarViewController6"),
YMLocalizedString(@"TabbarViewController3"),
YMLocalizedString(@"TabbarViewController4"),
YMLocalizedString(@"TabbarViewController5")];
// 创建视图控制器数组
NSMutableArray *viewControllers = [NSMutableArray arrayWithCapacity:normalImageNames.count];
for (NSInteger i = 0; i < normalImageNames.count; i++) {
UIViewController *viewController;
if (isLogin) {
switch (i) {
case 0:
// viewController = [[XPNewHomeViewController alloc] init];
viewController = [[XPHomePagingViewController alloc] init];
break;
case 1:
viewController = [[MSTabbarRoomGameVC alloc] init];
break;
case 2:
viewController = [[XPMomentsViewController alloc] init];
break;
case 3:
viewController = [[XPSessionMainViewController alloc] init];
break;
case 4:
viewController = [[XPMineViewController alloc] init];
break;
default:
viewController = [[XPBlankViewController alloc] init]; // 兜底
break;
}
} else {
viewController = [[XPBlankViewController alloc] init];
}
// 创建并设置标签栏项
[self createTabBarItem:viewController
title:tabLabels[i]
image:normalImageNames[i]
selectedImage:selectImageNames[i]];
[viewControllers addObject:viewController];
}
// 设置视图控制器数组和默认选择项
self.viewControllers = [viewControllers copy];
self.selectedIndex = 0;
}
- (BaseNavigationController *)createTabBarItem:(UIViewController *)itemVc
title:(NSString *)title
image:(NSString *)image
selectedImage:(NSString *)selectedImage {
itemVc.title = @"" ;
itemVc.tabBarItem.image = [[UIImage imageNamed:image] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
itemVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[itemVc.tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0x1F1B4F)}
forState:UIControlStateSelected];
[itemVc.tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0xB8B7C7)}
forState:UIControlStateNormal];
BaseNavigationController *nav = [[BaseNavigationController alloc] initWithRootViewController:itemVc];
return nav;
}
- (void)showSuccessToast:(NSString *)msg {
[XNDJTDDLoadingTool showSuccessWithMessage:msg];
}
- (void)showErrorToast:(NSString *)msg {
[XNDJTDDLoadingTool showErrorWithMessage:msg];
}
- (void)showLoading {
[XNDJTDDLoadingTool showLoading];
}
- (void)hideHUD {
[XNDJTDDLoadingTool hideHUD];
}
#pragma mark - 动态
- (void)monentsUnReadCount {
[Api monentsUnReadCount:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
if (code == 200) {
MonentsUnReadModel * model = [MonentsUnReadModel modelWithDictionary:data.data];
NSString *badge = model.total > 0 ? @(model.total).stringValue : nil;
if (model.total > 99) {
badge = @"99+";
}
NSUInteger index = 2;
UITabBarItem *item = self.tabBar.items.count > index ? self.tabBar.items[index] : nil;
[item setBadgeValue:badge];
}
} uid:[AccountInfoStorage instance].getUid];
NSArray *recentList = [[NIMSDK sharedSDK].conversationManager.allRecentSessions mutableCopy];
__block NSInteger unreadCount = 0;
NSMutableArray<NSString *> * uids = [[NSMutableArray alloc] init];
[recentList enumerateObjectsUsingBlock:^(NIMRecentSession * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[uids addObject:obj.session.sessionId];
unreadCount += obj.unreadCount;
}];
if(unreadCount > 0){
NSUInteger index = 3;
UITabBarItem *item = self.tabBar.items.count > index ? self.tabBar.items[index] : nil;
[item setBadgeValue:[NSString stringWithFormat:@"%ld",unreadCount]];
}
}
#pragma mark - 房间最小化
- (void)configRoomMiniNView:(NSDictionary *)dic {
UserInfoModel * userInfo = [UserInfoModel modelWithDictionary:dic[@"userInfo"]];
RoomInfoModel * roomInfo = [RoomInfoModel modelWithDictionary:dic[@"roomInfo"]];
NSMutableDictionary * microQueue = dic[@"microQueue"];
[self.roomMineView configRoomMiniView:roomInfo userInfo:userInfo micQueue:microQueue];
}
#pragma mark - 快捷进房
- (void)initQuickEnterRoom {
NSString * key = [NSString stringWithFormat:@"%@_%@", kUserFirstLoginKey, [AccountInfoStorage instance].getUid];
BOOL isNotFirstLogin = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!isNotFirstLogin) {
///新用户
// [self.presenter getNewUserGreetInfo];
}
}
///跳转优先级 闪屏→linkedMe→邀请码→新用户打招呼引导→渠道指定房间
- (void)completeUserInfoFinish:(NSString *)inviteCode {
self.inviteCode = inviteCode;
}
#pragma mark -NIMSystemNotificationManagerDelegate
- (void)onReceiveCustomSystemNotification:(NIMCustomSystemNotification *)notification {
if (notification.receiverType == NIMSessionTypeP2P) {
if (notification.content != nil) {
NSData *jsonData = [notification.content dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
if(err) {
NSLog(@"json解析失败%@",err);
return;
}
if ([dic[@"first"] integerValue] == CustomMessageType_First_VisitorRecord){//访客记录数量更新提示
AttachmentModel *attachment = [AttachmentModel modelWithJSON:notification.content];
XPMineVisitorUnReadModel *model = [XPMineVisitorUnReadModel modelWithJSON:attachment.data];
if ([model isKindOfClass:XPMineVisitorUnReadModel.class]) {
[[NSNotificationCenter defaultCenter] postNotificationName:kVisitorUnReadCountNotificationKey object:model];
}
} else if ([dic[@"first"] intValue] == CustomMessageType_Task_Complete && [dic[@"second"] intValue] == Custom_Message_Sub_TaskComplete) {///任务完成提醒
if ([dic isKindOfClass:[NSDictionary class]]) {
NSDictionary *dict = dic[@"data"];
[self handleActivityTaskTip:dict[@"taskCompleteMsg"] url:dic[@"taskUrl"]];
}
}
}
}
}
#pragma mark - 主播卡片弹窗
//新用户专享充值弹窗
- (void)showNewUserRecharge {
self.needShowNewUserRecharge = YES;
}
///展示主播卡片
- (void)showAnchorCardKey:(NSNotification *)noti {
NSDictionary * dic = noti.object;
self.delayShowAnchorCard = [[dic objectForKey:@"delayShow"] boolValue];
self.needShowAnchorCard = YES;
}
///判断第二次启动时弹出主播卡片
- (BOOL)hadLaunchApp {
return [[NSUserDefaults standardUserDefaults] valueForKey:kHadLaunchApp];
}
- (BOOL)canShowAnchorCard {
if ([[XPRoomMiniManager shareManager] getRoomInfo]) {//在房间时不弹
return NO;
}
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSNumber *lastTime = [defaults objectForKey:kLastShowAnchorCardTime];
if ([lastTime longValue] < 1) {
return NO;
}
NSDate *datenow = [NSDate date];//现在时间
long time2 = (long)([datenow timeIntervalSince1970]*1000);
long aTime = (time2 - [lastTime longValue]) / 1000;
if (aTime > 15*60) {
return YES;
} else {
return NO;
}
}
#pragma mark - 活动任务完成提示
- (void)handleActivityTaskTip:(NSString *)msg url:(NSString *)url {
if (!self.taskTipView.superview && url.length) {
[StatisticsServiceHelper trackEventWithKey:StatisticsServiceEventtask_toast_show];
[self.view addSubview:self.taskTipView];
self.taskTipView.desc = msg;
self.taskTipView.url = url;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(jumpToTask:)];
[self.taskTipView addGestureRecognizer:tap];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (self.taskTipView.superview) {
[self.taskTipView removeFromSuperview];
}
self.taskTipView = nil;
});
}
}
- (void)jumpToTask:(UITapGestureRecognizer *)ges {
[StatisticsServiceHelper trackEventWithKey:StatisticsServiceEventtask_toast_click];
XPWebViewController * webVC =[[XPWebViewController alloc] init];
webVC.url = self.taskTipView.url;
[self.selectedViewController.navigationController pushViewController:webVC animated:YES];
if (self.taskTipView.superview) {
[self.taskTipView removeFromSuperview];
}
self.taskTipView = nil;
}
#pragma mark - XPAnchorCardViewDelegate
- (void)xPAnchorCardViewEnterRoom:(NSString *)roomUid {
if (roomUid.length) {
[self.anchorCardView removeFromSuperview];
self.anchorCardView = nil;
self.needShowAnchorCard = NO;
[XPRoomViewController openRoom:roomUid viewController:self];
} else {
[UIView animateWithDuration:0.5 animations:^{
self.anchorCardView.frame = CGRectMake(0, -90-kStatusBarHeight, KScreenWidth, 90);
} completion:^(BOOL finished) {
[self.anchorCardView removeFromSuperview];
self.anchorCardView = nil;
self.needShowAnchorCard = NO;
}];
}
}
- (void)xPAnchorCardViewClickAvatar:(NSString *)uid {
if (uid.length) {
XPMineUserInfoViewController * userInfoVC = [[XPMineUserInfoViewController alloc] init];
userInfoVC.uid = uid.integerValue;
[self.selectedViewController.navigationController pushViewController:userInfoVC animated:YES];
}
[self.anchorCardView removeFromSuperview];
self.anchorCardView = nil;
self.needShowAnchorCard = NO;
}
- (void)handleAnchorCardSwipeFrom:(UISwipeGestureRecognizer *)recognizer{
if(recognizer.direction == UISwipeGestureRecognizerDirectionUp) {
[UIView animateWithDuration:0.5 animations:^{
self.anchorCardView.frame = CGRectMake(0, -90-kStatusBarHeight, KScreenWidth, 90);
} completion:^(BOOL finished) {
[self.anchorCardView removeFromSuperview];
self.anchorCardView = nil;
self.needShowAnchorCard = NO;
}];
}
}
#pragma mark - 年度礼物飘屏
- (void)receiveBroadcastGift:(AttachmentModel *)attachment {
GiftReceiveInfoModel *giftNotifyInfo = [GiftReceiveInfoModel modelWithJSON:attachment.data];
if (!giftNotifyInfo.ceremonyGift && giftNotifyInfo.isHomeShow == YES) {
if([XPSkillCardPlayerManager shareInstance].isInRoomVC == YES)return;
[self.roomAnimation receiveGift:giftNotifyInfo];
return;
}
if(giftNotifyInfo.isHomeShow == NO)return;
if (self.giftBroadcastQueue.count == 0) {
[self createGiftBroadcastViewAnimation:giftNotifyInfo];
}
[self.giftBroadcastQueue addObject:giftNotifyInfo];
}
- (void)createGiftBroadcastViewAnimation:(GiftReceiveInfoModel *)giftModel {
XPRoomYearActivityView * view = [[XPRoomYearActivityView alloc] init];
view.delegate = self;
view.frame = CGRectMake(KScreenWidth, 35 + statusbarHeight, KScreenWidth, 150);
view.model = giftModel;
[[XCCurrentVCStackManager shareManager].getCurrentVC.view addSubview:view];
[self beginGiftBraodcastViewAnimation:view notifyStaySecond:giftModel.notifyStaySecond];
}
- (void)beginGiftBraodcastViewAnimation:(XPRoomYearActivityView *)view notifyStaySecond:(int)notifyStaySecond{
CGFloat startTime = notifyStaySecond > 0 ? notifyStaySecond : 3.0;
POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];
springAnimation.springSpeed = 12;
springAnimation.springBounciness = 10.f;
springAnimation.fromValue = [NSValue valueWithCGPoint:view.center];
springAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(0 + view.frame.size.width / 2, view.center.y)];
[springAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
if (finished) {
[self removeGiftBroadcastOutAnimation:view stayTime:startTime];
}
}];
[view pop_addAnimation:springAnimation forKey:@"spingOutAnimation"];
}
- (void)removeGiftBroadcastOutAnimation:(XPRoomYearActivityView *)view stayTime:(CGFloat)stayTime{
POPBasicAnimation *moveAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];
moveAnimation.fromValue = [NSValue valueWithCGPoint:view.center];
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(-KScreenWidth/2, view.center.y)];
moveAnimation.beginTime = CACurrentMediaTime() + stayTime;
moveAnimation.duration = 0.5;
moveAnimation.repeatCount = 1;
moveAnimation.removedOnCompletion = YES;
@kWeakify(self);
[moveAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
@kStrongify(self);
if (finished) {
[view removeFromSuperview];
if (self.giftBroadcastQueue.count > 0) {
[self.giftBroadcastQueue removeObjectAtIndex:0];
}
if (self.giftBroadcastQueue.count > 0) {
[self createGiftBroadcastViewAnimation:self.giftBroadcastQueue.firstObject];
}
}
}];
[view pop_addAnimation:moveAnimation forKey:@"moveOutAnimation"];
}
#pragma mark - XPRoomGiftBroadcastViewDelegate
- (void)xPRoomYearActivityViewEnterRoom:(NSString *)roomUid{
if (roomUid.length > 0) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.7 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[XPRoomViewController openRoom:roomUid viewController:[XCCurrentVCStackManager shareManager].getCurrentVC];
});
}
}
#pragma mark - Getters And Setters
- (XPMiniRoomView *)roomMineView {
if (!_roomMineView) {
_roomMineView = [[XPMiniRoomView alloc] init];
_roomMineView.controller = self;
_roomMineView.hidden = YES;
}
return _roomMineView;
}
- (XPAnchorCardView *)anchorCardView {
if (!_anchorCardView) {
_anchorCardView = [[XPAnchorCardView alloc] init];
_anchorCardView.delegate = self;
}
return _anchorCardView;
}
- (XPTaskCompleteTipView *)taskTipView {
if (!_taskTipView) {
_taskTipView = [[XPTaskCompleteTipView alloc] initWithFrame:CGRectMake(0, KScreenHeight - kSafeAreaBottomHeight-60-20, KScreenWidth, 20)];
}
return _taskTipView;
}
- (NSMutableArray<GiftReceiveInfoModel *> *)giftBroadcastQueue {
if (!_giftBroadcastQueue) {
_giftBroadcastQueue = [NSMutableArray array];
}
return _giftBroadcastQueue;
}
- (PIFullScreenBannerAnimation *)roomAnimation{
if(!_roomAnimation){
_roomAnimation = [[PIFullScreenBannerAnimation alloc]init];
}
return _roomAnimation;
}
@end