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];
                }

 上边这几句就是解决办法

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

 

posted @ 2018-10-11 11:58  WidgetBox  阅读(1313)  评论(0编辑  收藏  举报