【问题标题】:How do I detect an authentication challenge from a UIWebView?如何检测来自 UIWebView 的身份验证质询?
【发布时间】:2013-04-26 14:58:38
【问题描述】:

我看到manyquestions 在事先知道请求需要凭据时询问(并回答)如何提供凭据。

当我加载请求身份验证质询的站点时(以 HTTP 401 响应),我的 UIWebViewDelegate 仅收到以下回调:webView:shouldStartLoadWithRequest:navigationType: 有时 webViewDidStartLoad:(如果我导航,似乎会调用 webViewDidStartLoad:直接到该站点,如果我被重定向到那里,它似乎不会被调用)。

通过覆盖 -[NSObject respondsToSelector:]UIWebViewDelegate 会收到一些对 uiWebView:resource:canAuthenticateAgainstProtectionSpace:forDataSource:uiWebView:resource:didReceiveAuthenticationChallenge:fromDataSource: 的调用,这可能很有用,但当然这些是私有 API,可能会导致我的应用被拒绝。

我已经测试了几个不同的主流应用程序嵌入了UIWebViews。到目前为止,只有 Chrome 能够正确处理这些身份验证挑战。我什至设置了自己的服务器并验证了 Chrome 仅POSTs 一次。 Twitter 和 Tweetbot 失败只是永远显示加载屏幕,就像我的一样。

除了使用第二个推测性NSURLConnection 之外,是否还有另一种(可能非常老套)方法来检测这些身份验证挑战?如果我提出一个POST 请求,那将加倍POST 一切,这很糟糕。

I've added a radar to request an enhancement to UIWebView for this。请复制它。

【问题讨论】:

  • 感谢您提出雷达请求 - 我上当了!

标签: ios uiwebview http-authentication uiwebviewdelegate


【解决方案1】:

Apple now has sample code that solves this problem。它看起来也是关于如何正确实现 NSURLProtocol 的最完整的文档。

【讨论】:

  • 我遇到了这个示例代码的问题。我的 NSURLConnections 之一停止接收回调。但是,这似乎仍然是最好的选择。我已经向 DTS 提交了 TSI,希望 Apple 可以帮助我解决我的问题。
  • 我的问题发生是因为我有另一个 NSURLProtocol 使用 NSURLConnection,它正在拦截 UIWebView 呼叫。与 Apple DTS 通话后,听起来您无法将基于NSURLConnectionNSURLProtocols 与UIWebView 一起使用。苹果的示例代码使用NSURLSession所以没问题。
【解决方案2】:

您可以在自己的NSURLConnection 中加载所有请求,然后将数据作为字符串输入到 web 视图中。这将允许您拦截连接的所有荣耀并仍然获得本机 UIWebView 渲染。我不确定它是否可以很好地在数据到达时将数据流式传输到 Web 视图中,但希望我们在这里没有谈论太多数据。

【讨论】:

  • 谢谢。这就是我现在正在做的事情。
  • 我很想听听,无论是在这里还是在 Twitter 上,它是如何工作的,尤其是如果您尝试增量加载 HTML 字符串。
  • 我不打算进行增量加载。一旦开始,我会尝试写博客。
  • 如果页面执行 XHR 或使用 iframe,则此方法不起作用。我已经重写了系统以使用 NSURLProtocol,它似乎可以处理这种情况。
  • 我刚刚找到了一些解决这个问题的 Apple 示例代码。见stackoverflow.com/a/18965789/9636
猜你喜欢
  • 1970-01-01
  • 2010-12-18
  • 2015-03-30
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
相关资源
最近更新 更多