【问题标题】:Pre-populate HTML5 offline appcache for a UIWebView in an iOS application为 iOS 应用程序中的 UIWebView 预填充 HTML5 离线应用缓存
【发布时间】:2011-12-28 21:56:04
【问题描述】:

是否可以创建一个预填充 HTML5 离线应用缓存的 UIWebView,以便即使用户第一次访问 UIWebView 也可以离线工作?

如果有,怎么做?

我知道我可以通过其他机制实现这一点,但以上是我的首选。我只是很好奇这是否可能。

我在文档中没有看到任何相关内容。

【问题讨论】:

  • 如果我错了,请纠正我,但我相信您可以从应用程序的文档目录中打开 UIWebView 中的本地文件。
  • 你没有看错,但正如我在问题中所写,“我知道我可以通过其他机制实现这一点,但以上是我的首选。”
  • 这是一个很酷的问题。考虑只查看开发人员参考中提供的内容,否则苹果会拒绝您的应用程序。您可以考虑在隐藏视图中“强制加载”任何您想要的东西来预热缓存。这样,您可以将元素添加到缓存中,但除非您知道内部缓存算法,否则您无权从缓存中删除项目...我想说这不是黑客,而是更多一种技术!
  • @vinnybad:我不完全确定您所说的“强制加载”是什么意思。你能详细说明一下吗? (听起来可能值得加入答案而不是评论!)
  • 好的,我现在正在添加回复...

标签: ios html uiwebview application-cache html5-appcache


【解决方案1】:

我认为这可能会归结为您是否可以通过编程方式写入 UIWebView 的缓存文件(也就是说,UIWebView 缓存是否驻留在应用程序的沙箱中)的问题——如果您不能,那么游戏结束。如果您可以,那么问题就在于,在您将预填充的缓存文件放到适当位置后会发生什么,以及 UIWebView 是否“上当”认为它已经下载并缓存了您的 HTML5 内容.

如果您使用 iPhone 模拟器测试您的应用,请查看 ~/Library/Application Support/iPhone Simulator/5.0/Applications(如有必要,请将“5.0”替换为您的 iOS 版本)。你应该会看到你在模拟器中编译的每个应用程序的一长串十六进制数字;找到与您的应用对应的应用,然后在 Library/Caches/[your app's identifier] 子文件夹中查找名为 Cache.db 的文件。

这个可能是 UIWebView 存储其缓存数据的地方。如果不是,游戏结束,你的问题的答案是“不,那是不可能的”。如果它 UIWebView 缓存数据的地方,那么它可能可以在模拟器中填充这个Cache.db 文件,获取该文件,将其存储在您的应用程序包中,然后然后在需要预填充缓存时将缓存写入适当的位置。

无论如何,这就是我用来确定它是否可能的攻击路线——我非常有信心答案将是“不,不可能”,除非 UIWebView 缓存确实如此 驻留在应用程序的沙箱中,可由您写入,您可以通过替换其缓存文件来欺骗 UIWebView。

【讨论】:

  • 我不得不使用您的回答和 Deniz Mert Edincik 的回答中的信息来实现这一点。我希望我可以将赏金分成 50/50。我最终可能会抛硬币。谢谢!
  • 好吧,我已经完成了大部分工作,能够将 appcache 文件复制到正确的位置,但是应用程序不使用它。无论如何,这可能都是一个坏主意。正如@vinnybad 指出的那样,Apple 很可能会拒绝执行此类恶作剧的应用程序。但这非常有趣(无论如何对我来说)并且内容丰富。感谢您的信息!
  • @Trott 根据 Apple 开发者协议第 3.3.2 节,我们可以通过内置的 Webkit 框架下载解释代码来更新混合 iOS 应用程序,只要该应用程序与其保持一致即可。原始广告目的。我想用我自己的应用程序开始这样做,但我不确定如何处理预填充 UIWebView 缓存,以便可以从 iOS App Store 下载应用程序,然后立即离线使用。你是怎么解决这个问题的?
【解决方案2】:

您要查找的是缓存文件夹中的两个文件。

ApplicationCache.dbcache.db

它们都位于您的应用程序的 Library/Caches/[your bundle identifier] 文件夹中,您可以完全访问该文件夹。您可以将预填充的缓存数据添加到您的捆绑包中,并在应用启动时将其复制到缓存文件夹。

顺便说一句,您可以轻松地使用它们,因为它们很简单,SQLITE db。

希望对你有帮助

【讨论】:

  • 我不得不使用您的回答和 Scott Forbes 的回答中的信息来实现这一点。我希望我可以将赏金分成 50/50。我最终可能会抛硬币。谢谢!
  • 无赖,它让我复制文件,然后不使用它。呃,好吧。这无疑是一个有趣的实验。
【解决方案3】:

我所说的强制加载的意思是:如果访问了一个网页,则缓存元素以便下次加载更快。我的意思是强制加载或预热缓存实际上是在后台向 uiwebview 发出请求以将数据加载到缓存中以加快加载速度,因此当用户实际单击它时,它会在缓存中包含信息。

如果您使用 chrome,这类似于他们用来加快冲浪速度的策略:当页面加载时,他们会立即找到页面上的所有链接并解析链接,因此如果用户点击链接,他们不会在看到页面之前不必等待来自 DNS 服务器的响应,因为它已经为它们完成了!

我希望这更有意义。

引用:

这是一个很酷的问题。考虑只查看开发人员参考中提供的内容,否则苹果会拒绝您的应用程序。您可以考虑在隐藏视图中“强制加载”任何您想要的东西来预热缓存。这样,您可以将元素添加到缓存中,但除非您知道内部缓存算法,否则您无权从缓存中删除项目...我想说这不是黑客,而是更多一种技术! – 温尼巴德 11 月 23 日 17:26

@vinnybad:我不完全确定您所说的“强制加载”是什么意思。你能详细说明一下吗? (听起来可能值得给出答案而不是评论!) - Trott 11 月 23 日 17:40

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2011-07-31
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多