13

我无法在UIWebView不破坏其goBack方法的情况下将自定义 HTML 加载到我的中。

什么有效

我正在拦截我的 URL 请求,UIWebView以便加载自定义 HTML。我可以控制所有 HTML,因此我的特殊应用程序请求使用myapp://arg1/?arg2=val我可以解析的自定义方案(即webView:shouldStartLoadWithRequest:navigationType:. 我决定我真正想要加载和调用的 HTML,loadHTMLString:baseURL然后返回NO以取消原始请求。

什么不起作用

上面的效果很好。问题是我想使用该UIWebView's goBack方法,并且loadRequest:似乎是唯一UIWebView添加到其历史堆栈的方法。

我有一些想法,但我不确定哪些是可行的以及如何去做。主要的事情似乎是我必须返回YES并且webView:shouldStartLoadWithRequest:navigationType我必须使用UIWebView'loadRequest方法。

想法 1:修改 NSURLRequest/Response: 我可以继承 NSURLRequest 以便(当 UIWebView 发出请求时)它实际上不会发出 HTTP 请求并返回一个带有我的 HTML 的 NSURLResponse?或者也许修改/子类/添加一个类别方法到 NSURLResponse 不知何故?我喜欢它是一个真实请求的想法,但我担心私有 API 并被 App Store 拒绝。

想法 2:处理自定义 URL 协议 注册自定义 URL 协议,以便我的应用程序响应它,我可以让它返回一个合法的 NSURLResponse(填充我的自定义 HTML。)

想法 3:愚弄缓存使用此缓存策略创建请求,NSURLRequestReturnCacheDataDontLoad然后以某种方式在 webView 和缓存之间获取我的 HTML?

或者也许我完全走错了路?

4

3 回答 3

7

我刚刚测试了另一种非常聪明的方法:与其修补NSURLCache或重写整个导航历史代码,只需创建一个自定义,只要发出 HTTP 请求NSURLProtocol,标准就会使用它。NSURLConnection在那里,您可以创建自己NSURLRequest的数据来加载数据,并可以检查 MIME 类型、更改请求的内容或将数据缓存到磁盘上。这个想法来自 Rob Napier:

http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588

他的代码现在也在 GitHub 上:

https://github.com/rnapier/RNCachingURLProtocol

于 2012-07-11T11:22:46.103 回答
5

I'd first try to go route #3. Maybe "Substituting local data for remote UIWebView requests" on Cocoa with Love is helpful for you.

于 2011-01-31T11:06:45.800 回答
1

我建议不要使用上述任何方法。

我得到了#3 的工作,但它非常非常脆弱且难以调试。(例如,Apple 销毁并重新创建NSURLRequests,因此您不能只继承 NSURLRequest 并期望在后续响应中通过。)

它最终使我自己的历史记录变得(更)容易,并注意要加载的页面和滚动位置(垂直屏幕偏移)。

于 2011-11-23T18:31:16.423 回答