在发送大尺寸图像,video和audio时断开XMPP客户端

我已经使用robbiehanson xmpp例子实现了xmpp。 我可以聊天,也能够发送图像。 我发送的图像被转换为​​nsdata,并进一步转换为Base64String,然后发送string

[self.xmppStream sendElement:message];

这样,如果图像的大小很小,我可以立即发送,但如果图像的大小更大的两个xmpp用户断开连接,文件不传输。 video和audio也会发生同样的情况。 虽然我能够使用压缩图像

 UIImageJPEGRepresentation(image,0.005); 

但如何发送video和audio的大小显然是很大的。 我已经阅读了XEP – 0065和XEP – 0096的文档,但无法以适当的方式实现。 请让我知道为什么用户断开连接,为什么我不能使用base64传输繁重的文件,也分享了可以帮助我传输video和audio的代码。

真的很感激你的帮助。

虽然XMPP允许传输less量的二进制数据,但build议在“带外”共享大文件或video/audiostream,并使用XMPP作为信号传输协议 – 只需发送http://或rtp://链接,和你的好友的客户端将下载它,或从给定的stream开始播放audio/video。 您可以以任何forms发送该链接,但是有一些“标准草案”XMPP扩展,它允许与现有客户端兼容:

  1. XEP-0066:带外数据 – 简单扩展,您只需将URL附加到标准<message />元素即可。
  2. XEP-0095:Stream Initiation和XEP-0166:Jingle – 这些是“meta”规范,描述客户如何“协商”他们支持的function,select哪种方式共享他们喜欢的数据( ibb , oob , bytestreams , jingle rtp ,等等),find打开的TCP端口或中介代理,NAT遍历等。

所以,如果你只是想共享文件 – 通过任何现有的文件共享服务共享,并发送第一个XEP中所述的URL。 如果你想build立大型服务或VOIP应用程序 – 使用SI或Jingle。 但是没有人阻止你创build自己的XMPP扩展,这可能更容易实现。 这是一个自定义的XMPP扩展,不是由XMPP社区开发的,而是由XSF作为实验接受的,你也可以查看它。

即使我不直接发送图像到XMPP,因为它需要很多时间。

在我的项目我的消息可以是string,它可以是图像,我发现只有一个方法发送消息即。

 [xmppRoom sendMessageWithBody:@"Your msg"]; 

所以为了发送图像首先,我将其转换为base64,然后将其上传到我的服务器,并从服务器获取该图像的URL。 一旦我们得到的URL只是通过上述方法中的URL。

我遇到的问题是如何隔离正常的邮件和URL(图片)

所以发送正常的文本,我直接发送上面的函数,但发送的URL我发送nsdictionary ie即将nsdictionarystring,并在上面的函数发送它

 NSDictionary *dict = @{@"type":@"image", @"url":@"Url of your image"}; NSString *newMessage = [NSString stringWithFormat:@"%@",dict]; [appDelegate.xmppRoom sendMessageWithBody:newMessage]; 

为了分离正常的消息和图像在 –

 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message { messages *msg = [messages new]; NSDictionary *dictOfMedia = [NSPropertyListSerialization propertyListWithData:[[[message elementForName:@"body"] stringValue] dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions format:NULL error:NULL]; if ([dictOfMedia objectForKey:@"type"]) { msg.mediaType = [dictOfMedia objectForKey:@"type"]; msg.url = [dictOfMedia objectForKey:@"url"]; } else { msg.msg = [[message elementForName:@"body"] stringValue]; } } 

消息是我的模型类,你可以使用简单的nsstring进行testing。

之后,只需使用任何开源项目下载图像或自行执行延迟加载。

希望对你有帮助 :)