2

我们的 iOS 应用程序使用自定义协议 (NSURLProtocol) 来直接管理加载 UIWebview 所需的某些数据。这在 iOS 9 和 XCode 7 之前一直很好。

现在,由于主站点是使用 HTTPS 加载的,所以 UIWebview 在引用自定义协议资源时会抛出错误,因为它认为它不安全(实际上并非如此,我们使用 SSL 加载它,而不是 https://)。该应用程序已经使用“允许任意加载”构建,因为我们还有其他一些需要这样做的东西,我原以为它继承了 NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads,这似乎正在与之抗衡,但谁知道呢。

有什么方法可以让 iOS 9 相信我们的自定义协议可以从 HTTPS 访问?注意 - 我们不在 UIWebview 中使用 iframe 或类似的东西 - 这些资源是使用 Ajax/XHR 请求的,并且应用程序的 NSURLProtocol 被调用并接管加载数据并返回响应。

自定义方案也列在 URL 类型中,但这似乎并没有改变任何行为(进出,同样的错误)。这是具体的错误:

[阻止] https://example.com/path/redacted的页面不允许显示来自 mycustomprotocol://different.example.com/path/redacted 的不安全内容。

编辑: 下载 Xcode 6.4,重建应用程序,它似乎在 iOS 9.x 上运行良好,自定义协议没有问题。显然,这不是一个长期的解决方案。希望有人仍然对如何在 Xcode 7+ 中解决问题有所了解。

4

1 回答 1

1

我怀疑,问题在于 https 提供的网页通常不允许包含从其方案不在已知安全方案的特定列表中的任何 URL 加载的资源(至少在较新的浏览器中)。

解决此问题的最佳方法是将资源 URL 重写为以 https: 开头,并使它们都位于您拥有的特定子域中,并永久禁止对该子域的任何实际 Web 使用,然后使用它来确定您的URL 协议应该处理 URL,而不是使用 URL 方案。

话虽如此,提交一个错误并要求一个 API 将您的自定义协议列入 UIWebView 和 WKWebView 中的“潜在安全”白名单。在这种情况下,这样做是合理的。

有关混合内容的更多信息,请参阅http://www.w3.org/TR/mixed-content/

于 2016-05-08T02:59:35.790 回答