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添加到其历史堆栈的唯一方法.
我有一些想法,但我不确定哪些是可行的以及如何解决它们.最主要的似乎是,我必须返回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?
或许我完全走错了轨道?
还有一个我刚刚测试过的非常聪明的方法:NSURLCache只需创建一个自定义NSURLProtocol,NSURLConnection只要发出HTTP请求,标准就会使用该自定义,而不是修改或重写整个导航历史代码.在那里,您可以创建自己NSURLRequest的数据来加载数据,并可以检查MIME类型,更改请求的内容或根据需要将数据缓存到磁盘.这个想法来自Rob Napier:
http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588
他的代码现在也在GitHub上:
https://github.com/rnapier/RNCachingURLProtocol
我建议不要采用上述任何方法。
我让#3 工作了,但它非常非常脆弱并且难以调试。(例如,Apple 销毁并重新创建NSURLRequests,因此您不能只是子类化 NSURLRequest 并期望在后续响应中完成。)
它最终(更)容易地记录我自己的历史记录并记下要加载的页面和滚动位置(垂直屏幕偏移)。
| 归档时间: |
|
| 查看次数: |
14213 次 |
| 最近记录: |