可以使用缓存使QML应用程序“离线支持”

Possible to make QML application "offline capable" using caches?

本文关键字:离线 支持 离线支持 应用程序 缓存 QML 可以使      更新时间:2023-10-16

我正在尝试使我的一个QML应用程序"离线" - 这意味着我希望用户能够在未连接到互联网时使用该应用程序。

看到的主要问题是,我几乎是从我的一个HTTP服务器中提取一个带有UI的QML文件,这使我能够将大部分代码保持在可访问范围内并易于更新。

我的"主QML文件"显然具有外部依赖关系,例如字体(使用FontLoader(,图像(使用Image(和其他QML组件(使用Loader(。

AFAIK所有这些资源都是通过Qt网络堆栈加载的,所以我想知道我必须做些什么才能使所有资源在离线时可用,而无需手动将它们全部下载到设备上。

是否可以通过在Qt/C++级别调整现有/实现自己的缓存来做到这一点,还是我完全走错了轨道?

谢谢!

一个简单的解决方案是反转该方法:在应用程序的可执行文件/捆绑包中包含基线文件。首次启动时,将它们复制到应用程序的数据目录。然后,只要您有权访问服务器,就可以更新数据目录。

数据目录的所有修改都应该是原子的 - 它们必须完全成功或完全失败,而不会使数据目录处于不可用状态。

通常,您会创建一个新的临时数据文件夹,并复制/硬链接其中的文件,并下载所需的文件,并且只有在所有内容都签出后,您才会将旧数据目录与新数据目录交换。

让你的应用程序直接在线访问QML和类似资源几乎是不可能的,除非你坚持显式地对所有资源进行版本控制并在URL中包含版本号。

假设您的应用程序已启动,并且已加载一些资源。不能保证用户已转到所有QML屏幕 - 因此只会加载一些资源。QML也不保证资源重新加载的频率和时间:毕竟,它维护自己的缓存。有时,您会更新服务器上的内容。完成更改后,用户继续探索应用程序的更多内容,但现在他体验的应用程序是新旧部分的弗兰肯斯坦,无法保证这些部分仍然可以协同工作。这是个坏主意。