使用 NSURLSession 通过 FTP 获取列表在 macOS 上不起作用

问题描述 投票:0回答:1

我使用以下代码来获取使用 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];
}

macos ftp nsurlsession
1个回答
1
投票

我真的很惊讶它能在 iOS 上运行。 FTP 目前基本上已被彻底弃用,并且仅正式支持文件下载。检索文件列表(LIST 命令)使用与下载文件(RETR 命令)完全不同的命令,并且对于基金会网络 API 如何提供后者的结果没有真正的标准。

我的猜测是,您意外地从该调用中获取了数据,因为 iOS 上的 Safari 编写方式存在一些怪癖(例如 Safari 不直接在 iOS 上使用 CFNetwork 调用),再加上基础网络代码的方式存在一些细微的差异下面连接到 CFNetwork 层。换句话说,它能起作用纯属侥幸。

我可能会推荐使用实际支持的 FTP 库,例如libcurl。您还可以享受能够支持 TLS 的优势,据我所知,Apple FTP 代码根本不支持该功能。

© www.soinside.com 2019 - 2024. All rights reserved.