【问题标题】:Auth challenge for NSURLSession not working with Custom protocolNSURLSession 的身份验证挑战不适用于自定义协议
【发布时间】:2016-09-06 09:40:55
【问题描述】:

我已经使用会话委托实现了自定义协议,如下所示 -

- (void)startLoading {
NSMutableURLRequest *mReq = [self.request mutableCopy];
NSURL *url = [[self request] URL];

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

...
...

if(!_mySession) {
    _mySession = [NSURLSession sessionWithConfiguration:config
                              delegate:self
                         delegateQueue:[NSOperationQueue mainQueue]];
}
.....
}

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge


completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler{

NSURLAuthenticationChallenge* challengeWrapper = [[NSURLAuthenticationChallenge alloc] initWithAuthenticationChallenge:challenge sender:[[CustomAuthChallengeWrappers alloc] initWithSessionCompletionHandler:completionHandler]];

    if(self.client){
            if([self.client respondsToSelector:@selector(URLProtocol:didReceiveAuthenticationChallenge:)]) {
                 debugLog("auth-challenge");
                 [self.client URLProtocol:self didReceiveAuthenticationChallenge:challengeWrapper];
            }
    }
}

如果客户端使用 NSURLConnection,它工作正常。如果我在客户端使用 NSURLSession,它会转发 Auth 质询,但不会在自定义协议中接收回来。 挑战包装器是按照此链接实现的: NSURLProtocol Challenge wrapper

我是否缺少 NSURLSession 的任何内容?

【问题讨论】:

  • 您没有处理挑战发送者不响应该选择器或 self.client 为 nil 的情况,但这可能不是问题。这个包装器似乎是一种奇怪的方式。通常,您的 NSURLProtocol 将是挑战发送者,而不是一些任意的“包装”类。通常你会在你的协议中实现这些方法。我怀疑这是问题的原因,但它可能使调试更具挑战性(双关语)。
  • 最可能的问题是另一个NSURLSession 正在做一些奇怪的事情,比如没有正确响应挑战,但我必须查看其他代码才能确定。您还应该检查以确保您没有陷入协议处理的无限递归 - 确保您的协议正确拒绝以前看到的任何请求,例如通过设置自定义标题或使用[NSURLProtocol setProperty:forKey:inRequest:]
  • 另一个与 NSURLProtocol 质询发送者有关的问题无法按预期工作。它转发给客户端,但客户端直接访问服务器而不是 NSURLProtocol。服务器拒绝它,因为它来自不同的路径。除了包装器之外别无选择。我也没有遇到无限递归。相同的代码与客户端的 NSURLConnection 完美配合。
  • 我不知道为什么在使用该包装类和传递 self 作为发送者和在你的协议类中实现这些相同的方法(这是预期的用途)之间会有什么区别。 .. 当您说客户端命中服务器时,您是什么意思?您的意思是客户端回调数据以某种方式直接发送到 nsurlsessiond?

标签: ios objective-c nsurlsession nsurlprotocol


【解决方案1】:

仅更新它就可以在 iOS 10 和 xcode 8 beta 版本中正常工作。 iOS 9.3 中似乎存在一些问题,此版本已修复。

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2012-10-14
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多