我无法在不破坏其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?
或许我完全走错了轨道?
答案 0 :(得分:7)
我刚刚测试了另一种非常聪明的方法:只需创建标准{NSURLCache
使用的自定义NSURLProtocol
,而不是修改NSURLConnection
或重写整个导航历史记录代码。 1}}每当发出HTTP请求时。在那里,您可以创建自己的NSURLRequest
来加载数据,并可以检查MIME类型,更改请求的内容或根据需要将数据缓存到磁盘。这个想法来自Rob Napier:
http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588
他的代码现在也在GitHub上:
答案 1 :(得分:5)
我首先尝试走#3路线。也许对Cocoa with Love的"Substituting local data for remote UIWebView requests"对你很有帮助。
答案 2 :(得分:1)
我建议不要采用任何上述方法。
我有#3工作,但它非常,非常脆弱,很难调试。 (例如,Apple会破坏并重新创建NSURLRequests
,因此您不能只是继承NSURLRequest并期望在后续响应中完成。)
它最终变得更容易回到我自己的历史记录,并注意要加载的页面和滚动位置(垂直屏幕偏移)。