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]; }
上边这几句就是解决办法
总结一下:变态的流程,总会有变态的坑!