Загрузка ios FTP при помощи NSURLSession

Я пытаюсь загрузить файлы через FTP на сервер. В соответствии с Документация Apple Класс NSURLSession поддерживает операции FTP.

Существует знаменитый блог Apple Developer, который также поддерживает это. Но все же неясно, поддерживает ли NSURLSession API ftp-загрузку или нет? (Я попытался с предложенным способом и получив ошибку).

С обычным способом CFFTPStreamRef загрузка ftp работает нормально, но она устарела в 9.0. Заголовок говорит: CF_DEPRECATED (10_3, 10_11, 2_0, 9_0, "Использовать NSURLSessionAPI для ftp-запросов" )

Любая идея, пример или ссылка для получения справки. Я сейчас пытаюсь сделать что-то вроде этого:

NSURL *url_upload = [NSURL URLWithString:@"ftp://username:[email protected]/myfolder/filename.zip"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url_upload];
    [request setHTTPMethod:@"PUT"];
NSURL *docsDirURL = [NSURL fileURLWithPath:filePath];

NSURLProtectionSpace * protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url_upload.host port:[url_upload.port integerValue] protocol:url_upload.scheme realm:nil authenticationMethod:nil];

NSURLCredential *cred = [NSURLCredential
                         credentialWithUser:userId
                         password:password
                         persistence:NSURLCredentialPersistenceForSession];


NSURLCredentialStorage * cred_storage ;
[cred_storage setCredential:cred forProtectionSpace:protectionSpace];
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.URLCredentialStorage = cred_storage;
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.timeoutIntervalForResource = 60.0;
sessionConfig.allowsCellularAccess = YES;
sessionConfig.HTTPMaximumConnectionsPerHost = 1;
NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionUploadTask *uploadTask = [upLoadSession uploadTaskWithRequest:request fromFile:docsDirURL];
[uploadTask resume];

Ответ 1

В лучшем случае из моего воспоминания NSURLSession (и NSURLConnection) поддерживает загрузку файлов по FTP, но не поддерживает какие-либо другие команды FTP, такие как STOR (обратите внимание, что PUT - это метод HTTP, а не метод FTP).

В ваших целях ваши варианты должны либо использовать API CFFTPStream (который работает только с трудом), либо прекратить использование FTP.

Моя сильная рекомендация заключалась бы в прекращении использования FTP. Протокол FTP безнадежно небезопасен, посылая имя пользователя и пароль в виде открытого текста по кабелю, что делает его очень простым для людей понюхать учетные данные и маскарад как пользователь. Таким образом, единственная ситуация, когда загрузка FTP будет даже отдаленно приемлемой в наши дни, - это анонимная загрузка FTP в общий Dropbox, и даже тогда это несколько сомнительно. Поэтому функциональность никогда не добавлялась в API NSURLConnection, а тем более NSURLSession.

Есть намного лучшие альтернативы, которые намного более безопасны, такие как WebDAV over HTTPS, POST-запрос загружает через HTTPS, WebDAV или POST-запросы с аутентификацией дайджеста и т.д. И эти альтернативы на самом деле поддерживаются NSURLSession и предоставляют другие преимущества, такие как возможность возобновления загрузки. Если у вас нет абсолютно никакого способа изменить серверную сторону, используйте вместо этого одну из этих альтернатив.