Ios 使用AFNetworking进行身份验证失败,凭据正确

Ios 使用AFNetworking进行身份验证失败,凭据正确,ios,browser,windows-server-2003,afnetworking,credentials,Ios,Browser,Windows Server 2003,Afnetworking,Credentials,我正在尝试使用AFNetworking从我的公司FTP站点下载一个.sqlite文件。每个FTP用户在我的服务器上都有自己的文件夹。我找到了处理身份验证和下载的方法。我相信我已经将两者正确地结合在一起,以得到我想要的东西(或者至少我还没有走得足够远,无法测试它)。不管怎样,我已经在这里附加了我的代码 AFHTTPClient子类.h #import "AFHTTPClient.h" @interface AFNetworkingHelper : AFHTTPClient - (void) s

我正在尝试使用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
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“您没有访问请求的资源的权限”
。我已验证我发送的用户名和密码是否正确。如果我试图传递一个不存在的文件的路径,我仍然会得到-1102错误(而不是说我请求的文件不存在的错误,这是我期望得到的错误)。如果我键入链接到浏览器的第一个问题中的
路径
,我会根据我使用的浏览器得到一些不同的行为:

  • Firefox:我必须输入
    路径
    ,但不输入用户名和文件(比如
    ftp://www.mysite.net/myfile.sqlite
    )。当我把它输入地址栏时,我会看到一个弹出窗口,询问用户名和密码。输入正确的凭据后,文件下载开始并成功完成
  • IE:我必须输入带有用户名和文件的
    路径(比如
    ftp://www.mysite.net/myuser/myfile.sqlite
    )。当我把它输入地址栏时,我会看到一个弹出窗口,询问用户名和密码。输入正确的凭据后,文件下载开始并成功完成
  • Safari:无论我如何输入
    路径
    ,我都会看到一个错误屏幕,上面显示
    您没有打开此页面的权限
    。我没有收到凭证提示,下载也从未开始。如果我尝试输入一个不存在的文件的
    路径
    ,我仍然会收到一个错误,说
    你没有权限打开此页面
    (就像我尝试在我的应用程序中请求一个不存在的文件时一样)。更新:使用“用户名:PASSWORD@www...“通过@rog的评论,语法允许我在Safari中成功下载

我真的不明白这里发生了什么。我从我的应用程序中收到错误消息是因为它从来没有收到凭证质询,就像我尝试用Safari打开它时一样?如果是这样的话,为什么我不能像使用其他浏览器一样,从我的应用程序或Safari中获得对我的凭据的挑战?有没有办法检查我的应用程序在尝试下载文件时是否真的在使用我提供的凭据?

使用他在评论中建议的@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]设置用户名:@“myUsername”和密码@“myPassword”]失败,但从好的方面来说,我从我的应用程序中获得了我想要的行为。我想我可以接受这一点。

这是两种不同的协议


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

发布您的代码!(省略您的凭据)。另外,尝试使用URL模式:
ftp://USERNAME:PASSWORD@mysite.net/myfile.sqlite
@rog:添加了代码。此外,我尝试了您建议的模式,它允许我使用Safari下载该文件。既然
路径
在调用
myController.m
AFNetworkHelper.m
时被分割,我该如何将其添加到我的应用程序中?@一般来说,这纯粹是巧合
NSURLConnection
恰好支持FTP和HTTP。不理解差异最终会在某个时候给你带来问题。