我试图制作一个我的QML应用程序"离线功能" - 这意味着我希望用户能够在未连接到互联网时使用该应用程序。
我看到的主要问题是,我几乎从我的一台HTTP服务器上获取了一个带有用户界面的QML文件,这使我能够轻松地将大部分代码放在触手可及的范围内可更新的。
我的主要QML文件"显然有外部依赖,例如字体(使用FontLoader
),图像(使用Image
)和其他QML组件(使用Loader
)。
AFAIK所有这些资源都是通过Qt网络堆栈加载的,所以我想知道我必须做些什么才能在离线时使所有资源都可用,而不必手动将它们全部下载到设备上。< / p>
是否可以通过在Qt / C ++级别调整现有/实现我自己的缓存来实现这一点,还是我完全走错了路?
谢谢!
答案 0 :(得分:4)
一个简单的解决方案是颠倒方法:在应用程序的可执行文件/包中包含基线文件。首次启动时,将它们复制到应用程序的数据目录中。然后,只要您有权访问服务器,就可以更新数据目录。
数据目录的所有修改都应该是原子的 - 它们必须完全成功或完全失败,而不会使数据目录处于不可用状态。
通常情况下,您需要创建一个新的临时数据文件夹,并在那里复制/硬链接文件,并下载所需的内容,并且只有在所有内容都检出您之后才会交换旧数据目录与新的。
让您的应用程序直接在线访问QML和类似资源几乎是不可能的,除非您坚持明确版本化所有资源并在网址中包含版本号。
假设您的应用程序已启动,并且已加载了一些资源。无法保证用户已进入所有QML屏幕 - 因此只会加载一些资源。 QML也不保证重新加载资源的频率和时间:毕竟,它保留了自己的缓存。有时您会更新服务器上的内容。在您完成更改后,用户会继续探索更多应用程序,但现在他所经历的应用程序是旧版本和新版本的frankenstein,并不能保证这些部分仍然可以协同工作。这是一个坏主意。