使用 XMPP 框架在 Objective C 中传输文件
Posted
技术标签:
【中文标题】使用 XMPP 框架在 Objective C 中传输文件【英文标题】:File transfer in Objective C using XMPP Framework 【发布时间】:2011-08-01 07:20:34 【问题描述】:我想在 Objective C 中使用 XMPP 框架传输(发送和接收)文件(从 iPhone 到 iPhone)。是否有任何教程解释了执行此操作的详细步骤。
【问题讨论】:
【参考方案1】:使用 XMPPFramework 进行文件传输
此应用程序只是一个简短的演示,演示如何使用 XMPPFramework 的文件传输扩展。
可以在此处找到详细的博客文章。
我的更改已合并到 XMPPFramework 的主分支中,因此您需要在项目中包含最新版本。
传入的文件传输和传出的文件传输都可以在这个演示中使用,但是我留下了大量的错误处理,所以你需要在你的应用中包含它。
服务器设置
为了使 SOCKS5 正常工作,您的服务器必须配置为处理代理连接。我只使用 ejabberd 对此进行了测试,但这些是我使用的 mod_proxy65 设置:
mod_proxy65, [
ip, 0,0,0,0,
hostname, "myhostnamehere",
port, 7777,
access, all,
shaper, c2s_shaper
],
如果您无法让代理正常运行,您始终可以选择设置 disableSOCKS5 = YES,这将强制进行 IBB 传输。这速度较慢,但受到广泛支持。
用法
传入文件传输
实例化一个新的 XMPPIncomingFileTransfer,激活它,添加一个委托,然后等待一个文件传输请求。
_xmppIncomingFileTransfer = [XMPPIncomingFileTransfer new];
[_xmppIncomingFileTransfer activate:_xmppStream];
[_xmppIncomingFileTransfer addDelegate:self delegateQueue:dispatch_get_main_queue()];
为您处理对 disco#info 查询等的响应。收到 SI 报价后,您会接到代表电话,此时您可以决定是否接受。你也可以设置 autoAcceptFileTransfers = YES 并且你不需要自己调用 acceptSIOffer:。
- (void)xmppIncomingFileTransfer:(XMPPIncomingFileTransfer *)sender
didFailWithError:(NSError *)error
DDLogVerbose(@"%@: Incoming file transfer failed with error: %@", THIS_FILE, error);
- (void)xmppIncomingFileTransfer:(XMPPIncomingFileTransfer *)sender
didReceiveSIOffer:(XMPPIQ *)offer
DDLogVerbose(@"%@: Incoming file transfer did receive SI offer. Accepting...", THIS_FILE);
[sender acceptSIOffer:offer];
- (void)xmppIncomingFileTransfer:(XMPPIncomingFileTransfer *)sender
didSucceedWithData:(NSData *)data
named:(NSString *)name
DDLogVerbose(@"%@: Incoming file transfer did succeed.", THIS_FILE);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *fullPath = [[paths lastObject] stringByAppendingPathComponent:name];
[data writeToFile:fullPath options:0 error:nil];
DDLogVerbose(@"%@: Data was written to the path: %@", THIS_FILE, fullPath);
传出文件传输
要开始一个新的传出文件传输,只需创建一个 XMPPOutgoingFileTransfer 实例,激活它,添加一个委托,然后发送您的数据:
_fileTransfer = [[XMPPOutgoingFileTransfer alloc] initWithDispatchQueue:dispatch_get_main_queue()];
[_fileTransfer activate:[self appDelegate].xmppStream];
[_fileTransfer addDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err;
if (![_fileTransfer sendData:data
named:filename
toRecipient:[XMPPJID jidWithString:recipient]
description:@"Baal's Soulstone, obviously."
error:&err])
DDLogInfo(@"You messed something up: %@", err);
在适当的时候调用以下委托:
- (void)xmppOutgoingFileTransfer:(XMPPOutgoingFileTransfer *)sender
didFailWithError:(NSError *)error
DDLogInfo(@"Outgoing file transfer failed with error: %@", error);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"There was an error sending your file. See the logs."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
- (void)xmppOutgoingFileTransferDidSucceed:(XMPPOutgoingFileTransfer *)sender
DDLogVerbose(@"File transfer successful.");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success!"
message:@"Your file was sent successfully."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
【讨论】:
以上是关于使用 XMPP 框架在 Objective C 中传输文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 xmpp 框架和 openfire 服务器将电话簿联系人添加到 ios 中的聊天应用程序?