quickblox - chatDidFail后,自动 chatroomDidLeave 为什么 [Quickblox ]?

  显示原文与译文双语对照的内容

每次在chatDidFail事件后尝试重新连接时,我们:

  1. 在聊天中登录
  2. 输入房间
  3. 自动被踢出房间( chatRoomDidLeave事件)
  4. 当我们尝试加入房间时,我们又被踢出了( chatRoomDidLeave )
  5. 它循环

为什么,哦为什么为什么Quickblox在我们试图重新连接一个chatDidFail事件后为什么要从任何房间?

我们所做的就是:


-(void)chatDidFailWithError:(int)code
{
 [[QBChat instance] loginWithUser:currentUser];
}


- (void)chatRoomDidLeave:(NSString *)roomName
{
 [[QBChat instance] createOrJoinRoomWithName:@"roomName" membersOnly:NO persistent:YES];
}

我们对这个没有什么想法。

时间: 作者:

我解决了这个问题。 看来Quickblox聊天实现不能在自己的应用程序背景下恢复,而且不会离开聊天室。

这可以通过 Having ChatManager ( 。你自己的单独类用于管理聊天连接) 来解决当前显示的房间( 自我。currentRoom ) 并自动离开房间,并在应用程序resigns活动时退出。 当应用程序进入前台时,你登录并重新连接房间。

将这些添加到singleton类 (id)init:


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleApplicationWillResignActiveNotification:) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleApplicationEnterForegroundNotification:) name:UIApplicationWillEnterForegroundNotification object:nil];

以及当前房间的属性实现:


@property (nonatomic, strong) QBChatRoom *currentRoom;

然后实现相应的处理程序( 你还可以在这里使状态计时器无效):


- (void)handleApplicationWillResignActiveNotification:(NSNotification *)notification
{
 lg(@"Application resigning active");
 if (self.currentRoom) {
 if (self.presenceTimer) {
 [self.presenceTimer invalidate];
 self.presenceTimer = nil;
 }
 [self leaveRoom:self.currentRoom clearRoom:NO];
 [[QBChat instance] logout];
 }
}

- (void)handleApplicationEnterForegroundNotification:(NSNotification *)notification
{
 lg(@"Application entering foreground.");
 if (![[QBChat instance] loginWithUser:self.currentUser]) {
 lg(@"Logging in failed for some reason.");
 }
}

然后在 chatDidLogin 中执行以下操作:


- (void)chatDidLogin
{
. . .

 if (self.currentRoom) {
 lg(@"Auto-joining current room.");
 [self joinRoom:self.currentRoom completionBlock:nil];
 }

. . .
}

进入房间时存储房间参照:


- (void)chatRoomDidEnter:(QBChatRoom *)room
{
. . . 
 self.currentRoom = room;
. . . 
}

请确保在离开房间时不清除 self.currentRoomUIApplicationWillResignActiveNotification ,这样当应用程序到达前台时,就可以对当前房间进行引用。

作者:
...