【问题标题】:Xmpp MultiUserChat (MUC) Group Does not remain stableXmpp MultiUserChat (MUC) Group 不保持稳定
【发布时间】:2015-08-02 21:43:26
【问题描述】:

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

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

【问题讨论】:

  • 你能帮帮我吗?我面临的几乎同样的问题。但是在创造本身的时候,群体正在创造。如果没有人在线,该组将被自动删除。我怎样才能让房间快速持久。您在创建群组时发送的配置是什么
  • 您对此有什么解决方案吗?我有同样的问题。现在,我打算获取所有组的名称并使用 for 循环重新加入这些组。它是完美的解决方案吗? @塔伦

标签: ios xmpp xmppframework


【解决方案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 吗?
  • 这意味着,我只需要将出席信息发送到带有组 ID 的 XMPP,而不是创建房间并再次加入该房间,对吗?
  • @TarunKhosla,实际上该方法在所有情况下都可以运行,如果您已经加入了该组,那么它只会向组发送礼物。所以我更喜欢使用这种方法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      在我的情况下,组创建成功并且与成员聊天正常,成员也可以向我发送聊天,但是当组中的任何成员注销或杀死应用程序然后再次登录时,他无法发送消息是这个组和组说作为回应只允许占用者向会议发送消息

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

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

      希望这对你也有用

      【讨论】:

        【解决方案5】:

        默认情况下,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>
        

        【讨论】:

          猜你喜欢
          • 2015-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-16
          • 2016-04-01
          • 1970-01-01
          • 2014-11-16
          • 1970-01-01
          相关资源
          最近更新 更多