【发布时间】: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