Meteor“--mobile-settings”被服务器值覆盖?

时间:2015-08-14 09:57:57

标签: javascript mobile meteor

我正在尝试为Meteor 移动应用提供一些按构建配置。 --mobile-settings选项看起来非常适合此任务 - 它允许您在构建时将配置(JSON)传递给移动客户端 - 与--settings选项为服务器执行的方式相同。

但是,我看到了一些意外行为......当客户端从服务器刷新时,通过--mobile-settings传递给移动客户端的任何内容都会被覆盖。

这就是我做的......

  1. 写了一个非常简单的应用程序,它从Meteor.settings.public.blah读取设置值并在屏幕上显示。
  2. 将此应用程序部署到流星服务器(不带任何移动设置文件)。
  3. 为android构建相同的应用程序,指向上面的服务器并设置--mobile-settings选项 - 指向声明'blah'属性的设置文件。将其安装在设备上。
  4. 当我在设备上运行应用程序时,应用程序启动,屏幕正确显示了设置。
  5. 然而,几秒钟后,应用程序刷新,设置消失。
  6. 在刷新时,为什么要从服务器覆盖特定于移动设备的构建时间值?移动设置文件是否也需要存在于服务器上?

    提前致谢。

    更新

    好的,通过下面的讨论,我想我需要澄清一下我的问题......

    我上面描述的是我所看到的行为。但是,我发现这种行为令人困惑,我很难找到有关此功能的任何文档来详细说明预期的行为。

    我能找到的最好的是一个线程,其中一个原始开发者评论过(https://groups.google.com/forum/#!msg/meteor-talk/Jbfnk5kCvW4/6qvccun2dQ0J)。他说......

      

    您只需将两个json传递给--mobile-settings即可构建您的移动应用。

    这似乎不支持我所看到的行为 - json传递给--mobile-settings的地方会被覆盖到服务器的任何内容覆盖。因此我的困惑。

    如果有人能指出我的任何文件或以任何方式确认这种行为,我将不胜感激。

1 个答案:

答案 0 :(得分:8)

简而言之

让我们来看看

meteor build --help

它的内容如下:

--mobile-settings   Set optional data for the initial value of Meteor.settings
                    in your mobile application. A new value for
                    Meteor.settings can be set later by the server as part of
                    hot code push.

因此,您为具有METEOR_SETTINGS环境变量的服务器提供的设置始终优先。 "移动设置"如果还没有服务器设置,则仅作为后备/默认值。

让我们看一下Meteor源代码:)

但是,可能还不清楚为移动设备设置另一个settings对象的目的是什么。我不是Cordova的专家,但我想这里的问题是应用程序如何被引导。

通常,当您从流星服务器请求初始页面时,Meteor.settings对象 - 当然 - 与您的服务器配置保持同步。这由webapp包处理:

https://github.com/meteor/meteor/blob/devel/packages/webapp/webapp_server.js#L352

请注意,在移动设备上安装应用程序时会变得有点复杂。当然,安装过程与您的服务器当前状态无关,因此除非他们在移动构建过程中事先知道,否则无法获取设置的初始值。这是您需要--mobile-settings选项的唯一原因。他们不会改变您对移动设备的设置,而是在热代码推送期间从服务器加载最新的设置对象之前提供初始值。

如果两个设置对象不同,它总是会发生,因为正如您在代码here中看到的那样,PUBLIC_SETTINGS值在计算哈希值时被考虑在内,用于判断是否客户端代码是最新的。

结论

所以结论是:你的移动设置" - 或者至少是它的公共部分 - 应该尽可能地反映当前的服务器配置。每次更改公共设置时,您还应重建移动应用程序并发布更新,以确保新客户拥有开箱即用的最新版本的设置。

理想情况下,客户端应用程序不应依赖Meteor.settings来正确启动。即使对象为空,也应该有一些不会破坏用户体验的默认行为。