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

Jey*_*ork 5 cordova meteor ddp

我有一个Meteor应用程序,它在本地服务器上运行以进行开发(http://10.0.2.10:3000).该ROOT_URL设置正确,以便__meteor_runtime_config__.ROOT_URL等于这个网址.当然,该应用程序在10.0.2.0/24内的客户端计算机上的浏览器中运行良好.该应用程序也在我的Android手机上的移动chrome/firefox上工作正常,这也是10.0.2.0/24的一部分.然而,当我尝试在这款手机上运行它meteor run android-device --mobile-server http://10.0.2.10:3000/时会出现奇怪的事情:

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

Meteor.startup(function(){
    console.log(__meteor_runtime_config__.ROOT_URL);
})
Run Code Online (Sandbox Code Playgroud)

第一次加载远程内容时,它会像我期望的那样返回http://10.0.2.10:3000/.第二次没有加载远程内容时,它返回http://10.0.2.2:3000/.

现在的问题是,为什么Meteor/Cordova这样做,我该如何阻止这种行为呢?因为显然我无法以这种方式测试应用程序.当我有一个FQDN和HTTPS代理时,我还不确定它是否可以在生产中工作,但这已经超出了这一点.

我试图找到10.0.2.2,因为我的局域网中没有任何东西在那里运行,我没有在任何地方指定这个IP,并且发现它/cordova-build/www/application/index.html似乎是从中生成的boilerplate_web.cordova.html(请参阅此链接https://searchcode.com/codesearch/view/91819963 /).但是,Meteor提供了使用文件夹覆盖这些生成的文件的可能性cordova-build-override,因此我删除了整个文件

if (/Android/i.test(navigator.userAgent)) {
    //[...]
}
Run Code Online (Sandbox Code Playgroud)

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

有什么想法正在发生什么,怎么做?

Jey*_*ork 4

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

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

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