iOS直播Liveroom组件,游客,用户多次切换登录同一直播间,消息出现多次重复问题解决
2024-08-25 04:30:15
byzqk
新版,加入连麦功能,直播的流程修改很多,每次登录都需要登录liveroom组件
期间遇到一个奇葩的问题,就是游客登录组件之后,切换为用户登录,出现im消息重复的问题,一开始以为是游客退出不成功,导致的问题,然后一直找这个问题,确定游客百分之百退出了。。。以为该好了,可是。。。。效果,依然是那种情况,并无卵用,然后,开始了痛苦的一步一步打断点流程。。
组件Liveroom是单例,每次登录都会初始化这个对象的内容
主要问题就在这个方法
- (void)login:(NSString*)serverDomain loginInfo:(LoginInfo *)loginInfo withCompletion:(ILoginCompletionHandler)completion {
[self asyncRun:^{
// 保存到本地
_serverDomain = serverDomain; [self login:loginInfo.sdkAppID accType:loginInfo.accType userID:loginInfo.userID userSig:loginInfo.userSig completion:^(int errCode, NSString *errMsg, NSString *userID, NSString *token) {
if (errCode == ROOM_SUCCESS) { completion(0, @"RoomService登录成功"); [self initApiAddr: loginInfo.userID token:token]; _appID = [NSString stringWithFormat:@"%d", loginInfo.sdkAppID]; // 初始化userInfo
_userInfo = [SelfAccountInfo new];
_userInfo.userID = loginInfo.userID;
_userInfo.userName = loginInfo.userName;
_userInfo.userAvatar = loginInfo.userAvatar;
_userInfo.sdkAppID = loginInfo.sdkAppID;
_userInfo.accType = loginInfo.accType;
_userInfo.userSig = loginInfo.userSig; // 初始化 RoomMsgMgr 并登录
RoomMsgMgrConfig *config = [[RoomMsgMgrConfig alloc] init];
config.userID = loginInfo.userID;
config.appID = loginInfo.sdkAppID;
config.accType = loginInfo.accType;
config.userSig = loginInfo.userSig;
config.userName = loginInfo.userName;
config.userAvatar = loginInfo.userAvatar;
config.level = loginInfo.level; //消息重复---注意多次登录组件,就会多次初始化下边这个对象,他是监测消息的,登录几次组件,就会有几个这样的对象,消息就会重复几次
//虽然游客退出了,但是这个对象不释放,他就会监听消息
if (_msgMgr) {
_msgMgr.delegate = nil;
[_msgMgr arcDebugRelease];
}
_msgMgr = [[RoomMsgMgr alloc] initWithConfig:config];
[_msgMgr setDelegate:self]; // [self sendDebugMsg:[NSString stringWithFormat:@"初始化IMSDK: appID[%d] userID[%@]", config.appID, config.userID]]; //IM已经在外头成功,这儿就不进行登录了 // __weak __typeof(self) weakSelf = self;
// [_msgMgr login:^(int errCode, NSString *errMsg) {
// [weakSelf asyncRun:^{
// [self sendDebugMsg:[NSString stringWithFormat:@"IM登录返回: errCode[%d] errMsg[%@]", errCode, errMsg]];
// if (errCode == 0 && completion) {
// completion(0, @"登录成功");
// } else if (errCode != 0 && completion) {
// completion(ROOM_ERR_IM_LOGIN, @"登录失败");
// }
// }];
// }];
}
else {
[self sendDebugMsg:[NSString stringWithFormat:@"初始化LiveRoom失败: errorCode[%d] errorMsg[%@]", errCode, errMsg]];
}
}];
}];
}
所有的信息都会被更新,然后对象会重新初始化,但是就是这个对象,坑的一笔
_msgMgr = [[RoomMsgMgr alloc] initWithConfig:config];
[_msgMgr setDelegate:self];
需要判断之前单例里边的该对象存在,需要将他释放掉,腾讯没有游客登录,所以不需要这样的变态逻辑
//消息重复---注意多次登录组件,就会多次初始化下边这个对象,他是监测消息的,登录几次组件,就会有几个这样的对象,消息就会重复几次
//虽然游客退出了,但是这个对象不释放,他就会监听消息
if (_msgMgr) {
_msgMgr.delegate = nil;
[_msgMgr arcDebugRelease];
}
上边这几句就是解决办法
总结一下:变态的流程,总会有变态的坑!
最新文章
- jquery 高度的获取
- 转-Android Studio *.jar 与 *.aar 的生成与*.aar导入项目方法
- Android的ADT内容助手快捷方式设置
- BITED数学建模七日谈之二:怎样阅读数学模型教材
- WSAEventSelect模型详解
- c#中const与readonly区别
- LittleTool之批量修改材质
- 把centos 网卡接口eth2改成eth0
- ANSI escape code
- C#经典系列-键值对
- 在linux中配置tomcat
- Linux下搭建 Cocos2d-x-2.1.4 编译环境
- Oracle 最简单的随系统自己主动启动
- Unity3D - Animator Controller循环依赖
- 我的 FPGA 学习历程(04)—— 练习 verilog 硬件描述语言
- python tkinter Text
- mysql学习一 常用语句
- 搭建SSH服务
- Mac terminal Javac
- Maven学习日记(二)---MAVEN创建多模块的项目