使用 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 中传输文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在目标 c 中使用 xmpp 框架显示用户头像图像?

轻量级 Objective-C XMPP 服务器 [关闭]

如何使用 xmpp 框架和 openfire 服务器将电话簿联系人添加到 ios 中的聊天应用程序?

XEP-0166:iOS 中语音/视频聊天的 Jingle 协议实现

如何在objective c框架中使用swift扩展

是否可以在 Objective c 中使用 AVFoundation 框架绘制网格线