【问题标题】:How to handle MUC chat messages- messages duplicating如何处理 MUC 聊天消息 - 消息重复
【发布时间】:2014-12-28 03:58:04
【问题描述】:

我已经使用 XMPP 框架实现了一对一聊天它在一对一聊天中具有广泛的支持。消息归档和获取非常简单。但我知道,处理群聊消息的保存和显示非常困难。排序和谓词失败。显示重复的消息。

这是我在获取已保存的消息之前加入房间的方式)

XMPPRoomCoreDataStorage *coreDataRoomStorage=[self appDelegate].xmppRoomCoreDataStorage;
XMPPRoom *room=[[XMPPRoom alloc]initWithRoomStorage:coreDataRoomStorage jid:user.bareJid];
    [room activate:[self appDelegate].xmppStream];
    [room addDelegate:[self appDelegate] delegateQueue:dispatch_get_main_queue()];
    [room joinRoomUsingNickname:user.user_name history:nil];

我明白了,有几个多余的消息保存。一条消息保存 3-4 次。我可能做错了什么。一些身体请帮忙!这是我为在房间中传递消息所做的代码

- (NSFetchedResultsController *)fetchedResultsController{
if (fetchedResultsController == nil)
{
    NSManagedObjectContext *moc = [[self appDelegate] managedObjectContext_message];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject"
                                              inManagedObjectContext:moc];
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"bareJidStr=%@",_thisRoom.roomJID.bare];
    NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, nil];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setPredicate:predicate];
    [fetchRequest setFetchBatchSize:20];
    fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                   managedObjectContext:moc
                                                                     sectionNameKeyPath:nil
                                                                              cacheName:nil];
    [fetchedResultsController setDelegate:self];

    NSError *error = nil;
    if (![fetchedResultsController performFetch:&error])
    {
        DDLogError(@"Error performing fetch: %@", error);
    }   
}
return fetchedResultsController;}

【问题讨论】:

  • 为什么投反对票?这个问题是真实的,这个问题的答案将帮助任何使用 robbie hanson xmpp 框架进行群聊的人。在此框架中存在重复 3-4 次相同消息的问题。如果有人找到任何解决方法,那将节省
  • 别担心,哥们。开心点。现在你可以看到你的问题没有被否决。我对你的问题投了赞成票。只是因为我完全同意你的问题,这是真正的问题。

标签: ios xmpp ejabberd xmppframework multiuserchat


【解决方案1】:

我想我找到了消息重复问题的答案。 主要问题是我在房间里发送的信息在每个房间加入时都重复了。 我所做的是,当我发送消息时,我将 deviceID 作为 xmppmessage 的子元素。收到消息后,我检查子元素。如果设备 id 匹配,则它与我之前发送的消息相同,并且它已经在核心数据中,因此丢弃该消息。

- (void)sendMessageWithBody:(NSString *)messageBody
{
if ([messageBody length] == 0) return;

NSXMLElement *body = [NSXMLElement elementWithName:@"body" stringValue:messageBody];
XMPPMessage *message = [XMPPMessage message];
[message addChild:body];


//device id is used, so that the my message element will be unique 
NSString *uuidString=[UIDevice currentDevice].identifierForVendor.UUIDString;
NSXMLElement *myMsgLogic=[NSXMLElement elementWithName:@"myMsgLogic" stringValue:uuidString];
[message addChild:myMsgLogic];

[self sendMessage:message];
}

然后在 xmppstream 中接收消息。处理它 在XMPPRoomCoreDataStorage中,有一个方法叫

 - (void)handleIncomingMessage:(XMPPMessage *)message room:(XMPPRoom *)room

在此执行消息排序逻辑。不粘贴整个代码:

- (void)handleIncomingMessage:(XMPPMessage *)message room:(XMPPRoom *)room
{
  XMPPLogTrace();

XMPPJID *myRoomJID = room.myRoomJID;
XMPPJID *messageJID = [message from];


NSString *uuidString=[UIDevice currentDevice].identifierForVendor.UUIDString;

NSString *messageLogic= [[message elementsForName:@"myMsgLogic"].firstObject stringValue];

if ([uuidString isEqualToString:messageLogic]) {
    return;
}

 //rest code is already there in the method
 }

【讨论】:

  • 你好@alin,我想问一件事,我们如何在核心数据中保存群聊?我无法从核心数据中检索数据,就像我们可以为点对点聊天检索一样。
  • 苏希尔。 XMPP RoomMessageCoreDataStorageObject。这是房间消息的对象。为核心数据获取提供正确的参数(如房间 jids、流等)然后您将获得保存的房间消息。
  • 感谢@Alin 的回复,但是要检索,我们需要在appDelegate 中激活coreDataStorage。我们如何做到这一点?如何激活coreDataStorage?
  • @alinandrews 我尝试了你的解决方案,但仍然收到重复的消息,你能告诉我如何解决这个问题吗?我已经问了一个问题stackoverflow.com/questions/29538479/…
  • @alinandrews Xmpp 执行比普通 iOS 执行更快。我们可以说这是补丁,但问题是活动流。但是,嘿,逻辑很好。
【解决方案2】:

在搜索和尝试了很多之后,我得出了一个结论,即接收到组的重复消息。 XMPP 效果最好,但实际问题是:

[room activate:[self appDelegate].xmppStream];

当我们激活那个房间时,它实际上添加了一个监听器。所以只激活一次

【讨论】:

    【解决方案3】:

    另一种方法是创建NSPredicate

    检索您的回显消息(这意味着您已在房间内发送了一条消息,并且 XMPP 服务器已收到该消息并重新发送给该房间的所有(广播)居住者,并带有 nameRoom@ muc.server.com)

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (messageStr CONTAINS[cd] %@)", [NSString stringWithFormat:@"from=\"%@\"",[xmpp sharedInstance].xmppStream.myJID.bare]];
    

    如果您想显示您已发送的消息 (yourClientId@server.com),请将字符串 from 更改为 to

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (messageStr CONTAINS[cd] %@)", [NSString stringWithFormat:@"to=\"%@\"",[xmpp sharedInstance].xmppStream.myJID.bare]];
    

    所以,不需要修改框架。

    【讨论】:

    • 良好的道德。我试过这个。但是在非常快速的消息传递中,消息是重复的。而且 msgLogic 方法也可以在没有任何数据库操作的情况下完成。所以,我选择了这种方法。
    • @alinandrews 你得到解决方案了吗?我有同样的问题
    猜你喜欢
    • 2016-04-18
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2016-07-23
    • 2013-08-28
    • 2017-10-12
    相关资源
    最近更新 更多