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

zek*_*kel 13 cocoa-touch uiwebview nsurlrequest ios

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

什么有用

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

什么行不通

以上工作很棒.问题是我想使用该UIWebView's goBack方法,并且loadRequest:似乎是UIWebView添加到其历史堆栈的唯一方法.

我有一些想法,但我不确定哪些是可行的以及如何解决它们.最主要的似乎是,我必须返回YESwebView:shouldStartLoadWithRequest:navigationType,我必须使用UIWebViewloadRequest方法.

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

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

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

或许我完全走错了轨道?

DaG*_*aMs 7

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

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

他的代码现在也在GitHub上:

https://github.com/rnapier/RNCachingURLProtocol


Ort*_*ntz 5

我首先尝试走#3路线.也许在Cocoa with Love上"用本地数据代替远程UIWebView请求"对你有帮助.


zek*_*kel 1

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

我让#3 工作了,但它非常非常脆弱并且难以调试。(例如,Apple 销毁并重新创建NSURLRequests,因此您不能只是子类化 NSURLRequest 并期望在后续响应中完成。)

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