使用AFNetworking与自定义NSURLProtocol类

我有一个自定义的NSURLProtocol类,在本教程的帮助下已经实现。 除了名称,数据模型等之外,我的实现与本教程几乎相同。

从本质上讲,我试图发送一个HTTP请求,而不是以“http://”开头的URL,它需要先说:“bla://”

现在,我正在尝试注册协议类并通过AFNetworking框架使用它,并且遇到了一些麻烦。

canInitWithRequest:方法在某一时刻开始返回NO,此时请求失败,我一直收到“不受支持的URL”错误。

除了注册协议类之外,我还尝试通过在didFinishLaunchingWithOptions方法中调用此方法将该类添加到AFHTTPSessionManagerprotocolClasses中:

[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]不会返回一个单例对象,而是返回一个全新的实例。 因此,如果您只是在didFinishLaunchingWithOptionsAFHTTPSessionManager一个实例设置protocolClasses ,但在其他地方使用由[AFHTTPSessionManager manager]创建的另一个实例,则新管理器不会注册您的自定义协议类。 这可能会导致问题。

链接地址: http://www.djcxy.com/p/34839.html

上一篇: Use AFNetworking with custom NSURLProtocol class

下一篇: NSURLProtocol doesn't get complete NSURLRequest