我正在开发一款使用远程存储数据的iPhone应用程序。该应用程序仅供我们的客户使用(没有应用程序商店),我不允许指定应用程序的上下文。
我可以告诉你的唯一情况是该应用程序允许输入代码,并下载与该代码相关的数据。
我们的客户告诉我们,有些时候我们需要在互联网无法访问或太慢的地方使用该应用。
已经绘制的解决方案如下:
我们将尝试在本地FTP服务器上下载数据,该服务器实际上只是一个共享目录的路由器,其代码为其名称,可通过已知IP访问(例如ftp://192.168.1.1/some-path
)
如果失败,它会尝试从网络服务器下载。
我找到了一个名叫FTPManager的棒子库,由Nico Kreipke提供。 (click here for its GitHub)
不幸的是,当FTP地址不可用时,超时大约需要一分钟,然后转到第二步。
是否有人可以帮助减少此超时?也许快速ping到IP?如果是的话,该怎么做?
感谢您的时间,
蒂亚戈
更多信息
我尝试过一种灵感来自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 returningResponse:&response error:&error];
我尝试了几个超时值,但无济于事。它总是以超时错误结束。但是,下载代码能够从路由器的共享目录下载数据(使用相同的凭据)。
答案 0 :(得分:0)
尝试使用此代码(使用POST httpMethod为http连接构建,但是是一个初学者):
NSURL *url = [NSURL URLWithString:yourURL];
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:20.0];
[request setHTTPMethod:@"POST"];
答案 1 :(得分:0)
连接服务器时需要考虑一些事项。要确定的第一件事是“我是否连接到服务器”,第二件事是“服务器响应需要多长时间?”。
使用FTP,首先对服务器进行低级别tcp / ip连接,然后服务器将以初始2xx级别欢迎/ Hello消息进行响应。
使用NSMutableURLRequest等高级类接口时,可能很难区分连接超时和服务器响应超时。您可能正在连接到服务器,但服务器陷入困境,只是很慢,无法响应欢迎消息。
我的建议是进入低级别并使用通用BSD套接字对象,创建套接字然后连接到服务器。您还可以使用低级别的setsockopt()调用来限制connect()调用等待连接的时间。使用FTP,您还可以选择执行recv()以从服务器检索欢迎消息。您可以在此调用上设置不同的超时,以确保服务器及时响应。
稍微高一点的时候,CFSocket类会给你更多来自BSD层的封装,但你仍然应该能够突破连接时间和初始响应时间之间的差异。
希望有所帮助! 迈克尔