iOS - 将AFNetworking与自定义NSURLProtocol类一起使用

时间:2015-01-26 10:36:29

标签: ios objective-c http afnetworking nsurlprotocol

我在this tutorial的帮助下实施了自定义NSURLProtocol class。除了名称,数据模型等之外,我的实现与教程中的实现几乎相同......

基本上,我正在尝试发送HTTP请求,而不是URL开头:" http://",它需要从一开始,比如说:" bla://"

现在,我正在尝试注册protocol class并通过AFNetworking framework使用它,我遇到了一些麻烦。

canInitWithRequest:方法在某个时刻开始返回NO,此时请求失败并且我一直得到一个不支持的URL"错误。

除了注册protocol class之外,我还尝试通过在{{1}中调用此类来将该类添加到AFHTTPSessionManager' protocolClasses方法:

didFinishLaunchingWithOptions

我还将url方案添加到应用程序的info.plist中的URL Schemes字段

仍然没有运气...... 是我试图做的甚至可能吗?如果是这样,我还能错过什么? 感谢

3 个答案:

答案 0 :(得分:5)

所以,其他寻找有关此事的信息:

除了AFURLSessionManager不使用标准NSURLProtocol注册这一事实外,它还会处理数组先进先出,而不是像{{{ 1}}。

意思是,如果你想覆盖NSURLProtocol的行为(比如用于测试目的),你不能只将你的AFURLSessionManager子类添加到NSURLProtocol,你必须改为添加它到数组的开头(或至少在你覆盖/修改的行为前面)。

答案 1 :(得分:2)

所以,首先@dopcn是正确的,您需要保留AFHTTPSessionManager的实例。

@ryanwa部分正确,您需要在数组的开头插入新协议,但它仍然无法正常工作,因为在NSURLSession之后无法更改配置。正确的解决方案是使用initWithSessionConfiguration

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSMutableArray * protocolsArray = [sessionConfiguration.protocolClasses mutableCopy];
[protocolsArray insertObject:[MyURLProtocol class] atIndex:0];
sessionConfiguration.protocolClasses = protocolsArray;
AFHTTPSessionManager * myManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:sessionConfiguration]; //retain this somewhere!

据我所知,您不需要使用NSURLProtocol注册registerClass子类。这适用于我在iOS 1.1上的iPad Mini 4。

来自NSURLSession上的文档:

  

@property(readonly, copy) NSURLSessionConfiguration *configuration

     

<强>描述

     

此会话的配置对象的副本。   (只读)更改配置对象中的可变值   对当前会话没有影响,但您可以创建新会话   使用修改后的配置对象。

答案 2 :(得分:-1)

[AFHTTPSessionManager manager]不会返回单个对象,而是返回一个全新的实例。因此,如果您只在protocolClasses中为didFinishLaunchingWithOptions设置一个AFHTTPSessionManager实例,但在其他位置使用[AFHTTPSessionManager manager]创建的另一个实例,则新管理器不会注册您的自定义协议类。这可能会导致问题。