首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保使用我的自定义URL协议?

如何确保使用我的自定义URL协议?
EN

Stack Overflow用户
提问于 2017-05-22 15:14:50
回答 1查看 778关注 0票数 0

根据NSURLSessionConfiguration::protocolClasses的文档,没有保证将使用我的自定义url协议。当我将它设置为protocolClasses属性时,如何确保它被使用?

在处理请求之前,NSURLSession对象首先搜索默认协议,然后检查自定义协议,直到找到能够处理指定请求的协议为止。它使用canInitWithRequest: class方法返回YES的协议,表示该类能够处理指定的请求。

我不能用单一的URL协议来设置数组,因为它具有canInitWithRequest:方法的逻辑,可能无法处理所有请求。

代码语言:javascript
复制
NSArray *currentProtocolClasses = sessionConfiguration.protocolClasses ?: @[];
NSMutableArray *protocolClasses = [NSMutableArray arrayWithArray:currentProtocolClasses];
[protocolClasses insertObject:[CustomURLProtocol class] atIndex:0];
sessionConfiguration.protocolClasses = protocolClasses;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-23 07:28:30

如果医生这么说,那就是个窃听器。请出示一份。这个逻辑实际上比这里描述的要简单得多。基本上,操作系统所做的是:

代码语言:javascript
复制
NSURLProtocol *protocol = nil;
for (Class protocolClass in sessionConfiguration.protocolClasses) {
    if ([protocolClass canInitWithRequest:request]) {
         protocol = [[protocolClass alloc] init];
    }
}
if (!protocol) {
    fail
}

因此,只要你的协议被列在第一位,它们就会获得优先权。(对于NSURLConnection来说,文档中的那个部分也是错误的;在任何内置协议之前,总是先询问注册协议。)

如果您不需要处理标准协议,那么您就可以这样做了:

代码语言:javascript
复制
sessionConfiguration.protocolClasses = @[[CustomURLProtocol class]];

不能强制使用URL协议。只有当它的canInitWithRequest:类方法为请求返回YES时,协议才会被使用。如果希望生成不同的协议来处理请求(例如,如果要定义真正使用普通https请求的自定义URL方案),则通常需要编写一个协议来重写URL,并在没有安装协议处理程序类的新会话中重新发出请求。

或者,您可以在已安装处理程序的会话中重新发出请求,只要您以某种方式修改请求,以便您的协议处理程序知道当它第二次看到请求时从它的canInitWithRequest:方法返回NO。(否则,您将得到无限递归。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44116531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档