如何防止 Meteor/Cordova 应用程序连接到 10.0.2.2? (为什么应用程序会连接到那里?)

How to prevent a Meteor/Cordova App from connecting to 10.0.2.2? (And why does the app connect there?)

我有一个 Meteor 应用程序,它 运行 在本地服务器上用于开发 (http://10.0.2.10:3000)。 ROOT_URL 设置正确,因此 __meteor_runtime_config__.ROOT_URL 等于此 URL。当然,该应用程序在 10.0.2.0/24 内的客户端计算机上的浏览器中运行良好。该应用程序在我的 android 单元格 phone 上的移动设备 chrome/firefox 上也运行良好,该单元格也是 10.0.2.0/24 的一部分。但是,当我尝试 运行 它作为此单元格 phone 上的应用程序和 meteor run android-device --mobile-server http://10.0.2.10:3000/ 时,发生了一些奇怪的事情:

当应用程序第一次启动时(或者在我清除所有应用程序数据后第一次启动),它会像它应该的那样工作(加载数据库中的内容)几秒钟。然后应用程序重新加载,不再加载来自数据库的任何远程内容。我添加了以下函数来查看 Meteor 尝试连接到的位置:

Meteor.startup(function(){
    console.log(__meteor_runtime_config__.ROOT_URL);
})

第一次加载远程内容时 returns http://10.0.2.10:3000/ like I would expect. The second time when remote content isn't loaded it returns http://10.0.2.2:3000/.

现在的问题是,为什么 Meteor/Cordova 这样做,我怎样才能阻止这种行为?因为显然我不能以这种方式测试应用程序。我还不确定当我有 FQDN 和 HTTPS 代理时它是否可以在生产中工作,但这超出了重点。

我试图找到 10.0.2.2,因为我的 LAN 中没有任何东西 运行ning 在那里,我没有在任何地方指定这个 IP 并在 /cordova-build/www/application/index.html 中找到它,它似乎是从 boilerplate_web.cordova.html(见此 link https://searchcode.com/codesearch/view/91819963/)。然而,Meteor 提供了用文件夹 cordova-build-override 覆盖这些生成的文件的可能性,所以我确实删除了整个

if (/Android/i.test(navigator.userAgent)) {
    //[...]
}

块并添加了一个简短的 console.log('removed')。这被调用,所以我知道覆盖成功,当我 grep 遍历整个构建的 .apk 文件时,10.0.2.2 不再找到 - 行为仍然相同。

知道发生了什么事以及该怎么做吗?

因此,即使您正确设置了 ROOT_URL,它的移动版本仍然有一些特殊变量未设置,并且可能包含 localhost。在 meteor 项目中似乎存在更多的代码片段,当 Cordova 客户端连接时,除了我上面提到的那个,用 10.0.2.2 替换 localhost 。所以这似乎导致我的应用程序重新连接到 10.0.2.2。

我能找到的移动 URL 变量是 process.env.MOBILE_ROOT_URLprocess.env.MOBILE_DDP_URL。因此,在 Meteor.startup() 函数中,我现在在服务器端将它们设置为我的真实 ROOT_URL。我的 Android (Cordova) 应用程序在首次启动后几秒钟后仍在重新连接,但它正在重新连接到同一(和真实)服务器 URL(因此一切正常)!

我仍然不知道为什么它的重新连接和那些移动变量及其使用似乎没有很好的记录(或者我错过了一些东西)但我可以接受现在的工作方式。