使用 NSURLSession 进行 dataTask 的 macOS FTP 应用程序不起作用

问题描述

我正在使用以下代码获取 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 代码根本不支持。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...