Я пытаюсь загрузить файл .sqlite с сайта FTP моих компаний, используя AFNetworking. У каждого пользователя FTP есть своя папка на моем сервере. Я нашел this question для обработки аутентификации и this question для обработки загрузки. Я верю, что я собрал эти два вместе правильно, чтобы получить то, что я ищу (или, по крайней мере, я недостаточно далеко, чтобы проверить это). В любом случае, я прикрепил свой код.Использование AFNetworking с аутентификацией завершается с ошибкой с правильными учетными данными
AFHTTPClient Subclass.h
#import "AFHTTPClient.h"
@interface AFNetworkingHelper : AFHTTPClient
- (void) setUsername:(NSString *)username andPassword:(NSString *)password;
+ (AFNetworkingHelper *)sharedManager;
@end
AFHTTPClient Subclass.m
#import "AFNetworkingHelper.h"
@implementation AFNetworkingHelper
#pragma mark - Methods
- (void)setUsername:(NSString *)username andPassword:(NSString *)password
{
[self clearAuthorizationHeader];
[self setAuthorizationHeaderWithUsername:username password:password];
}
#pragma mark - Initialization
- (id) initWithBaseURL:(NSURL *)url
{
self = [super initWithBaseURL:url];
if (!self)
{
return nil;
}
return self;
}
#pragma mark - Singleton Methods
+ (AFNetworkingHelper *)sharedManager
{
static dispatch_once_t pred;
static AFNetworkingHelper *_sharedManager = nil;
dispatch_once(&pred, ^{ _sharedManager = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"ftp://www.mysite.net"]]; });
return _sharedManager;
}
@end
ViewController.m
// Download data - AFNetworking method
[[AFNetworkingHelper sharedManager] setUsername:@"myusername" andPassword:@"mypassword"];
[[AFNetworkingHelper sharedManager] getPath:@"/myfile.sqlite" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSURL *path = [[[app applicationDocumentsDirectory] URLByAppendingPathComponent:@"myfile"] URLByAppendingPathExtension:@"sqlite"];
operation.outputStream = [NSOutputStream outputStreamWithURL:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"Successfully downloaded file to path: %@",path);
// Update dates table to reflect that info was updated here
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error in AFHTTPRequestOperation in clickedButtonAtIndex on myController.m");
NSLog(@"%@",error.description);
}];
[operation start];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error in AFHTTPRequestOperation in clickedButtonAtIndex on myController.m");
NSLog(@"%@",error.description);
}];
Проблема у меня в том, что я получаю NSURLErrorDomain Code=-1102 "You do not have permission to access the requested resource"
когда я пытаюсь запустить его. Я проверил, что имя пользователя и пароль, которые я отправляю, верны. Если я попытаюсь передать путь к файлу, который не существует, я все равно получаю ошибку -1102 (вместо ошибки, заявляющей, что запрошенный файл не существует, что является ошибкой, которую я ожидал получить). Если я печатаю path
с первым вопросом я связан в браузер, я получаю некоторое другое поведение, основанный на какой браузер я использую:
- Firefox: Я должен войти
path
без имени пользователя, с файлом (так что-то вродеftp://www.mysite.net/myfile.sqlite
). Когда я ввожу это в адресную строку, я получаю всплывающее окно с запросом имени пользователя и пароля. Когда я ввожу правильные учетные данные, загрузка файла начинается и завершается успешно. - IE: Я должен ввести
path
с именем пользователя и файлом (так что-то вродеftp://www.mysite.net/myuser/myfile.sqlite
). Когда я ввожу это в адресную строку, я получаю всплывающее окно с запросом имени пользователя и пароля. Когда я ввожу правильные учетные данные, загрузка файла начинается и завершается успешно. - Safari: Независимо от того, как я ввожу
path
, я просто получаю экран с ошибкой, говорящийYou don't have permission to open this page
. Я не получаю подсказки по учетным данным, и загрузка не запускается. Если я попытаюсь ввестиpath
в файл, который не существует, я все равно получаю сообщение об ошибкеYou don't have permission to open this page
(так же, как когда я пытался запросить несуществующий файл в своем приложении). UPDATE: использование синтаксиса «USERNAME: PASSWORD @ www ...» для комментария @ rog позволяет мне загружаться в Safari.
Я действительно не понимаю, что здесь происходит. Получаю сообщение об ошибке из моего приложения, потому что он никогда не получает вызов учетных данных, например, когда я пытаюсь открыть его с помощью Safari? Если да, почему бы мне не получить вызов для моих учетных данных из моего приложения или Safari, как я, когда я использую другие браузеры? Есть ли способ проверить, действительно ли мое приложение пытается использовать учетные данные, которые я предоставил при попытке загрузить файл?
Оставьте свой код! (Опустите свои учетные данные). Кроме того, попробуйте использовать схему URL: 'ftp: // USERNAME: PASSWORD @ mysite.net/myfile.sqlite' – rog
@rog: добавлен код. Кроме того, я попробовал схему, которую вы предложили, и это позволяет мне загрузить файл с помощью Safari. Как я могу добавить это в свое приложение, поскольку «путь» разделен между вызовом 'myController.m' и' AFNetworkHelper.m'? – GeneralMike
Почему downvote? – GeneralMike