几天来,我一直在尝试解决以下问题,这让我非常抓狂。
我有一个 (1.2) 流星应用程序,部署在http://some.application.com:3000
. 它工作得很好,并且做了它应该做的事情。该应用程序使用了几个包,我认为与此问题相关的是autoupdate
包accounts
(它加载了自己的一堆东西)。
我们的指令是把这个 web 应用程序变成一个 android 应用程序,我们被告知流星可以“很容易地”做到这一点。从表面上看,这似乎是一个简单的案例meteor run android-device --mobile-server http://some.application.com:3000 --settings settings.json --verbose
,但这并没有达到我的预期。
Meteor 决定10.0.2.2
(无论出于何种原因)进行 DDP 连接,无论我设置什么环境变量,我最终都会遇到相同的情况。
重要的是要注意,该应用程序并未在DDP.connect(url)
任何地方使用该方法 [ docs ] 编写,因此一切都依赖于主要的 DDP 连接(我怀疑这可能是我们问题的更大原因之一)。
作为记录,这是我的启动脚本。我非常绝望并添加了很多很多环境变量,并且没有任何组合的运气。
#!/bin/bash
export AWS_REGION=xxx
export AWS_BUCKET=xxx
export MONGO_URL=mongodb://some.application.com:27017/application
export QUEUE_ADDRESS=http://some.application.com
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxx
export ROOT_URL=http://some.application.com:3000
export DDP_DEFAULT_CONNECTION_URL=http://some.application.com:3000
export MOBILE_DDP_URL=http://some.application.com:3000
export MOBILE_ROOT_URL=http://some.application.com:3000
# Let's go
meteor run android-device --mobile-server http://some.application.com:3000 --settings settings.json --verbose
在本地、移动设备或台式机上运行它(通过localhost:3000
端口转发或任何其他内部 IP ( 10.x.x.x
, 192.x.x.x
) 运行良好。它甚至可以与远程 AWS、Queue 和 DB 一起使用。
根据所有文档,--mobile-server
交换机应该解决问题。它没有。我已经尝试过使用和不使用=
, 用引号括起来的所有可能的定义方式。
查看<head>
我的文档,我看到以下代码被注入
__meteor_runtime_config__ = JSON.parse(decodeURIComponent("%7B%22meteorRelease%22%3A%22METEOR%401.2.0.2%22%2C%22PUBLIC_SETTINGS%22%3A%7B%22verifiedLogin%22%3Afalse%2C%22enableFacebookAuth%22%3Afalse%2C%22enableTwitterAuth%22%3Afalse%2C%22enableGoogleAuth%22%3Afalse%2C%22cdnUrlWithTrailingSlash%22%3A%22http%3A%2F%2Fdev.cdn.some.application.com%2F%22%2C%22ga%22%3A%7B%22id%22%3A%22UA-XXXXXX-1%22%7D%7D%2C%22ROOT_URL%22%3A%22http%3A%2F%2Flocalhost%3A3000%22%2C%22ROOT_URL_PATH_PREFIX%22%3A%22%22%2C%22appId%22%3A%228emj6c37j3fdoz5qmp%22%2C%22accountsConfigCalled%22%3Atrue%2C%22autoupdateVersion%22%3A%222b3acf7aa3ddef802ddf661d3b3986319aad5122%22%2C%22autoupdateVersionRefreshable%22%3A%22b00197cdb5345434d03d9a2503906349ff7854e2%22%2C%22autoupdateVersionCordova%22%3A%223644168d46bc4597d0b2d8c39e366890f6725f52%22%2C%22DDP_DEFAULT_CONNECTION_URL%22%3A%22http%3A%2F%2Flocalhost%3A3000%22%7D"));
if (/Android/i.test(navigator.userAgent)) {
// When Android app is emulated, it cannot connect to localhost,
// instead it should connect to 10.0.2.2
// (unless we're using an http proxy; then it works!)
if (!__meteor_runtime_config__.httpProxyPort) {
__meteor_runtime_config__.ROOT_URL = (__meteor_runtime_config__.ROOT_URL || '').replace(/localhost/i, '10.0.2.2');
__meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL = (__meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL || '').replace(/localhost/i, '10.0.2.2');
}
}
该字符串的 UrlDecoded 版本如下
{
"meteorRelease": "METEOR@1.2.0.2",
"PUBLIC_SETTINGS": {
"verifiedLogin": false,
"enableFacebookAuth": false,
"enableTwitterAuth": false,
"enableGoogleAuth": false,
"cdnUrlWithTrailingSlash": "http://dev.cdn.application.com/",
"ga": {
"id": "UA-XXXXXX-1"
}
},
"ROOT_URL": "http://localhost:3000",
"ROOT_URL_PATH_PREFIX": "",
"appId": "jfdjdjdjdjdjjdjdjdjjd",
"accountsConfigCalled": true,
"autoupdateVersion": "2b3acf7aa3ddef802ddf661d3b3986319aad5122",
"autoupdateVersionRefreshable": "b00197cdb5345434d03d9a2503906349ff7854e2",
"autoupdateVersionCordova": "3644168d46bc4597d0b2d8c39e366890f6725f52",
"DDP_DEFAULT_CONNECTION_URL": "http://localhost:3000"
}
这很奇怪,因为我在任何地方都没有 localhost 条目。
启动应用程序告诉我:App running at: http://site.some.application.com
,但在网络检查器中没有建立连接。
浏览代码告诉我,唯一__meteor_runtime_config__
提到的地方是在autoupdate
包中。
进一步调查将我引向与此修复相关的问题#3815 ,但在我实施它(对自动更新包的更改)之后,我仍然面临同样的问题(尽管热代码修复停止来自我的本地计算机)
更多的调查使我相信远程 DDP 服务器可以像这样更改,但不幸的是,该解决方案不适用于 Cordova。
我尝试了设置HTTP_PROXY
,因为脚本中的“除非我们支持代理”的注释<head>
让我相信这可能是一个快速修复,但我对此没有任何运气。
我尝试删除帐户包,但在这方面没有任何运气。
主要问题是否有任何建议的方法来允许 Cordova 包装的 Meteor 应用程序连接到任意服务器,并允许 DDP 连接到同一服务器?
帐户包是(最有可能)需要的。我认为自动更新并不重要,尽管它们确实有助于不必定期向各种应用商店发布代码。
我尝试过的事情:
- 删除帐户包
- 删除自动更新
- 修改自动更新以指向远程 DDP
- 使用
remote-ddp
包 - 强制
__meteor_runtime_config__
覆盖 - 设置代理
- 环境变量
- 还有其他几千件东西
相关问题(追溯到 2015 年 1 月)是:
- 如何设置 DDP_DEFAULT_CONNECTION_URL?#3852 - 显示连接远程流星服务器的困难,并涉及
autoupdate
包如何影响事物。 - Dont' start local server when using option --mobile-server #3727 - 这显示了
--mobile-server
成为10.0.2.2
- Meteor 移动版本没有改变 DDP_DEFAULT_CONNECTION_URL #4396 - 这显示了一个明显的修复,但这对我根本不起作用
- 能够将替代 DDP 连接传递给 autoupdate #3815 - 这显示了来自官方文档的混淆,并引导我找到
autoupdate
我之前链接的包“修复” - MOBILE_ROOT_URL 和 MOBILE_DDP_URL 在流星构建中被忽略#4581 - 这显示流星构建如何忽略这些环境变量
- Can't build mobile app with different DDP server #4412 - 这表明其他人遇到相同问题有困难,响应要求围绕该问题提供 PR
- Meteor Accounts 仅对 DDP 进行身份验证,而不是 HTTP #3390 - 这表明身份验证
meteor-accounts
只能通过 DDP 而不是 HTTP - 构建的应用程序无法连接到给定的 --server:他们一直无法连接#3698 - 这表明其他用户在 iOS 上遇到了同样的问题,尽管他们报告说连接到本地服务器成功,我也成功了,但是没有提到远程服务器的成功。修复似乎是通过流星部署到,
some-app.meteor.com
但这不是我们的选择。
的内容.meteor/packages
aldeed:autoform@=4.2.2
aldeed:collection2@2.5.0
aldeed:simple-schema@1.3.3
aldeed:tabular@1.4.1
autoupdate@1.2.3
biasport:facebook-sdk@0.2.2
blaze@2.1.3
check@1.0.6
edgee:slingshot@0.7.1
iron:router@1.0.12
jquery@1.11.4
juliancwirko:s-alert@3.1.1
juliancwirko:s-alert-slide@3.1.0
lookback:seo@1.1.0
matteodem:easy-search@1.6.4
meteor@1.1.9
meteorhacks:fast-render@2.10.0
meteorhacks:subs-manager@1.6.2
mobile-experience@1.0.1
momentjs:moment@2.10.6
mquandalle:jade@0.4.4
multiply:iron-router-progress@1.0.2
---
internal packages (one of which includes accounts)
---
reactive-dict@1.1.2
reactive-var@1.0.6
reywood:iron-router-ga@0.7.1
session@1.1.1
standard-minifiers@1.0.1
templating@1.1.4
tracker@1.0.9
underscore@1.0.4
underscorestring:underscore.string@3.2.2
utilities:avatar@0.9.2
versions
如果您觉得有帮助,我可以提供我的文件内容。
TL;DR - 是否有任何建议的方法允许 Cordova 包装的 Meteor 应用程序连接到任意服务器,并允许 DDP 连接到相同的服务器?
任何有关此问题的帮助或指示将不胜感激。请让我知道您是否需要在这方面提供帮助的任何其他信息。
非常感谢