使用AFNetworking与自定义NSURLProtocol类
我有一个自定义的NSURLProtocol类,在本教程的帮助下已经实现。 除了名称,数据模型等之外,我的实现与本教程几乎相同。
从本质上讲,我试图发送一个HTTP请求,而不是以“http://”开头的URL,它需要先说:“bla://”
现在,我正在尝试注册协议类并通过AFNetworking框架使用它,并且遇到了一些麻烦。
canInitWithRequest:
方法在某一时刻开始返回NO,此时请求失败,我一直收到“不受支持的URL”错误。
除了注册协议类之外,我还尝试通过在didFinishLaunchingWithOptions
方法中调用此方法将该类添加到AFHTTPSessionManager
的protocolClasses
中:
[NSURLProtocol registerClass:[MyURLProtocol class]];
NSMutableArray *protocolsArray = [NSMutableArray arrayWithArray:[AFHTTPSessionManager manager].session.configuration.protocolClasses];
[protocolsArray addObject:[MyURLProtocol class]];
[AFHTTPSessionManager manager].session.configuration.protocolClasses = [protocolsArray copy];
而且我还将url方案添加到应用的info.plist中的URL Schemes字段
仍然没有运气...我试图做什么甚至可能? 如果是的话,我会错过什么? 谢谢
所以,对于其他寻找这方面的信息:
随着事实AFURLSessionManager
不使用标准NSURLProtocol
注册,同时它处理数组先入先出,没有后进先出样NSURLProtocol
。
这意味着,如果你想覆盖AFURLSessionManager
的行为(比如出于测试目的),你不能只将你的NSURLProtocol
子类添加到session.configuration.protocolClasses
,而必须将它添加到数组的开头(或者至少在你覆盖/修改行为的前面)。
所以,首先@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
。 这在iPad Mini 4上适用于iOS 9.1。
从NSURLSession
的文档:
@property(readonly, copy) NSURLSessionConfiguration *configuration
描述
此会话的配置对象的副本。 (只读)更改配置对象中的可变值对当前会话没有影响,但可以使用修改的配置对象创建新会话。
嗨[AFHTTPSessionManager manager]
不会返回一个单例对象,而是返回一个全新的实例。 因此,如果您只是在didFinishLaunchingWithOptions
为AFHTTPSessionManager
一个实例设置protocolClasses
,但在其他地方使用由[AFHTTPSessionManager manager]
创建的另一个实例,则新管理器不会注册您的自定义协议类。 这可能会导致问题。