你能否在不破坏后退按钮的情况下拦截UIWebView中的NSURLRequests?

时间:2011-01-24 02:18:10

标签: ios cocoa-touch uiwebview nsurlrequest

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

什么有用

我正在拦截UIWebView的网址请求,因此我可以加载自定义HTML。我可以控制所有HTML,所以我的特殊应用程序请求使用了我可以在myapp://arg1/?arg2=val中解析的自定义方案(即webView:shouldStartLoadWithRequest:navigationType:)。我决定要加载哪些HTML并致电loadHTMLString:baseURL并返回NO以取消原始请求。

什么行不通

以上作品很棒。问题是我想使用UIWebView's goBack方法,loadRequest:似乎是唯一添加到其历史记录堆栈的UIWebView方法。

我有一些想法,但我不确定哪些是可行的以及如何解决它们。主要的是我必须在YES中返回webView:shouldStartLoadWithRequest:navigationType,我必须使用UIWebView的{​​{1}}方法。

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

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

构思3:欺骗缓存使用此缓存策略loadRequest创建请求,然后以某种方式在HTMLView和缓存之间获取HTML?

或许我完全走错了轨道?

3 个答案:

答案 0 :(得分:7)

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

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

他的代码现在也在GitHub上:

https://github.com/rnapier/RNCachingURLProtocol

答案 1 :(得分:5)

我首先尝试走#3路线。也许对Cocoa with Love的"Substituting local data for remote UIWebView requests"对你很有帮助。

答案 2 :(得分:1)

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

我有#3工作,但它非常,非常脆弱,很难调试。 (例如,Apple会破坏并重新创建NSURLRequests,因此您不能只是继承NSURLRequest并期望在后续响应中完成。)

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