0

我正在开发一个使用远程存储数据的 iPhone 应用程序。该应用程序仅供我们的客户使用(没有应用程序商店),我不允许指定应用程序的上下文。

我可以告诉您的唯一上下文是该应用程序允许输入代码,并下载与该代码相关的数据。

我们的客户告诉我们,有时我们需要在无法访问互联网或速度太慢的地方使用该应用程序。

已经得出的解决方案如下:

  1. 我们将尝试在本地 FTP 服务器上下载数据,该服务器实际上只是一个共享目录的路由器,该目录以代码为名称,可通过已知 IP(例如ftp://192.168.1.1/some-path)访问。

  2. 如果失败,它会尝试从 Web 服务器下载。

我发现了 Nico Kreipke 的一个很棒的库,叫做 FTPManager。(点击这里查看它的 GitHub

不幸的是,当 FTP 地址不可用时,大约需要一分钟才能超时并进入第二步。

有没有人可以帮助减少这个超时?也许对 IP 进行快速 ping 操作?如果是这样,该怎么做?

谢谢你的时间,
蒂亚戈

更多信息

我尝试了一个受 Rauru Ferro 答案启发的解决方案。但不幸的是,它没有帮助。用于测试的代码如下:

NSString *ftp = [NSString stringWithFormat:@"ftp://user:password@%@/sda1/%@", ip, code];
NSURL *url = [NSURL URLWithString:ftp];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returnedResponse:&response error:&error];

我尝试了几个超时值,但无济于事。它总是以超时错误结束。但是,下载代码能够从路由器的共享目录下载数据(使用相同的凭据)。

4

2 回答 2

0

尝试使用此代码(使用 POST httpMethod 构建 http 连接,但只是一个开始):

NSURL *url = [NSURL URLWithString:yourURL];
NSMutableURLRequest *request = [NSMutableURLRequest
                                 requestWithURL:url
                                 cachePolicy:NSURLRequestReloadIgnoringCacheData
                                 timeoutInterval:20.0];
[request setHTTPMethod:@"POST"];
于 2013-10-10T10:38:50.047 回答
0

连接到服务器时需要考虑一些事项。首先要确定的是“我是否连接到服务器”,第二件事是“服务器响应需要多长时间?”。

使用 FTP,首先与服务器建立低级别的 tcp/ip 连接,然后服务器将响应初始的 2xx 级别的 Welcome/Hello 消息。

当使用 NSMutableURLRequest 等高级类接口时,可能很难区分连接超时和服务器响应超时。有可能您正在连接到服务器,但是服务器陷入了困境,并且响应欢迎消息的速度非常慢。

我的建议是使用低级别并使用通用 BSD 套接字对象,创建套接字然后连接到服务器。您还可以使用低级别的 setsockopt() 调用来限制 connect() 调用将等待连接的时间。使用 FTP,您还可以选择执行 recv() 从服务器检索欢迎消息。您可以为此调用设置不同的超时时间,以确保服务器及时响应。

在稍高一点的层面上,CFSocket 类会给你更多来自 BSD 层的封装,但你应该仍然能够打破连接时间和初始响应时间之间的差异。

希望有帮助!迈克尔

于 2013-11-17T23:09:02.010 回答