iOS直播Liveroom组件,游客,用户多次切换登录同一直播间,消息出现多次重复问题解决
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];
}
上边这几句就是解决办法
总结一下:变态的流程,总会有变态的坑!
iOS直播Liveroom组件,游客,用户多次切换登录同一直播间,消息出现多次重复问题解决的更多相关文章
- iOS富文本组件的实现—DTCoreText源码解析 数据篇
本文转载 http://blog.cnbang.net/tech/2630/ DTCoreText是个开源的iOS富文本组件,它可以解析HTML与CSS最终用CoreText绘制出来,通常用于在一些需 ...
- ios/iphone手机请求微信用户头像错位BUG及解决方法
转:http://www.jslover.com/code/527.html ios/iphone手机请求微信用户头像错位BUG及解决方法 发布时间:2014-12-01 16:37:01 评论数:0 ...
- iOS开发--应用设置及用户默认设置——转载
[链接]iOS开发--应用设置及用户默认设置[1.bundlehttp://www.jianshu.com/p/6f2913f6b218 在iphone里面,应用都会在“设置”里面有个专属的应用设置, ...
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- [IOS NSUserDefaults]的使用:登陆后不再显示登录界面。
之前搜了好多地方都没找到实现“登陆后不再显示登录界面,而默认自动登录”的方法. 待我发现有种存储方式叫NSUserDefaults的时候,立马又感觉新技能get了. 简介: NSUserDefault ...
- 利用angular4和nodejs-express构建一个简单的网站(五)—用户的注册和登录-HttpClient
上一节简单介绍了一下利用angular构建的主路由模块,根据上一节的介绍,主页面加载时直接跳转到用户管理界面,下面就来介绍一下用户管理模块.启动应用后,初始界面应该是这样的: 用户管理模块(users ...
- .NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐) 快到2020年了 ...
- 解决服务器SID引起虚拟机不能加入AD域用户,无法远程登录的问题
最近在公司搭建AD域控制器,发现无法在计算机真正添加域用户,也就是添加的用户虽然可以在本地登录,但是无法远程登录,尝试多种方法都无法解决,而最终原因居然是虚拟机导致的服务器的SID冲突.本文记录下该问 ...
- 用户 'IIS APPPOOL\DefaultAppPool' 登录失败。
今天新建了一个ASP.NET(Language=C#)网站,配置好数据库后编写了几行代码测试数据库的是否能正常使用. 当运行程序时,第一个页面都没有打开就出现了错误(因为我首页就访问数据库,填充一些D ...
随机推荐
- 初学Python不知道做什么项目好?来看看练手项目如何?
对于初学者来说,在学习编程的初期,由于基础知识点的学习是比较无聊的,所以大家可能会有所反感,为了减弱大家的反感,我给大家带来一个简单的小项目——实现屏保计时器,这个项目就算是刚学Python的小伙伴, ...
- stm32基本定时器timer6的原理与使用
/********************基本定时器 TIM 参数定义,只限 TIM6.7************/ /* 一.定时器分类 STM32F1 系列中,除了互联型的产品,共有 8 个定时器 ...
- sql:where中多种状况简便写法
字段名:Bran,block,are ,store 四个字段中存在值等于0或者不等于0,两种情况.where中如果用if等条件判断会有16中组合,如果采用where中的条件就避免了这个情况. decl ...
- Less Css 教程
http://www.w3cplus.com/css/less,这个东西太吊了!
- Delphi字符串处理函数
1.Copy 功能说明:该函数用于从字符串中复制指定范围中的字符.该函数有3个参数.第一个参数是数据源(即被复制的字符串),第二个参数是从字符串某一处开始复制,第三个参数是要复制字符串的长度(即个数) ...
- Android 使用剪贴板传递简单数据及复杂数据的方法
传递数据的场景在于不同页面之间跳转,需要携带数据:简单数据值指的是String, int等数据, 复杂数据指的是类 1. 使用剪贴板传递简单数据方法: 第一个页面里面放数据操作如下: Clipbo ...
- Android ListView用法
写了一个简单的示例来说明ListView的用法:给定一个单词,下面有四个含义,找出正确的一个,无论是否成功,则会跳转到下一个单词:主要用到的知识有: findViewById(). ListView ...
- python深浅拷贝以及数据在内存中储存方法
要搞懂深浅拷贝,首先要明白数据在内存里的储存方法. 一个变量的储存,首先是变量名加上储存内容的ID,通过ID去找到变量名所对应的内容, 当我们对数据进行赋值时,其实是把内容的整体地址赋给别的变量名(相 ...
- 非旋Treap总结 : 快过Splay 好用过传统Treap
非旋$Treap$ 其高级名字叫$Fhq\ Treap$,既然叫$Treap$,它一定满足了$Treap$的性质(虽然可能来看这篇的人一定知道$Treap$,但我还是多说几句:$Fhp\ Treap$ ...
- pandas神坑:如果列有NAN,则默认给数据转换为float类型!给pandas列指定不同的数据类型。
今天碰到一个错误,一个字典取值报keyError, 一查看key, 字符串类型的数字后面多了小数点0, 变成了float的样子了. 发现了pandas一个坑:如果列有NAN,则默认给数据转换为floa ...