繁体   English   中英

Xmpp MultiUserChat(MUC)组不保持稳定

[英]Xmpp MultiUserChat (MUC) Group Does not remain stable

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

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

一旦应用程序启动或从后台发出,您需要向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];
    }

}

愿这对你有所帮助。

您必须加入以前的所有加入/连接组。 因为在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];

除了Presence答案,我还会检查更基本的东西 -

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

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

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

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

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

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

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

希望这也适合你

默认情况下,MUCRoom会向新加入的用户发送一些历史记录,该数字由config在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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM