XMPPFramework - 检索 Openfire 消息档案

2023-11-29

花了几个小时试图解决这个问题,但我被难住了!

试图获取我的 OpenFire 服务器上 2 个用户之间的聊天历史记录,我读到需要我的插件才能做到这一点。

因此,我在 OpenFire 服务器上安装了“Open Archive”插件并发送以下 XML(根据 XMPP-0136 协议文档):

<iq type="get" id="page1">
   <retrieve xmlns="urn:xmpp:archive" with="[email protected]" start="1469-07-21T02:56:15Z">
      <set xmlns="http://jabber.org/protocol/rsm">
         <max>100</max>
      </set>
   </retrieve>
</iq>

在代码中,这是通过以下方式实现的:

NSXMLElement *iQ = [NSXMLElement elementWithName:@"iq"];
[iQ addAttributeWithName:@"type" stringValue:@"get"];
[iQ addAttributeWithName:@"id" stringValue:@"page1"];

NSXMLElement *retrieve = [NSXMLElement elementWithName:@"retrieve"];
[retrieve addAttributeWithName:@"xmlns" stringValue:@"urn:xmpp:archive"];
[retrieve addAttributeWithName:@"with" stringValue:@"[email protected]"];
[retrieve addAttributeWithName:@"start" stringValue:@"1469-07-21T02:56:15Z"];

NSXMLElement *set = [NSXMLElement elementWithName:@"set"];
[set addAttributeWithName:@"xmlns" stringValue:@"http://jabber.org/protocol/rsm"];
NSXMLElement *max = [NSXMLElement elementWithName:@"max"];
max.stringValue = @"100";
[set addChild:max];

[retrieve addChild:set];
[iQ addChild:retrieve];

[[[self appDelegate] xmppStream] sendElement:iQ];

返回以下错误:

<iq xmlns="jabber:client" type="error" id="page1" to="[email protected]">
   <error code="404" type="cancel">
      <item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
   </error>
</iq>

我的 Xcode 项目可以成功地向我尝试接收聊天历史记录的用户发送/接收消息,所以我真的不知道我做错了什么。此外,该插件使我能够搜索聊天消息(通过 OpenFire 管理)并获得成功的结果,因此它似乎正在工作并存储消息。

任何帮助,将不胜感激。谢谢!


如果您正在寻找聊天历史记录,我认为您必须将消息保存到核心数据并从那里检索它们。要使用 XMPPFramework 内置功能保存数据,您必须使用以下代码:

XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage   sharedInstance];
NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];

xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage];
[xmppMessageArchivingModule activate:xmppStream];
[xmppMessageArchivingModule  addDelegate:self delegateQueue:dispatch_get_main_queue()];

现在您必须通过以下方式从核心数据中检索该消息:

-(void)loadarchivemsg
{  
    XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
    NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject"
                                                      inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc]init];

    NSString *predicateFrmt = @"bareJidStr like %@ ";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFrmt, chatWithUser];
    request.predicate = predicate;
    NSLog(@"%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"kXMPPmyJID"]);
    [request setEntity:entityDescription];
    NSError *error;
    NSArray *messages_arc = [moc executeFetchRequest:request error:&error];

    [self print:[[NSMutableArray alloc]initWithArray:messages_arc]];
}

-(void)print:(NSMutableArray*)messages_arc{
    @autoreleasepool {
        for (XMPPMessageArchiving_Message_CoreDataObject *message in messages_arc) {
            NSXMLElement *element = [[NSXMLElement alloc] initWithXMLString:message.messageStr error:nil];
            NSLog(@"to param is %@",[element attributeStringValueForName:@"to"]);

            NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
            [m setObject:message.body forKey:@"msg"];

            if ([[element attributeStringValueForName:@"to"] isEqualToString:chatWithUser]) {               
                [m setObject:@"you" forKey:@"sender"];
            }
            else {
                [m setObject:chatWithUser forKey:@"sender"];
            }

            [messages addObject:m];

            NSLog(@"bareJid param is %@",message.bareJid);
            NSLog(@"bareJidStr param is %@",message.bareJidStr);
            NSLog(@"body param is %@",message.body);
            NSLog(@"timestamp param is %@",message.timestamp);
            NSLog(@"outgoing param is %d",[message.outgoing intValue]);
            NSLog(@"***************************************************");
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XMPPFramework - 检索 Openfire 消息档案 的相关文章

  • 修改 SCNParticleEventBlock 中的 SCNParticleSystem 颜色不起作用

    鉴于提供的示例代码handle forProperties handler https developer apple com documentation scenekit scnparticlesystem 1523251 handle
  • 在 iOS 中发送音频文件和 JSON 字符串

    我正在尝试将音频文件和 JSON 字符串发送到 PHP 服务器 使用以下代码将发送 JSON 但文件到达时为空 如果我将 JSON 块放在音频块下方 文件将完全到达 但 JSON 为空 有什么想法吗 void sendFile NSStri
  • 在 Swift 中有条件导入基于 iOS 版本的框架(如 Speech)?

    有没有办法有条件地导入框架Swift基于运行时 iOS 版本 特别是 我有一个部署目标为的应用程序iOS 8 我想使用新的Apple Speech应用程序中的框架 如果在运行时可用 我知道 available iOS 10 代码部分的指令
  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • UIWebView:在 Safari 中打开一些链接,一些在视图中打开

    我的应用程序具有在 UIWebView 中呈现的内容 出于文本格式原因 内容中有一些链接 其中一些链接应在移动 Safari 中打开其目标 而其他链接则应在内容中导航 到目前为止 我已经使用 UIWebView 委托捕获了链接请求 在我的实
  • 如何使用 (a)smack 在 Android 上保持 XMPP 连接稳定?

    我使用适用于 Android 的 asmack android 7 beem 库 我有一个后台服务正在运行 例如我的应用程序保持活动状态 但 XMPP 连接迟早会在没有任何通知的情况下消失 服务器表示客户端仍然在线 但没有发送或接收数据包
  • iOS9 Sprite 套件问题

    一切都很顺利 直到我升级到 xCode 7 和 iOS 9 我当前的项目是一个 2D 平台游戏 自从升级以来 我就陷入了我们许多人似乎都面临的精灵套件错误 错误的困扰 我的问题是 每次游戏在模拟器或设备上运行时 所有精灵的 zPositio
  • 如何在 Alamofire 中使用“responseDecodable”方法?

    I have been trying to use responseDecodable method from Alamofire but I m getting Generic parameter T could not be infer
  • 如何在 iOS 中创建多行表格单元格?

    如何让第二个单元格扩展以适合文本而不是缩放文本 iOS 中有内置的方法可以做到这一点 还是我必须想出一些自制的解决方案 如果您查看 iOS 联系人应用程序 会发现有一个类似地址的框 但我找不到如何实现这一点 对于任何希望将来实现这一目标的人
  • Objective c RSA 与 OAEP 填充 sha256 之前的 ios 10

    我正在研究一种在iPhone中使用RSA加密方法的加密方法 到目前为止我可以用这种方法实现获取加密字符串 该字符串被服务器成功解密 SecKeyRef keyRef self addPublicKey pubKey SecKeyAlgori
  • Objective-C 属性和内存管理

    给出以下属性定义 property nonatomic retain MyObject foo 以下代码是否会导致内存泄漏 self foo MyObject alloc init 看起来 alloc 调用将对象上的保留计数增加到 1 然后
  • 使用 HTTP NSURL 创建 AVAsset

    我正在尝试合并两个NSURLs包含视频参考 其中一个 URL 指向 AWS 上的视频 另一个 URL 指向本地存储的视频 我的导出代码有效 因为我已经尝试使用两个本地视频 但每当我尝试合并 HTTP url 和本地 url 时 我都会收到此
  • ios GPUImage,小尺寸图像处理效果不好?

    我正在尝试为 OCR 准备图像 我使用 GPUImage 来完成 代码工作正常 直到我裁剪图像 裁剪后我得到了糟糕的结果 作物面积 https www dropbox com s e3mlp25sl6m55yk IMG 0709 PNG h
  • 如何获得 UICollectionView 的矩形

    我想在 UICollectionView 中找到节标题的框架 我对 UITableView 也有类似的情况 为此 我能够通过执行以下操作来获得其正确性 CGRect rect self tableView rectForHeaderInSe
  • AST 文件格式错误或损坏

    我有一个问题 我不知道为什么会发生这种情况 但很可能是因为我错误地按了 移动到垃圾箱 到某些系统框架 我收到一条错误消息 AST 文件格式错误或损坏 找不到 AST 文件引用的文件 Users username myProject Quar
  • XOR或其他简单的文件混淆方法ios目标c

    我正在开发一个使用受版权保护的 pdf 文件的 ios 应用程序 我正在寻找一些简单的方法来混淆文件以确保安全 这些方法不需要我经历额外的大众市场 CCATS 加密审查流程 但也将确保版权所有者已尽我所能来保证他们的数据安全 当然 我用密码
  • Swift 字典映射 - 闭包中的 init

    我有 Swift 字典 private var params String AnyObject 这包含查询项目 例如 lat 40 lon 100 我想将这本词典映射到NSURLQueryItem大批 我想让它 迅速 params map
  • 如何动态添加XCTestCase

    我正在为一个白标签项目编写 UI 测试 其中每个应用程序都有一组不同的菜单项 测试点击每个菜单项并截取屏幕截图 使用快车道快照 https docs fastlane tools actions snapshot 目前这一切都发生在一个内部
  • iOS 版 Google 地图 sdk 中折线的轮廓

    我的要求是在地图上显示一条绿色折线 但当地图切换到卫星视图时 绿色折线变得不清楚 我无法改变折线的颜色 因此 为了将折线与背景 地图的卫星视图 区分开来 我需要为折线绘制白色轮廓 我浏览了 GMSPolyline 类的文档 但找不到任何可以
  • 如何在 Swift 中将所有 iOS 设备的标签水平居中

    我不知道如何使标签在图像视图中水平居中 标签说 You ve been here What would you rate us 我想要What would you rate us属于 You ve been here 我试图完成此操作的方法

随机推荐

  • java、反射、内部类、

    您好 我想使用反射获取内部类的对象 但我在其中遇到了一些错误 代码是 package reflaction public class MyReflection public static void main String args thro
  • 遍历 jquery 中的嵌套表单元素

    很抱歉 如果这已经发布了 我一直在寻找无济于事 我只是想知道如何在 jquery 中循环嵌套表单 元素 元素不仅是像输入标签这样的严格表单元素 而且还有其他 html 元素 目前我有这段代码可以做到这一点 arguments i formi
  • Haskell 声明中的感叹号是什么意思?

    当我尝试使用真实的项目来驱动 Haskell 时 我遇到了以下定义 我不明白每个参数前面的感叹号是什么意思 我的书上似乎没有提到它 data MidiMessage MidiMessage Int MidiMessage 这是一个严格的声明
  • 检测 AJAX 何时更改 Web 浏览器中 DIV 中的 HTML

    通过 Web 浏览器加载页面并单击触发 AJAX 脚本的链接后 我需要检测 AJAX java 脚本何时完成将 HTML 更改加载到 div 中 由于运行 AJAX 脚本时不会触发 DocumentCompleted 事件 因此我不知道它何
  • 如何解码这段 PHP 代码?

    我想解码这段代码 我不知道它是什么 只知道它是某种代码 有人能帮助我吗
  • 如何在 EditText 上默认使用数字键盘而不强制输入数字? [复制]

    这个问题在这里已经有答案了 这个问题已经在网上其他地方询问过了 没有结果 Android 有没有办法在聚焦时显示数字软键盘EditText 但仍然允许输入任何文本 我想让用户输入数量 例如 1 kg 2 L 所以只需设置inputType
  • Oracle数据库搜索所有表中的字符串,返回行数据[重复]

    这个问题在这里已经有答案了 我需要在 Oracle 数据库中的所有表中搜索特定字符串 并返回找到该字符串的所有记录 我正在使用 SQL Developer 网上发布了几个非常有用的脚本和存储过程 它们提供了一种搜索整个数据库的方法 并且它们
  • 我可以按任意顺序将中间件应用到应用程序吗?

    在 C ASP NET 中 中间件应用程序的顺序重要吗 以下2个代码片段 public class Startup public void Configure IApplicationBuilder app IHostingEnvironm
  • 删除浏览器默认样式

    有没有办法或者声明如XHTML or HTML4这会删除元素上的默认 CSS 样式吗 Doctype 不用于样式化 有两种重要的方法可以删除所有样式并统一默认外观 标准化 csshttps necolas github io normali
  • C++ 中整数向量的序列化/反序列化

    待完成任务 我正在尝试将整数向量序列化为字符串 以便可以将其存储到文件中 使用的方法是将整数逐字节复制到缓冲区中 为此 我使用了 std copy n 函数 为了反序列化 我反向做了同样的事情 即从缓冲区逐字节复制到整数中 并将这些整数附加
  • C# 中的 PInvoke DLL

    我想将一个结构传递给 C 函数 并编写以下代码 当我运行它时 第一个函数 Foo1正在工作 然后起作用Foo出现异常 你能帮我理解问题是什么吗 C代码 typedef struct int Size char Array TTest dec
  • 使用 for 循环在数据框中创建新列来计算 R 中的值?

    我有两个数据框 df1 和 df2 group c Group 1 Group 2 Group3 Group 1 Group 2 Group3 year c 2000 2000 2000 2015 2015 2015 items c 12
  • 在 JavaScript 中对自定义对象数组进行排序

    假设我有一个 Employee 对象数组 var Employee function fname age this fname fname this age age var employees new Employee Jack 32 ne
  • 您认为什么更具可读性:?? (运算符)或使用 if

    我有一个方法会收到string 但在我可以使用它之前 我必须将其转换为int 有时可以是null我必须将其值更改为 0 今天我有 public void doSomeWork string value int SomeValue int P
  • AVAudioPlayer - 帧率下降

    我有一个简单的问题 我正在将 mp3 文件加载到 NSData 对象中 然后在游戏中使用 AVAudioPlayer 来播放它 大约每隔一秒 帧速率就会下降 您可以看到屏幕上出现卡顿现象 这并不是一个重大的减速 但明显明显并且对游戏玩法造成
  • 如何对此 Javascript/JSON 树进行递归搜索?

    我正在写一些 JavaScript 代码 我有一个如下所示的 JSON 对象 为了可读性修改了间距 var myNodes id 4 children id 1 children id 3 children id 2 chil
  • 如何在Python 2.5中模拟ZipFile.open?

    我想将文件从 zip 中提取到特定路径 忽略存档中的文件路径 这在 Python 2 6 中非常简单 我的文档字符串比代码长 import shutil import zipfile def extract from zip name de
  • 为什么我会在网页正文中看到“标题”(不仅在标题栏中)?

    当我运行此代码时 我在浏览器的标题栏和正文中也看到 我的页面 为什么我会得到这个 Because and
  • Unix 连接两个文件的多个字段[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我有两个文件 猫测试1 txt 1 2 3 4 2 3
  • XMPPFramework - 检索 Openfire 消息档案

    花了几个小时试图解决这个问题 但我被难住了 试图获取我的 OpenFire 服务器上 2 个用户之间的聊天历史记录 我读到需要我的插件才能做到这一点 因此 我在 OpenFire 服务器上安装了 Open Archive 插件并发送以下 X