zoukankan      html  css  js  c++  java
  • 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];
                    }
    

     上边这几句就是解决办法

    总结一下:变态的流程,总会有变态的坑!

  • 相关阅读:
    Github 上 36 个最实用的 Vue 开源库
    C 语言快速入门,21 个小项目足矣!「不走弯路就是捷径」
    18个挑战项目带你快速入门深度学习
    Linux 运维入门到跑路书单推荐
    Python 网络爬虫的常用库汇总
    45 个常用Linux 命令,让你轻松玩转Linux!
    [新手必备]Python 基础入门必学知识点笔记
    快速入门 Python 数据分析实用指南
    18位不重复订单号
    相对路径转绝对路径
  • 原文地址:https://www.cnblogs.com/widgetbox/p/9771670.html
Copyright © 2011-2022 走看看