如何确保使用了我的自定义 URL 协议?
How to make sure, that my custom URL protocol is used?
根据 NSURLSessionConfiguration::protocolClasses
的文档,不保证会使用我自定义的 url 协议。我怎样才能确保,只要我将它设置为 protocolClasses
属性?
Prior to handling a request, an NSURLSession object searches the
default protocols first and then checks your custom protocols until it
finds one capable of handling the specified request. It uses the
protocol whose canInitWithRequest: class method returns YES,
indicating that the class is capable of handling the specified
request.
我无法使用单个 URL 协议设置数组,因为它具有 canInitWithRequest:
方法的逻辑并且可能无法处理所有请求。
NSArray *currentProtocolClasses = sessionConfiguration.protocolClasses ?: @[];
NSMutableArray *protocolClasses = [NSMutableArray arrayWithArray:currentProtocolClasses];
[protocolClasses insertObject:[CustomURLProtocol class] atIndex:0];
sessionConfiguration.protocolClasses = protocolClasses;
如果文档这么说,那就是一个错误。请提交一份。逻辑实际上比那里描述的要简单得多。基本上 OS 的作用是这样的:
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:
class 方法 return 对请求是 YES 时,才会使用该协议。如果你想让不同的协议处理请求(例如,如果你想定义一个真正使用普通 https 请求的自定义 URL 方案),那么你通常会通过编写重写 URL 并在未安装协议处理程序 class 的新会话中重新发出请求。
或者,您可以在安装了您的处理程序的会话中重新发出请求,只要您以某种方式修改请求,以便您的协议处理程序从其 canInitWithRequest:
中知道 return 否第二次看到请求时的方法。 (否则,你将得到无限递归。)
根据 NSURLSessionConfiguration::protocolClasses
的文档,不保证会使用我自定义的 url 协议。我怎样才能确保,只要我将它设置为 protocolClasses
属性?
Prior to handling a request, an NSURLSession object searches the default protocols first and then checks your custom protocols until it finds one capable of handling the specified request. It uses the protocol whose canInitWithRequest: class method returns YES, indicating that the class is capable of handling the specified request.
我无法使用单个 URL 协议设置数组,因为它具有 canInitWithRequest:
方法的逻辑并且可能无法处理所有请求。
NSArray *currentProtocolClasses = sessionConfiguration.protocolClasses ?: @[];
NSMutableArray *protocolClasses = [NSMutableArray arrayWithArray:currentProtocolClasses];
[protocolClasses insertObject:[CustomURLProtocol class] atIndex:0];
sessionConfiguration.protocolClasses = protocolClasses;
如果文档这么说,那就是一个错误。请提交一份。逻辑实际上比那里描述的要简单得多。基本上 OS 的作用是这样的:
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:
class 方法 return 对请求是 YES 时,才会使用该协议。如果你想让不同的协议处理请求(例如,如果你想定义一个真正使用普通 https 请求的自定义 URL 方案),那么你通常会通过编写重写 URL 并在未安装协议处理程序 class 的新会话中重新发出请求。
或者,您可以在安装了您的处理程序的会话中重新发出请求,只要您以某种方式修改请求,以便您的协议处理程序从其 canInitWithRequest:
中知道 return 否第二次看到请求时的方法。 (否则,你将得到无限递归。)