Xmpp MultiUserChat (MUC) 群组不能保持稳定

4
我创建了一个Xmpp聊天应用程序,其中我实现了一对一和群组聊天。聊天本身很好用。问题出在群聊上。我创建了一个有2-3个成员的群组,聊天也很正常,但是当我关闭并重新启动应用程序后,我无法从我创建的任何群组中获取群消息。只有当我连接到XMPP服务器并重新加入任何群组时,我才能收到消息。我的问题是每次我完全杀死应用程序后都必须重新加入群组。请告诉我如何在我从关闭状态打开应用程序时自动加入群组或获取消息。

你能帮我一下吗?我遇到了几乎相同的问题。但是在创建时,群组就已经被创建了。如果没有人在线,该群组将自动删除。我该如何使Swift中的房间持久化?在创建群组时,您发送了哪些配置? - PRADIP KUMAR
你解决了这个问题吗?我也遇到了同样的问题。现在,我计划获取所有组名并使用for循环重新加入这些组。这是完美的解决方案吗?@Tarun - Harin
5个回答

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

}

希望这可以帮到你。


我需要发送哪种存在状态?你能告诉我存在状态的XML吗? - Tarun Khosla
这意味着我只需要将带有群组ID的存在状态发送到XMPP,而不是创建房间并再次加入该房间,对吗? - Tarun Khosla
@TarunKhosla,实际上该方法在所有情况下都可以运行,如果您已经加入了该群组,则只需向该群组发送当前状态即可。因此,我更喜欢使用该方法。 - Jatin Patel - JP

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

0

除了Presence的答案之外,我还会检查更基本的事情 -

  1. 您创建的房间(群聊)是否是持久的? 还是每次连接时都必须重新创建房间? (注意“打开”和“创建”的区别)。
    在某些服务器上,默认情况下房间是临时的 - 您可以通过使用2个单独的客户端连接,发送一些消息,仅断开其中一个客户端并重新连接 - 如果您在重新连接的客户端中看到已发送的消息 - 这可能是您的问题,您能展示一下创建房间时传递给服务器的参数吗?。

  2. 您使用的服务器是否配置为默认发送历史消息,如果是,有多少条,同样,服务器实现可能会有所不同,您能分享一些关于您使用的服务器(openfire,ejabbered,prosody)的信息或您的配置文件中的片段吗?

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


0

我也遇到了这个问题已经有一个星期了,一直在寻找解决方案。在谷歌和Stack Overflow上进行了大量搜索后,我终于找到了一个线索来解决这个问题。

在我的情况下,群组已经成功创建,并且与成员的聊天功能良好,成员也可以向我发送聊天信息。但是当群组中的任何成员注销或关闭应用程序,然后再次登录时,他将无法在该群组中发送消息,而群组会回复只有占用者才能向会议发送消息

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

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

希望这对你也有用。

0

默认情况下,MUCRoom 会向新加入的用户发送一些历史记录,数量由配置文件决定,在 mod_muc: history_size: 下。 或者在发送 Presence 时需要显式地请求一定量的历史记录,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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接