根据NSURLSessionConfiguration::protocolClasses
的文档,没有保证,我的自定义URL协议将被使用。我怎样才能确保每当我将其设置为protocolClasses
属性时使用它?
在处理请求之前,NSURLSession对象会搜索 首先是默认协议,然后检查自定义协议,直到它 找到一个能够处理指定请求的人。它使用了 canInitWithRequest:class方法返回YES的协议, 表明该类能够处理指定的 请求。
我无法使用单个URL协议设置数组,因为它具有canInitWithRequest:
方法的逻辑,可能无法处理所有请求。
NSArray *currentProtocolClasses = sessionConfiguration.protocolClasses ?: @[];
NSMutableArray *protocolClasses = [NSMutableArray arrayWithArray:currentProtocolClasses];
[protocolClasses insertObject:[CustomURLProtocol class] atIndex:0];
sessionConfiguration.protocolClasses = protocolClasses;
答案 0 :(得分:1)
如果文档说的话,这是一个错误。请提交一份。逻辑实际上比那里描述的要简单得多。基本上操作系统的作用是:
NSURLProtocol *protocol = nil;
for (Class protocolClass in sessionConfiguration.protocolClasses) {
if ([protocolClass canInitWithRequest:request]) {
protocol = [[protocolClass alloc] init];
}
}
if (!protocol) {
fail
}
因此,只要您的协议首先列出,它们就会获得优先权。 (对于NSURLConnection,该文档的那一位也是错误的;在任何内置协议之前,总是首先询问您的注册协议。)
如果您不需要处理标准协议,则只需执行此操作即可:
sessionConfiguration.protocolClasses = @[[CustomURLProtocol class]];
您无法强制使用URL协议。当且仅当其canInitWithRequest:
类方法为请求返回YES时,才使用该协议。如果你想让一个不同的协议处理一个请求(例如,如果你想定义一个真正使用普通https请求的自定义URL方案),那么你通常会通过编写一个重写URL并重新发出请求的协议来实现这一点。没有安装协议处理程序类的新会话。
或者,您可以在安装了处理程序的会话中重新发出请求,只要您以某种方式修改请求,以便协议处理程序知道在看到请求时从其canInitWithRequest:
方法返回NO第二次。 (否则,你将获得无限递归。)