7

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

本质上,我正在尝试发送HTTP请求,但不是URL以“http://”开头,而是需要以“bla://”开头

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

canInitWithRequest:方法在某个时候开始返回 NO,此时请求失败,并且我不断收到“不支持的 URL”错误。

除了注册之外protocol class,我还尝试通过在方法中调用它来将类添加到AFHTTPSessionManager's :protocolClassesdidFinishLaunchingWithOptions

[NSURLProtocol registerClass:[MyURLProtocol class]];
NSMutableArray *protocolsArray = [NSMutableArray arrayWithArray:[AFHTTPSessionManager manager].session.configuration.protocolClasses];
[protocolsArray addObject:[MyURLProtocol class]];
[AFHTTPSessionManager manager].session.configuration.protocolClasses = [protocolsArray copy];

而且我还在应用程序的 info.plist 中的 URL Schemes 字段中添加了 url 方案

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

4

3 回答 3

6

因此,对于其他寻找有关此信息的信息:

除了AFURLSessionManager不使用标准NSURLProtocol注册之外,它还处理数组先进先出,而不是像NSURLProtocol.

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

于 2015-02-24T06:48:06.517 回答
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. 这在 iPad Mini 4 上的 iOS 9.1 上对我有用。

从上的文档NSURLSession

@property(readonly, copy) NSURLSessionConfiguration *configuration

描述

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

于 2016-01-26T21:58:29.590 回答
1

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

于 2015-01-26T15:12:58.140 回答