Swift macOS Как реализовать поддержку FTP

Мне нужно загрузить файл на FTP-сервер, проверить, существует ли папка, и, если нет, создать ее. Я нашел FileProvider от Амира Аббаса Мусавиана. Я все установил и реализовал следующий код:

let credential = URLCredential(user: "user", password: "password", persistence: .permanent)
let ftpProvider = FTPFileProvider(baseURL: URL(string:"cflm.org")!, mode: .active, credential: credential, cache: nil)
ftpProvider?.delegate = self as! FileProviderDelegate
ftpProvider?.contentsOfDirectory(path: "/", completionHandler: {
    contents, error in
    for file in contents {
        print("Name: \(file.name)")
        print("Size: \(file.size)")
        print("Creation Date: \(file.creationDate)")
        print("Modification Date: \(file.modifiedDate)")
    }
})

Когда я запускаю код, завершениеHandler для contentOfDirectory никогда не срабатывает. Кто-нибудь знает, что я делаю неправильно, или есть другой способ, которым я могу выполнять нужные мне функции FTP?


person Floyd Resler    schedule 27.09.2019    source источник
comment
Почему вы принудительно вводите тип self при установке его в качестве делегата?   -  person Joakim Danielson    schedule 27.09.2019
comment
Это было в примере кода для FileProvider. Впрочем, вы правы, мне это было не нужно. Итак, я удалил его, но у меня все еще та же проблема.   -  person Floyd Resler    schedule 27.09.2019


Ответы (1)


Ваше закрытие не вызывается, потому что ftpProvider равно нулю, быстрый взгляд на исходный код говорит нам, что URL-адрес, отправленный в init, должен содержать протокол. Поэтому добавьте «ftp» или «ftps» к вашему URL-адресу.

И оберните инициализацию в защитный оператор

guard let ftpProvider = FTPFileProvider(baseURL: URL(string:"ftp://cflm.org")!, mode: .active, credential: credential, cache: nil) else {
    return //or some error handling
} 
//... rest of code
person Joakim Danielson    schedule 27.09.2019
comment
Это сделало это! Спасибо большое! - person Floyd Resler; 27.09.2019