无法在 xmpp 的聊天屏幕中获取接收消息

Posted

技术标签:

【中文标题】无法在 xmpp 的聊天屏幕中获取接收消息【英文标题】:Unable to get the receive messages in chat screen in xmpp 【发布时间】:2015-10-12 07:05:56 【问题描述】:

我正在制作一个基于聊天的应用程序,我可以发送消息,但无法在我的聊天屏幕中接收消息,所以任何人都可以帮助我 这是我的代码

if ([[message elementForName:@"body"] stringValue]==nil) 


else


    NSString *messageBody = [[message elementForName:@"body"] stringValue];
    XMPPUserCoreDataStorageObject *user = [xmppRosterStorage userForJID:[message from]
                                                             xmppStream:xmppStream
                                                   managedObjectContext:[self managedObjectContext_roster]];
    NSString *displayName = [user displayName];
    BOOL isComposing = NO;

    NSString *MyString;
    NSDate *now = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    // [dateFormatter setDateFormat:@"yyyy-MM-dd-HH-mm-ss"];
    [dateFormatter setDateFormat:@"HH:mm,yyyy/MM/dd"];
    MyString = [dateFormatter stringFromDate:now];
    NSLog(@"TIME AND DATE=>%@",MyString);

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    NSString *myJID=[NSString stringWithFormat:@"%@@xxxx-mac-mini-2.local",[defaults valueForKey:@"userNameJID"]];
    NSString *friendID=[[[message attributeForName:@"from"] stringValue] stringByDeletingLastPathComponent];
      NSLog(@"---chatToUserId=>%@",friendID);




     if ([message isChatMessageWithBody])

        XMPPUserCoreDataStorageObject *user = [xmppRosterStorage userForJID:[message from]
                                                                 xmppStream:xmppStream
                                                       managedObjectContext:[self managedObjectContext_roster]];

        NSString *body = [[message elementForName:@"body"] stringValue];
        NSString *displayName = [user displayName];
        NSString *msg = [[message elementForName:@"body"] stringValue];
        NSString *from = [[message attributeForName:@"from"] stringValue];

        //  [xmppMessageArchivingStorage archiveMessage:message outgoing:NO  xmppStream:xmppStream];



        NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
        [m setObject:msg forKey:@"msg"];
        [m setObject:from forKey:@"sender"];

在 xmpp 委托方法中是 didReceiveMessage 但我如何分配给聊天屏幕类。

【问题讨论】:

【参考方案1】:

你需要学习:

    XMPPMessageArchiving 是与 XMPPFramework 捆绑在一起的示例模块,它将所有传入和传出消息存储到 CoreData 支持的数据库中。 NSFetchedResultsController - Apple 提供的标准类,用于向 UITableViewUICollectionView 提供数据,您可以将其用作“聊天屏幕”类的核心,它会自动跟踪新消息并更新 UI。

示例iPhoneXMPP 项目有一个由 UITableView 和 NSFRC 支持的“名单屏幕”示例,“聊天屏幕”的唯一两个区别是:

    您需要获取XMPPMessageArchiving_Message_CoreDataObject 实体 您需要指定 NSPredicate 以仅获取与单个“聊天”相关的消息,例如 bareJid == %@ 并将好友的 JID 传递给此谓词

【讨论】:

感谢重播,我能够接收消息但未显示在 tableview 聊天屏幕中,并且我正在使用 sqlite 数据库存储我正在插入发送/接收消息。获取我正在使用 nspredicate NSPredicate *predicate = [NSPredicate predicateWithFormat:@"subscription=='both'"]; 您的代码试图重新发明 XMPPMessageArchiving 模块,尝试查看其代码并了解其工作原理

以上是关于无法在 xmpp 的聊天屏幕中获取接收消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 samck API、XMPP 接收聊天室消息

如何在 ios 中使用 XMPP 接收离线消息

XMPP 客户端接收服务器消息

XMPP 聊天发送/接收消息同步

如何在 xmpp 中获取用户的存在

用户无法在 Android Quickblox 聊天应用中接收离线消息