2

我们有一个使用 Dojo 的 PhoneGap 移动项目。在给定的 HTML 页面中,例如 index.html,我们将有一个类似于以下的 JavaScript 标记:

<script>
    require(["path/to/myApp", "dojo/domReady!"], function(MyApp) {
        new MyApp().startup();
    });
</script>

path/to/myApp.js 将是一个执行必要功能的类,例如:

define(["dojo/_base/declare",
    "dojox/mobile/deviceTheme",
    "dojox/mobile/compat"],
    function(declare) {
        return declare(null, {
            startup: function() {
                // create and display views etc.
            }
        });
    });

我们正在尝试按照以下方式实现自动更新功能:

  • 启动时,使用 AJAX 与服务器检查客户端应用程序版本是否是最新的。
  • 如果客户端已过期,请根据需要向客户端发送新的 JavaScript(和/或 HTML、CSS)。
  • 客户端将 JavaScript 存储在设备的本地存储中。

鉴于此方案,在启动时,客户端将从本地存储读取 JavaScript 并执行该代码,替换 path/to/myApp.js。我正在努力将其与 Dojo 的“要求”AMD 功能联系起来。我想我仍然需要使用 Dojo 加载程序来解决依赖关系等。

据我所知,Dojo 加载器使用“require”来定位一个 DOM 节点,然后添加一个“script”标签,最后将 script 标签的“src”属性设置为“path/to/myApp. js”(在本例中)。我需要一种方法来更改此行为,以运行更新后的 JavaScript,该 JavaScript 现在是从设备上的本地存储中获取的。这将使我们能够从服务器自动更新我们的应用程序,而无需重复重新部署到应用程序商店以进行错误修复等小事。

4

1 回答 1

0

有一个 AMD 加载程序可以满足您的需求:

它还包含时间戳功能,您可以在其中将带有当前文件时间戳的 JSON 对象发送到服务器。然后,您需要编写一个返回要更新的文件数组的服务器组件。

wiki的“入门”部分包含一个 Dojo 示例,因此应该可以与 Dojo 一起使用。但是,您将用另一个兼容 AMD 的加载器替换 Dojo 加载器,这可能会导致问题。我的猜测是这不会是一个问题。

这不是更新应用程序的标准方式,为什么不直接使用普通的手机应用程序更新途径呢?这意味着首次使用每个组件都需要 Internet 连接。组件仅在代码需要时才加载。您可能在应用程序的深处隐藏了一个未加载的组件,然后用户突然需要 Internet 连接。

但是,我假设您已经考虑了所有这些事情,并且如果您的应用程序无论如何都需要始终在线的 Internet 连接,那么这将不是问题。

您还为您的应用程序用户引入了额外的安全问题。如果您的服务器被黑客入侵,那么代码可以发送给您的所有用户并在他们的手机上执行。标准的 App Store 更新功能为您的用户增加了另一层安全性(尽管很小)。

于 2013-07-03T08:26:15.940 回答