【问题标题】:Custom NSURLProtocol added to configuration.protocolClasses prevents working of default url protocols添加到 configuration.protocolClasses 的自定义 NSURLProtocol 阻止了默认 url 协议的工作
【发布时间】:2015-06-04 10:08:08
【问题描述】:

我尝试将自定义 NSURLProtocol 添加到 NSURLSession 以便为某些呼叫提供测试数据,同时为所有其他呼叫提供正常的互联网连接。为此,我需要将NSURLProtocol 添加到会话配置的protocolClasses 中,因为会话驻留在项目中包含的库中。

由于某种原因,当我的自定义协议通过为 canInitWithRequest 调用返回 true 来接收请求时,我的设置确实提供了测试数据,但对于所有其他请求(当它返回 false)时,默认协议仍在我的自定义协议后面的protocolClasses 中获取请求,甚至在canInitWithRequest 调用上返回true但他们从不将请求发送到互联网并在 30 后发送请求超时秒。当我从 protocolClasses 中删除我的自定义协议时,一切正常 - 当然,我的测试数据不再提供。

这是我用来安装协议的代码:

    NSURLSessionConfiguration* sessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    NSMutableArray* protocols = [NSMutableArray arrayWithArray:sessionConfiguration.protocolClasses];
    [protocols insertObject:[MyProtocol class] atIndex:0];
    sessionConfiguration.protocolClasses = protocols;
    mySession = [NSURLSession sessionWithConfiguration:sessionConfiguration];

当我使用 [NSURLProtocol registerClass:[MyProtocol class]] 注册自定义协议时,失败确实有效,但正如所写,我不能在我的项目中使用这种方法。

知道为什么这不能正常工作吗?

【问题讨论】:

    标签: ios nsurlprotocol


    【解决方案1】:

    首先,您的代码 sn-p 中存在打印错误,它应该是 protocols 而不是 array 变量。 ))

    我认为在自定义协议的情况下,查看协议客户端等是有意义的(propertyFoKey: inRequest:) 方法startLoading(或stopLoading)被调用了吗?

    啊,我已经重新阅读了你的问题。

    如果是 [NSURLProtocol registerClass] ,自定义类,如果是最新注册的,将处理 URL 方案。 在您的情况下,似乎有另一个(无效)协议来处理请求。

    【讨论】:

    • 感谢拼写错误提示,已更正。我进入调试器,发现内部类 _NSURLHTTPProtocol 被调用以通过 http 请求,它甚至为 canInitWithRequest 调用返回 true, - 之后它就不再做任何事情了......
    • 将您的协议作为最后一个元素添加到数组中,重建应用程序,应该会有所帮助))
    • 那么默认的http协议首先捕获请求,而我的特定协议没有机会捕获例如“testdata.com”并返回测试数据,因为http协议将尝试处理http地址...
    猜你喜欢
    • 2011-02-18
    • 2012-12-12
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多