iOS。如何在大*调度中处理URL身份验证挑战

问题描述:

我大量使用Grand Central Dispatch。我现在需要对需要验证的服务器发出URL请求。 iOS方法NSURLConnection是异步的,这使我在使用GCD进行异步任务时变得复杂。据我了解,NSURLConnection确实支持同步模式,但这需要在请求的URL中嵌入用户/密码,这是没有意义的,因为我不知道这一点。我在这里有什么选择?iOS。如何在大*调度中处理URL身份验证挑战

感谢,
道格

+0

这是一个用户发起的行动?如果是这样,无论是同步/异步,为什么不只是解析响应,并且如果是身份验证质询,请向用户提供用户名/密码表单?我认为你需要提供更多的上下文。 –

不幸的是,你唯一的选择是使用异步请求。使用sendSynchronousRequest:returningResponse:error:方法无法处理身份验证挑战。

实际上,同步请求将在失败前检查现有凭证的钥匙串。它将使用默认的凭据(如果存在)。 因此,举例来说,某个地方在你的代码中火再关闭您的网络连接:

NSURLProtectionSpace *protectionSpace = nil; 
NSURLCredential   *credential   = nil; 

// Note that you can't wildcard realm, if your server will present a realm you need that here as well. 
protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:@"foo.com" port:80 protocol:@"http" realm:nil authenticationMethod:NSURLAuthenticationMethodHTTPBasic]; 

// This creates the credential 
credential = [NSURLCredential credentialWithUser:user password:pass persistence:NSURLCredentialPersistencePermanent]; 

// This stores it, in the application keychain. 
[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; 

现在它设置为保护空间缺省凭证和URL装载系统将查找和使用凭证时访问该保护空间。简单!这不会做的一件事是基于SSL的认证 - NSURLAuthenticationMethodClientCertificate和NSURLAuthenticationMethodServerTrust。由于各种原因,在这种情况下,NSURLConnection要求您实施委托来评估服务器和客户端的信任。对于您的基本身份验证问题,使用上面的代码设置。

但要回答有关GCD和NSURLConnection的更大问题,您可以选择。当然,你可以做所有博客文章所说的内容,并在异步块中使用同步请求,这可能对你有用(或爆炸)。您也可以使用较新的方法sendAsynchronousRequest:queue:completionHandler:。这将为您解决很多问题,因为委托回调将在提供的队列上运行。它确实使事情变得更简单!

这也可能是值得一读:Five Reasons Synchronous Networking is Bad eskimo1是值得倾听;)