如何像FT网页应用程序一样,在iPad上请求增加HTML5本地存储大小?

31

如果您打开http://app.ft.com(《金融时报》移动网络应用程序),会提示您将该应用添加到“主屏幕”。

在完成此操作后,当您打开应用程序时,会再次提示您允许将本地存储数据库大小增加到50MB。

  • 如何实现这个功能?是否需要使用JavaScript API调用或授权等?
  • 这只适用于iPad(iOS)吗?还是其他Webkit浏览器也可以?

7
不要混淆本地存储(键值存储,5MB硬限制)和本地数据库存储(SQLite,5MB并且可以通过正确的技巧增长到50MB)。 - ohadpr
5个回答

37

我恰好对此有所了解 ;)

没有API可以请求增加现有数据库的存储大小。有一种强制增加的方法:将数据写入数据库中,使其变为需要增加的大小,从而提示用户。然而,这样做会很慢,并且无法告诉当前分配的空间大小,因此不建议采用。

Black Frog部分内容是正确的:唯一明智的方式是在打开时请求一个非常大的数据库,例如:

openDatabase('databaseName', '1.0', 'My Database', 50*1024*1024, …

……来请求50MB的空间。

然而,当用户首次访问网站时,您可能不想立即提示他们有50MB的限制;因此,您可能认为可以先请求5MB,然后稍后再以50MB重新打开?不幸的是,这样做行不通——第二次打开尝试使用更多空间的操作会在不提示大小增加且实际上也未增加可用空间的情况下静默成功。

因此,FT应用程序从一个5MB的“预览”数据库开始,以便用户在第一次加载时不被提示。它尽量不超过这个5MB的限制,因为分配的任何空间都必须在所有数据库之间共享。

如果用户选择允许存储更多内容,则该应用程序会尝试使用不同名称打开一个具有40MB空间的数据库(要求用户批准50MB)。这将在该数据库中提供40MB的空间,在原始预览数据库中提供5MB的空间,因此在插入行时两者都不应失败——因为目前iOS上的总限制为50MB。

所有浏览器当前处理数据库空间限制的方式都不同,因此如果您计划跨平台,请小心测试。桌面版Safari处理得非常好,允许更大的空间; Chrome根本不允许任何增加;等等。预计所有“HTML5”实现都会以奇怪的方式有所不同 :)


我问了一个关于FT应用程序的问题,能否评论一下?谢谢。 - PaulM
@Rowan,你知道50Mb限制是针对域名、设备还是浏览器的吗?我需要在客户端数据库中存储600Mb的视频,所以正在研究通过导航到不同的域来存储每个50Mb的视频的解决方法。 - Christopher Grigg
@ChristopherGrigg 这是领域特定的,人们已经使用了一些技巧来分片数据。在浏览器中,您可能会针对每个子域名收到提示...?但是,自iOS 7以来,如果您让他们在使用之前将页面保存到主屏幕上,我认为限制已被取消(至少对于WebSQL)...请尝试访问http://demo.agektmr.com/storage/进行测试,并告诉我们结果 :) - Rowan
@Rowan 谢谢您的信息,我的测试表明它确实是特定于域的,一旦用户被问及有关内存限制的问题,它就再也不会再次询问。截至目前,我尚未成功地超过50Mb,似乎非常受限制,但我正在使用PouchDB而不是直接使用WEB SQL。 - Christopher Grigg
@Rowan,这不是 Chrome 的 bug 吗?因此在将来行为肯定会发生改变。 - Pacerier

7
这个数据库是Web SQL Database API的一部分,它不是HTML5的一部分。使用以下方法设置您的数据库大小。
function prepareDatabase(ready, error) {
    return openDatabase('documents', '1.0', 'Offline document storage', 50*1024*1024, function (db) {
        db.changeVersion('', '1.0', function (t) {
            t.executeSql('CREATE TABLE docids (id, name)');
        }, error);
    });
}

HTML5 Doctor介绍Web SQL数据库,对如何使用这些内容进行了非常快速的教程。


2
Web SQL已经死了吗?您链接的页面上说:“请注意,自11月18日起,W3C不再积极开发Web SQL数据库规范。” - Pacerier
2
这篇回答是在2011年发布的:P,所以不要指望它仍然正确。 - ncubica

1
我刚刚在我的iPad 2(iOS 5.1.1)上使用离线应用程序进行了测试,我们不需要在应用程序内执行任何特定操作。例如,我的应用程序有约18 MB的离线数据。当浏览器访问URL时,浏览器弹出消息请求将大小增加到25 MB,我接受了它,一切都很好。谢谢。

0

这是与浏览器相关的。大多数浏览器将其设置为5MB,有些可以通过某个设置选项来增加它。但不是所有的浏览器都提供此功能。


-1

哦,Dive into HTML5说截至2011年2月,没有浏览器支持此功能,所以我猜这可能是iOS 4.3的事情?(iOS 4.3于2011年3月发布。)

我在快速谷歌搜索中找不到任何相关参考。苹果自己的开发者文档可能会提到它 - 我不确定非SDK订阅者是否可以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接