Openfire服务可以做文件传输方法可供选择有:
我选的是XEP-0096和XEP-0065 :
XEP-0096对应的iOS版本文件 地址 ,XEP-0065 iOS 版本也可用上述地址的版本
初始化XMPPStream时需要注意:
XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", account, XMPPDomain]]; XMPPJID *jidWithResource = [jid jidWithNewResource:@"ios"]; [self.xmppStream setMyJID:jidWithResource];
普通JID格式如:account@domain (形如 hanmeimei@test)
第二行带上resource,不带我的程序报错:
<error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>
应该是两端的resource不一致
初始化 XMPPSIFileTransfer相应代码:
NSString *sessionId = [_xmppStream generateUUID]; _sifiletransfer = [[XMPPSIFileTransfer alloc] init]; _sifiletransfer.sid = sessionId; [_sifiletransfer addDelegate:self delegateQueue:dispatch_get_main_queue()]; [_sifiletransfer activate:_xmppStream];
发送文件:
- (void)sendImageMessage:(NSData *)imageData toAccount:(NSString *)account{ XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@/%@", account, XMPPDomain, [[_xmppStream myJID] resource]]]; [_sifiletransfer initiateFileTransferTo:jid withData:imageData]; }
其中文件接收方的JID完整格式:account@domain/resource (形如 hanmeimei@test/ios)
发送完成后在 XMPPSIFileTransfer.h中的
@protocol XMPPSIFileTransferDelegate <NSObject> @required - (void)receivedImage:(NSData*)image from:(XMPPJID*)from; @end
可在你自己的文件中实现该方法接受文件
至此,我在内网可以通过此方式传输文件,Mac下得openfire服务,可选用源码或dmg方式 均可;
后来测试一端内网,一端外网出现错误,提示为:
<error code="404" type="cancel"><item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>
注意xmpp.proxy.externalip 填写你测试服务器的外网地址
路由器的7777端口也要映射到外网,如图:
至此,内外网两端发送文件测试也通过。
希望能帮到您。