-1

我正在尝试使用 AFNetworking 从我公司的 FTP 站点下载 .sqlite 文件。每个 FTP 用户在我的服务器上都有自己的文件夹。我发现这个问题来处理身份验证,这个问题来处理下载。我相信我已经正确地将两者结合在一起以获得我正在寻找的东西(或者至少我还没有走得足够远来能够测试它)。无论如何,我已经在这里附加了我的代码。

AFHTTPClient 子类.h

#import "AFHTTPClient.h"

@interface AFNetworkingHelper : AFHTTPClient

- (void) setUsername:(NSString *)username andPassword:(NSString *)password;

+ (AFNetworkingHelper *)sharedManager;

@end

AFHTTPClient 子类.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

视图控制器.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(就像我尝试在我的应用程序中请求一个不存在的文件时一样)。更新:根据@rog 的评论使用“USERNAME:PASSWORD@www...”语法让我可以在 Safari 中成功下载。

我真的不明白这里发生了什么。我是否从我的应用程序中收到错误消息,因为它实际上从未收到凭据挑战,例如当我尝试使用 Safari 打开它时?如果是这样,为什么我不像使用其他浏览器时那样从我的应用程序或 Safari 中收到对我的凭据的挑战?有没有办法可以检查我的应用程序在尝试下载文件时是否真的在尝试使用我提供的凭据?

4

2 回答 2

3

FTPHTTP是两种不同的协议

将 AFHTTPClient 用于 FTP 服务器是行不通的。AFNetworking 仅支持 FTP AFURLConnectionOperation;其他一切都是 HTTP。

于 2013-05-23T16:40:02.860 回答
1

使用@rog 在他的评论中建议的语法,我能够调整我的问题(关于下载)中第二个链接的代码以允许基本身份验证,并完全消除了将 AFHTTPClient 子类化的需要。这是我使用的(编辑的)代码:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"ftp://myUsername:myPassword@www.mysite.net/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" andPassword@"myPassword"];失败的,但从好的方面来说,我从我的应用程序中得到了我想要的行为。我想我可以忍受这一点。

于 2013-05-08T16:40:59.223 回答