如何使用AFNetworking允许https连接?

时间:2013-02-15 17:57:23

标签: ios objective-c ios4 afnetworking

我已经设置了AFNetworking,但它不接受https网址。如何通过ssl进行AFNEtworking连接。

我有以下代码:

  NSMutableURLRequest *apiRequest =
[self multipartFormRequestWithMethod:@"POST"
                                path: pathstr
                          parameters: params
           constructingBodyWithBlock: ^(id <AFMultipartFormData>formData)
           {
               //TODO: attach file if needed
           }];



AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    //success!
    completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    //failure :(

    NSLog(@"%@", error);
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
}];

[operation start];

4 个答案:

答案 0 :(得分:14)

operation.securityPolicy.allowInvalidCertificates = YES;

这段代码非常重要。如果你不添加它,你会收到一个错误。

答案 1 :(得分:6)

这显然只有在您拥有非自签名证书或您添加的情况下才有效:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_到你的pch文件。如果您正在使用可可豆荚,则可能需要将AFHTTPRequestOperation子类化并实施:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
    if ([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) {

        if ([self bypassSslCertValidation:protectionSpace])
            return YES;
        else
            return [super connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace];

    }
    return [super connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace];

}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        if ([self bypassSslCertValidation:challenge.protectionSpace]) {
            [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
            return;
        }
        else
            return [super connection:connection didReceiveAuthenticationChallenge:challenge];
        return;
    }
}

- (BOOL) bypassSslCertValidation:(NSURLProtectionSpace *) protectionSpace
{
    if (ENVIRONMENT_TYPE == DEV_ENV || ENVIRONMENT_TYPE == STAGING_ENV) {
        return YES;
    }
    return NO;
}

然后告诉AFNEtworking使用新的子类:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@""]];
[client registerHTTPOperationClass:[YourSubClassHTTPRequestOperation class]];

这不是世界上最简单的事情,技术上忽略自签名并不能使它工作,但是如果你使用标准的SLL证书它可能会工作得很好,记得删除这些代码或只使它如果您计划发布,则在调试时可用。

添加回答,因为评论有字符限制!

很少有选择headers

可以手动添加到队列的返回操作:

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest

或者将自定义子类操作传递给这个:

- (void)enqueueHTTPRequestOperation:(AFHTTPRequestOperation *)operation;

答案 2 :(得分:2)

试试这段代码。

  NSMutableURLRequest *apiRequest =
[self multipartFormRequestWithMethod:@"POST"
                                path: pathstr
                          parameters: params
           constructingBodyWithBlock: ^(id <AFMultipartFormData>formData)
           {
               //TODO: attach file if needed
           }];



AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    //success!
    completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    //failure :(

    NSLog(@"%@", error);
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
}];
operation.securityPolicy.allowInvalidCertificates = YES;
[operation start];

答案 3 :(得分:0)

如果禁用AFNetworking超类实现的子类,则只需输入如下代码:http // foo // bar并将其设置为bool