Xmpp MultiUserChat(MUC)组不保持稳定

时间:2015-05-21 09:42:09

标签: ios xmpp xmppframework

我创建了一个Xmpp聊天应用程序,我已经实现了一对一和群聊。 聊天本身工作正常。 问题出在群聊中。我创建了一个包含2-3个成员的组,再次聊天工作正常,但是当我杀死应用程序并重新启动它时,我没有从我创建的任何组中获取组的消息。 当我连接到XMPP服务器并重新加入任何组时,我收到消息。 我的问题是,每次完全杀死应用程序后,我都必须再次加入群组。

请告诉我当我从被杀死状态打开应用程序时,如何获取消息或自动加入群组。

5 个答案:

答案 0 :(得分:1)

一旦您的应用程序启动或从后台发出,您需要向XMPP服务器发送状态。因此XMPP服务器了解相应的group已准备好处理事件。

修改:您可以使用以下代码发送在线状态。

- (void)goOnline {


    NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
    NSXMLElement *show = [NSXMLElement elementWithName:@"show"
                                           stringValue:@"dnd"];
    NSXMLElement *status = [NSXMLElement elementWithName:@"status" stringValue:@"available"];
    NSXMLElement *priority = [NSXMLElement elementWithName:@"priority" stringValue:@"24"];

    [presence addChild:show];
    [presence addChild:status];
    [presence addChild:priority];

    [_xmppStream sendElement:presence];

    [self createOrJoinRoom];

}
- (void)createOrJoinRoom {
    if ([appDelegate.xmppStream isConnected]) {

        NSString *myJID = [[NSUserDefaults standardUserDefaults] stringForKey:@"XMPPUserId"];

        NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
        [presence addAttributeWithName:@"from" stringValue:[[appDelegate.xmppStream myJID]full]];
        [presence addAttributeWithName:@"to" stringValue:[NSString stringWithFormat:@"%@@%@/%@", @"newone", GroupChatRoomName,myJID]];
        NSXMLElement *xelement = [NSXMLElement elementWithName:@"x" xmlns:XMPPMUCNamespace];
        [presence addChild:xelement];
        [appDelegate.xmppStream sendElement:presence];
    }

}

愿这对你有所帮助。

答案 1 :(得分:1)

您必须加入以前的所有加入/关联群组。因为在iOS中如果你杀了你的应用程序,那么你就离开了你创建或加入的组。

所以每次都在代码的这一部分

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

你必须再次加入你的小组。

下面是它的演示代码:

XMPPRoomHybridStorage *xmppRoomStorage1 = [XMPPRoomHybridStorage sharedInstance];
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:xmppRoomStorage1 jid:RoomName];
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
[xmppRoom activate:appDelegate.Obj_xmppManager.xmppStream];
NSXMLElement *history = [NSXMLElement elementWithName:@"history"];
[history addAttributeWithName:@"maxstanzas" stringValue:@"1"];
[xmppRoom joinRoomUsingNickname:self.xmppStream.myJID.user history:nil];

答案 2 :(得分:0)

添加到状态回答,我还会检查更基本的东西 -

  1. 您创建的房间(群聊)是否持续存在? 或者你每次连接时都要再次创建房间吗? (注意'开放'和'创造'之间的区别。) 在某些服务器上,默认情况下房间临时 - 您可以通过连接2个单独的客户端,发送一些消息,仅断开其中一个,然后重新连接来检查 - 如果您确实看到已发送的消息在重新连接的客户端中 - 这可能是您的问题,您可以在创建房间时显示传递给服务器的参数吗?

  2. 您使用的服务器是否配置为默认发送历史消息,如果是这样,服务器实现的数量可能会有所不同,您是否可以在正在使用的服务器上共享一些信息(openfire,ejabbered,韵律) )?或者来自配置文件的片段?

  3. 您是否有可能收到消息,但没有正确显示消息,可能在首次进入房间时没有刷新屏幕\视图?任何日志消息?

答案 3 :(得分:0)

我也面临这个问题,因为一周后寻找解决方案,经过大量搜索谷歌和堆栈溢出后,我得到了解决这个问题的线索。

在我的案例组成功创建并且聊天工作正常,会员和会员也可以发送给我聊天但是当群组的任何成员退出或杀死应用程序然后再次登录他无法发送消息时此群组和群组说作为回应只允许占用者向会议发送消息

在我的情况下,当用户点击群组进入群组并开始聊天时,我会调用此方法加入群组。

NSString *roomJID = [NSString stringWithFormat:@"%@@conference.yourHostName", roomJid];
XMPPJID *jid = [XMPPJID jidWithString:roomJID];

_xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:xmppRoomCoreDataStorage jid:jid dispatchQueue:dispatch_get_main_queue()];
[_xmppRoom activate:stream];
[_xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
[_xmppRoom joinRoomUsingNickname:stream.myJID.bare history:nil];

希望这对你也有用

答案 4 :(得分:0)

默认情况下,MUCRoom会向新加入的用户发送一些历史记录,该号码由mod_muc: history_size:下的配置决定。 或者您需要在发送状态doc时明确请求一些历史记录:

<presence
    from='hag66@shakespeare.lit/pda'
    id='n13mt3l'
    to='coven@chat.shakespeare.lit/thirdwitch'>
  <x xmlns='http://jabber.org/protocol/muc'>
    <history maxstanzas='20'/>
  </x>
</presence>