我在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字段
仍然没有运气...... 是我试图做的甚至可能吗?如果是这样,我还能错过什么? 感谢
答案 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]
创建的另一个实例,则新管理器不会注册您的自定义协议类。这可能会导致问题。