2013-05-08 3 views
-1

Я пытаюсь загрузить файл .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, как я, когда я использую другие браузеры? Есть ли способ проверить, действительно ли мое приложение пытается использовать учетные данные, которые я предоставил при попытке загрузить файл?

+0

Оставьте свой код! (Опустите свои учетные данные). Кроме того, попробуйте использовать схему URL: 'ftp: // USERNAME: PASSWORD @ mysite.net/myfile.sqlite' – rog

+0

@rog: добавлен код. Кроме того, я попробовал схему, которую вы предложили, и это позволяет мне загрузить файл с помощью Safari. Как я могу добавить это в свое приложение, поскольку «путь» разделен между вызовом 'myController.m' и' AFNetworkHelper.m'? – GeneralMike

+0

Почему downvote? – GeneralMike

ответ

1

Используя синтаксис @rog, предложенный в его комментарии, мне удалось адаптировать код из второй ссылки в моем вопросе (относительно загрузки), чтобы обеспечить базовую аутентификацию, и полностью исключить необходимость подкласса AFHTTPClient вместе. Вот (отредактированный) код, который я использовал:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"ftp://myUsername:[email protected]/myfile.sqlite"]]; 
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
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); 
    } 
           failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
     NSLog(@"Error in AFHTTPRequestOperation in clickedButtonAtIndex on FlightInfoController.m"); 
     NSLog(@"%@",error.description); 
    }]; 

[operation start]; 

Это на самом деле не получить меня ближе к зная, почему с помощью [[AFNetworkingHelper sharedManager] setUsername:@"myUsername" [email protected]"myPassword"]; не удалось, но на положительной стороне я получаю поведение, я хочу от моего приложения. Наверное, я могу жить именно так.

+0

Прохладный, рад, что это сработало для вас! – rog

3

FTP и HTTP - это два разных протокола.

Использование AFHTTPClient для FTP-сервера не будет работать. AFNetworking поддерживает только FTP с AFURLConnectionOperation; все остальное - HTTP.

+0

Хм, тогда почему это работает, как у меня? – GeneralMike

+0

Тщательный приятель, @mattt является автором AFNetworking :) – rog

+0

@GeneralMike Чисто совпадение. «NSURLConnection» поддерживает FTP и HTTP. Не понимая разницы, вы в какой-то момент вызывают проблемы. – mattt