我使用以下代码来获取使用 ftp 协议的目录列表。它在 iOS 中按预期工作,但在 macOS 中:我没有得到任何结果 - data.length 始终为 0 - 并且没有错误。我也尝试过使用会话和任务委托,但得到相同的结果。
有什么建议吗?
ftpURL 的格式为“ftp://server.host.net/Public”
请注意,我可以使用 CF…FTP 方法(例如
CFReadStreamCreateWithFTPURL
)来获取目录列表,它们确实有效,但已被弃用。此外,下载文件而不是使用 NSURLSession
获取列表也很好。
- (void)directoryListing:(NSURL *)ftpURL
{
NSLog(@"Directory listing for:\n%@", ftpURL.absoluteString);
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithURL:ftpURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error != nil) {
NSLog(@"Client-Error:%@",error.localizedDescription);
} else {
NSString *results = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Data length: %ld, [%@]", data.length, results);
}
}];
[dataTask resume];
}
我真的很惊讶它能在 iOS 上运行。 FTP 目前基本上已被彻底弃用,并且仅正式支持文件下载。检索文件列表(LIST 命令)使用与下载文件(RETR 命令)完全不同的命令,并且对于基金会网络 API 如何提供后者的结果没有真正的标准。
我的猜测是,您意外地从该调用中获取了数据,因为 iOS 上的 Safari 编写方式存在一些怪癖(例如 Safari 不直接在 iOS 上使用 CFNetwork 调用),再加上基础网络代码的方式存在一些细微的差异下面连接到 CFNetwork 层。换句话说,它能起作用纯属侥幸。
我可能会推荐使用实际支持的 FTP 库,例如libcurl。您还可以享受能够支持 TLS 的优势,据我所知,Apple FTP 代码根本不支持该功能。