【问题标题】:Can you intercept NSURLRequests in a UIWebView without breaking the back button?你能在 UIWebView 中拦截 NSURLRequests 而不会破坏后退按钮吗?
【发布时间】:2011-06-14 06:19:36
【问题描述】:

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

什么有效

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

什么不起作用

上面的效果很好。问题是我想使用 UIWebView's goBack 方法,而 loadRequest: 似乎是唯一添加到其历史堆栈中的 UIWebView 方法。

我有一些想法,但我不确定哪些是可行的以及如何去做。主要的似乎是我必须在webView:shouldStartLoadWithRequest:navigationType中返回YES并且我必须使用UIWebViewloadRequest方法。

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

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

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

或者也许我完全走错了路?

【问题讨论】:

  • 你有没有想出一个好的解决方案?如果是,那是什么?

标签: ios cocoa-touch uiwebview nsurlrequest


【解决方案1】:

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

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

他的代码现在也在 GitHub 上:

https://github.com/rnapier/RNCachingURLProtocol

【讨论】:

  • 感谢您发布这些链接。这绝对是我仍然感兴趣的事情。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    我得到了#3 的工作,但它非常、非常脆弱且难以调试。 (例如,Apple 销毁并重新创建了NSURLRequests,因此您不能只继承 NSURLRequest 并期望在后续响应中通过。)

    我自己的回溯历史和记录要加载的页面和滚动位置(垂直屏幕偏移)最终变得(非常)容易。

    【讨论】:

    • 感谢您的回答。我决定尝试 Ortwin 建议的来自 Cocoa with Love 的本地缓存建议。到目前为止,它似乎在做我需要的事情,而且似乎相当健壮。
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多