Ios Swift-WebView HTTP验证-最干净的解决方案
我一直在尝试设置一个web视图包装器应用程序,该应用程序将加载网站的内容(仍将启动)。目前,该网站处于开发模式,并且该网站的唯一端点受http身份验证的保护 我一直在研究这个解决方案: 然而,我不想每次都发出POST请求,但我更希望能够对网站进行一次身份验证并保持连接 我所寻找的是一个干净稳定的解决方案,一个能够让我控制边缘情况的解决方案,比如提供的坏凭证 我不习惯使用NSURLConnection,因为iOS9中不推荐使用该解决方案。我需要一个NSURLSession的解决方案 如果上面链接的解决方案中缺少某些内容,请告诉我。我肯定有人也有这个问题。此外,该网站具有SSL保护Ios Swift-WebView HTTP验证-最干净的解决方案,ios,swift,webview,ios9,nsurlsession,Ios,Swift,Webview,Ios9,Nsurlsession,我一直在尝试设置一个web视图包装器应用程序,该应用程序将加载网站的内容(仍将启动)。目前,该网站处于开发模式,并且该网站的唯一端点受http身份验证的保护 我一直在研究这个解决方案: 然而,我不想每次都发出POST请求,但我更希望能够对网站进行一次身份验证并保持连接 我所寻找的是一个干净稳定的解决方案,一个能够让我控制边缘情况的解决方案,比如提供的坏凭证 我不习惯使用NSURLConnection,因为iOS9中不推荐使用该解决方案。我需要一个NSURLSession的解决方案 如果上面链接的
亲切问候您不需要使用POST、连接或会话。您应该只创建一个可变URL请求并设置一个auth头。然后要求web视图加载请求 来自Wikipedia的授权标题详细信息:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
我不完全确定这是否能以最佳方式满足您的要求,但如果您可以使用
WKWebView
,也许您可以简单地依赖身份验证质询委托方法?请参见我的答案,相关代码片段如下:
func webView(webView: WKWebView, didReceiveAuthenticationChallenge
challenge: NSURLAuthenticationChallenge,
completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
let creds = NSURLCredential(user:"username", password:"password", persistence: NSURLCredentialPersistence.ForSession)
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, creds)
}
我自己还没有尝试过,但文档中说应该在会话中使用凭据,因此链接产生的附加请求应该可以工作。即使没有,也只会导致再次调用该方法,并且您可以再次提供凭据
这只是一个残渣,您必须从警报等获取名称和密码(您还可以更优雅地存储凭据,以使对委托方法的后续调用更优雅)
您还写道您正在使用SSL,因此我认为您熟悉应用程序传输安全标志(因为问题标题中只有“HTTP”而不是“HTTPS”,您可能希望它能够顺利工作,否则请参阅我链接的问题)。好的,这是Swift 3代码
extension MyController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard let u = self.webuser, let p = self.webp else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
let creds = URLCredential.init(user: u, password: p, persistence: .forSession)
completionHandler(.useCredential, creds)
}
}
您的身份验证是如何工作的,能否在请求中提供一个标题?它是UI还是WK web视图?我正在使用UIWebView。从web查看时,身份验证是一个基本的HTTP身份验证弹出窗口。如果您尝试在没有正确凭据的情况下访问,您将获得401授权响应代码/状态。遗憾的是,这似乎只适用于第一个请求。由于缺少授权,web视图中的每个新请求(菜单链接等)都将失败。您确定不需要会话吗?会话不等同于web会话。服务器应该返回一个带有某种身份验证令牌的cookie,并使用它。这将是一个web会话(不是URL会话,这是非常不同的)是的,使用WKWebView可以简化它。在提出这个问题时,我不确定WKWebView是否适合我,但它确实解决了这个问题。这可能是目前最干净的解决方案。很高兴我能帮上忙。还要注意我的“优雅”写作风格:“更优雅地储存……更优雅”。。。幸好你没有用英语征求意见,我显然是个笨蛋……:)注意:这需要对Swift 3(可能还有4)进行大量更新,要捕获此回调,需要设置
.navigationDelegate
,并且需要实现WKNavigationDelegate
(以上代码)。