Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-WebView HTTP验证-最干净的解决方案_Ios_Swift_Webview_Ios9_Nsurlsession - Fatal编程技术网

Ios Swift-WebView HTTP验证-最干净的解决方案

Ios Swift-WebView HTTP验证-最干净的解决方案,ios,swift,webview,ios9,nsurlsession,Ios,Swift,Webview,Ios9,Nsurlsession,我一直在尝试设置一个web视图包装器应用程序,该应用程序将加载网站的内容(仍将启动)。目前,该网站处于开发模式,并且该网站的唯一端点受http身份验证的保护 我一直在研究这个解决方案: 然而,我不想每次都发出POST请求,但我更希望能够对网站进行一次身份验证并保持连接 我所寻找的是一个干净稳定的解决方案,一个能够让我控制边缘情况的解决方案,比如提供的坏凭证 我不习惯使用NSURLConnection,因为iOS9中不推荐使用该解决方案。我需要一个NSURLSession的解决方案 如果上面链接的

我一直在尝试设置一个web视图包装器应用程序,该应用程序将加载网站的内容(仍将启动)。目前,该网站处于开发模式,并且该网站的唯一端点受http身份验证的保护

我一直在研究这个解决方案:

然而,我不想每次都发出POST请求,但我更希望能够对网站进行一次身份验证并保持连接

我所寻找的是一个干净稳定的解决方案,一个能够让我控制边缘情况的解决方案,比如提供的坏凭证

我不习惯使用NSURLConnection,因为iOS9中不推荐使用该解决方案。我需要一个NSURLSession的解决方案

如果上面链接的解决方案中缺少某些内容,请告诉我。我肯定有人也有这个问题。此外,该网站具有SSL保护


亲切问候

您不需要使用POST、连接或会话。您应该只创建一个可变URL请求并设置一个auth头。然后要求web视图加载请求

来自Wikipedia的授权标题详细信息:

  • 用户名和密码由一个冒号组合而成
  • 生成的字符串使用Base64的RFC2045-MIME变量进行编码,但不限于76个字符/行
  • 然后将授权方法和空格(即“Basic”)放在编码字符串之前
  • 例如,如果用户代理使用阿拉丁作为用户名,使用OpenSesame作为密码,则该字段的格式如下:

    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
    (以上代码)。