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 次 |
最近记录: |