问题描述
我正在使用以下代码获取 ftp 应用程序的目录列表。它在 iOS 中按预期工作,但在 macOS 中,我没有得到任何结果 - data.length 始终为 0 - 并且没有错误。我也尝试过使用 Session 和 Task 委托,但得到了相同的结果。
有什么建议吗?
ftpURL 的格式为“ftp://server.host.net/Public”
请注意,我可以使用 CFFTP 方法来获取目录列表,并且它们确实有效,但是……它们已被弃用。此外,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 库,例如库卷曲。您还将拥有能够支持 TLS 的优势,但 AFAIK Apple FTP 代码根本不支持。