1088 lines
46 KiB
Objective-C
1088 lines
46 KiB
Objective-C
//
|
||
// 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"
|
||
///Model
|
||
#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"
|
||
///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 "XPMineSimpleUserInfoViewController.h"
|
||
#import "XPMonentsRecommendViewController.h"
|
||
#import "XPMonentsViewController.h"
|
||
#import "XPReceiveRedPacketView.h"
|
||
#import "XPRoomYearActivityView.h"
|
||
#import "XPUpgradeView.h"
|
||
#import "XPMomentListViewController.h"
|
||
#import "XPHomeSloganViewController.h"
|
||
#import "XPSimpleMineViewController.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"
|
||
|
||
|
||
|
||
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>
|
||
{
|
||
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 = 3;
|
||
}
|
||
- (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];
|
||
///检查更新
|
||
if ([ClientConfig shareConfig].canOpen) {
|
||
[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 ([ClientConfig shareConfig].canOpen) {
|
||
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];
|
||
}
|
||
}
|
||
}
|
||
|
||
/// 获取用户信息后检查: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;
|
||
[AccountInfoStorage instance].name = self.userInfo.nick;
|
||
if ((userInfo.nick == nil || userInfo.avatar == nil) && self.isFormLogin == NO) {
|
||
[self completeUserInfo];
|
||
return;
|
||
}
|
||
if ([ClientConfig shareConfig].canOpen) {
|
||
if(self.isReload == NO){
|
||
[self initTabs:YES];
|
||
self.isInitReload = YES;
|
||
}
|
||
}else{
|
||
[self initTabs:YES];
|
||
}
|
||
|
||
if ([ClientConfig shareConfig].canOpen) {
|
||
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 ([ClientConfig shareConfig].canOpen) {
|
||
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 dealWithDefaultSvga];
|
||
///所有礼物接口,缓存礼物,保存时间,一天只请求一次
|
||
NSString *time = [NSDate getNowTimeTimestamp];
|
||
NSString *curTime = [NSDate timestampSwitchTime:[time integerValue] andFormatter:@"yyyy-MM-dd"];
|
||
NSDictionary *timeDic = [[NSUserDefaults standardUserDefaults]valueForKey:@"kRequestGiftList"];
|
||
if(timeDic == nil){
|
||
NSMutableDictionary *curDic = [[NSMutableDictionary alloc]initWithDictionary:timeDic];
|
||
[curDic setValue:@(YES) forKey:curTime];
|
||
[[NSUserDefaults standardUserDefaults]setValue:curDic forKey:@"kRequestGiftList"];
|
||
[[NSUserDefaults standardUserDefaults]synchronize];
|
||
}else{
|
||
if(timeDic[curTime]!= nil)return;
|
||
NSMutableDictionary *curDic = [[NSMutableDictionary alloc]initWithDictionary:timeDic];
|
||
[curDic removeAllObjects];
|
||
[curDic setValue:@(YES) forKey:curTime];
|
||
[[NSUserDefaults standardUserDefaults]setValue:curDic forKey:@"kRequestGiftList"];
|
||
[[NSUserDefaults standardUserDefaults]synchronize];
|
||
}
|
||
|
||
[Api requestCacheGiftList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||
if(code == 200){
|
||
NSArray *giftList = [GiftInfoModel modelsWithArray:data.data];
|
||
for (GiftInfoModel *giftModel in giftList) {
|
||
if(giftModel.vggUrl.length > 0){
|
||
[self dealWithGiftListWithUrl:giftModel.vggUrl fileName:giftModel.vggUrl isSvga:YES];
|
||
}else if(giftModel.viewUrl.length > 0){
|
||
[self dealWithGiftListWithUrl:giftModel.viewUrl fileName:giftModel.viewUrl isSvga:NO];
|
||
}
|
||
|
||
}
|
||
}
|
||
}];
|
||
|
||
|
||
|
||
}
|
||
|
||
-(void)dealWithDefaultSvga{
|
||
|
||
///夺宝精灵动效
|
||
NSArray *elfList = @[@"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"];
|
||
for (NSString *url in elfList) {
|
||
[self dealWithGiftListWithUrl:url fileName:url isSvga:NO];
|
||
}
|
||
}
|
||
-(void)dealWithGiftListWithUrl:(NSString *)url fileName:(NSString *)fileName isSvga:(BOOL)isSvga {
|
||
NSString *baseFileName = isSvga ? @"/GiftSvga":@"/GiftMp4";
|
||
NSString *filePaths = [[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:baseFileName] stringByAppendingPathComponent:fileName];
|
||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||
if ([[NSFileManager defaultManager] fileExistsAtPath:filePaths])return;
|
||
[[[NSURLSession sharedSession] downloadTaskWithURL:[NSURL URLWithString:url] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
||
if(!error){
|
||
[fileManager createDirectoryAtPath:[filePaths stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];
|
||
NSData *data = [NSData dataWithContentsOfURL:location];
|
||
[data writeToFile:filePaths atomically:YES];
|
||
}
|
||
}] resume];
|
||
|
||
}
|
||
|
||
- (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 (![ClientConfig shareConfig].canOpen || [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 (![ClientConfig shareConfig].canOpen || [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;
|
||
}
|
||
|
||
|
||
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)logined {
|
||
self.viewControllers = nil;
|
||
NSArray *normalImageNames = @[@"tab_gameHome_normal",@"tab_monents_normal",@"tab_message_normal", @"tab_mine_normal"];
|
||
NSArray *selectImageNames = @[@"tab_gameHome_selected",@"tab_monents_select",@"tab_message_selected", @"tab_mine_selected"];
|
||
NSArray *tabLabel = @[YMLocalizedString(@"TabbarViewController2"),YMLocalizedString(@"TabbarViewController3"),YMLocalizedString(@"TabbarViewController4"), YMLocalizedString(@"TabbarViewController5")];
|
||
|
||
UIViewController *game;
|
||
UIViewController *msg;
|
||
UIViewController *me;
|
||
UIViewController * home;
|
||
UIViewController * monents;
|
||
///取消检查ip定时器,释放XPNewHomeViewController
|
||
[[NSNotificationCenter defaultCenter]postNotificationName:@"kInLoginVC" object:nil];
|
||
if (logined) {
|
||
msg = [[XPSessionMainViewController alloc] init];
|
||
|
||
if ([ClientConfig shareConfig].canOpen) {
|
||
|
||
home = [[XPNewHomeViewController alloc] init];
|
||
monents = [[XPMonentsViewController alloc] init];
|
||
me = [[XPMineViewController alloc] init];
|
||
}else{
|
||
home = [[XPHomeSloganViewController alloc] init];
|
||
monents = [[XPMomentListViewController alloc] init];
|
||
me = [[XPSimpleMineViewController alloc] init];
|
||
}
|
||
} else {
|
||
game = [[XPBlankViewController alloc]init];
|
||
msg = [[XPSessionMainViewController alloc]init];
|
||
me = [[XPBlankViewController alloc]init];
|
||
home = [[XPBlankViewController alloc] init];
|
||
monents = [[XPBlankViewController alloc] init];
|
||
}
|
||
[self createTabBarItem:home title:tabLabel[0] image:normalImageNames[0] selectedImage:selectImageNames[0]];
|
||
[self createTabBarItem:monents title:tabLabel[1] image:normalImageNames[1] selectedImage:selectImageNames[1]];
|
||
[self createTabBarItem:msg title:tabLabel[2] image:normalImageNames[2] selectedImage:selectImageNames[2]];
|
||
[self createTabBarItem:me title:tabLabel[3] image:normalImageNames[3] selectedImage:selectImageNames[3]];
|
||
self.viewControllers = @[home,monents,msg,me];
|
||
self.selectedIndex = 0;
|
||
}
|
||
|
||
- (BaseNavigationController *)createTabBarItem:(UIViewController *)itemVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage{
|
||
itemVc.title = 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 = 1;
|
||
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 = 2;
|
||
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) {
|
||
|
||
if ([ClientConfig shareConfig].canOpen) {
|
||
XPMineUserInfoViewController * userInfoVC = [[XPMineUserInfoViewController alloc] init];
|
||
userInfoVC.uid = uid.integerValue;
|
||
[self.selectedViewController.navigationController pushViewController:userInfoVC animated:YES];
|
||
}else{
|
||
XPMineSimpleUserInfoViewController * userInfoVC = [[XPMineSimpleUserInfoViewController alloc] init];
|
||
userInfoVC.uid = uid.integerValue;
|
||
[self.selectedViewController.navigationController pushViewController:userInfoVC animated:YES];
|
||
}
|
||
[self.anchorCardView removeFromSuperview];
|
||
self.anchorCardView = nil;
|
||
self.needShowAnchorCard = NO;
|
||
} else {
|
||
[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
|