私は数日間、次の問題を解決しようとしてきましたが、完全に頭がおかしくなりました。
にデプロイされた (1.2) meteor アプリケーションがありますhttp://some.application.com:3000
。それはうまく機能し、本来の機能を果たします。このアプリケーションはいくつかのパッケージを使用します。この問題に関連していると思われるのはautoupdate
、accounts
パッケージ (独自の束をロードする) です。
私たちの指示は、この Web アプリを Android アプリに変えることです。これは、Meteor が「非常に簡単に」できると言われていることです。表面上は単純なmeteor run android-device --mobile-server http://some.application.com:3000 --settings settings.json --verbose
.
10.0.2.2
Meteor は(何らかの理由で) DDP 接続を行うことを決定し、設定した環境変数に関係なく、同じ状況になります。
アプリケーションは [ docsDDP.connect(url)
] のどこにもメソッドを使用して作成されていないことに注意することが重要です。そのため、すべてがプライマリ DDP 接続に依存しています (これが問題の大きな原因の 1 つと思われます)。
記録のために、これが私の起動スクリプトです。私はかなり絶望的になり、非常に多くの環境変数を追加しましたが、それらの組み合わせには運がありませんでした。
#!/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、キュー、および 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 接続を同じサーバーに接続できるようにするための推奨される方法はありますか?
accounts パッケージは (ほとんどの場合) 必要です。自動更新はそれほど重要ではないと思いますが、さまざまなアプリストアにコードを定期的にリリースする必要がないという点で役立ちます.
私が試したこと:
- アカウント パッケージの削除
- 自動更新を削除する
- リモート DDP を指すように自動更新を変更する
remote-ddp
パッケージの使用__meteor_runtime_config__
オーバーライドの強制- プロキシの設定
- 環境変数
- そして、他の数千のこと
関連する問題 (2015 年 1 月にさかのぼる) は次のとおりです。
- DDP_DEFAULT_CONNECTION_URL はどのように設定できますか? #3852 - リモート Meteor サーバーへの接続の難しさを示し、
autoupdate
パッケージがどのように影響するかについて触れます。 - オプション --mobile-server #3727 を使用する場合はローカル サーバーを起動しないでください
--mobile-server
-これは、10.0.2.2
- Meteor モバイル ビルドで DDP_DEFAULT_CONNECTION_URL が変更されない#4396 - これは明らかな修正を示していますが、これはまったく機能しません
- 代替の DDP 接続を自動更新に渡す機能#3815 - これは、公式ドキュメントに起因する混乱を示しており、
autoupdate
以前にリンクしたパッケージ「修正」にたどり着きました。 - MOBILE_ROOT_URL と MOBILE_DDP_URL は meteor ビルドでは無視されます #4581 - これは、meteor ビルドがこれらの環境変数を無視する方法を示しています
- Can't build mobile app with different DDP server #4412 - これは、他の人が同じ問題で問題を抱えていることを示しており、応答では問題に関する PR を求めています
- Meteor アカウントは、HTTP ではなく DDP のみを認証します#3390 - これは、 HTTP ではなく
meteor-accounts
DDP 経由でのみ認証が行われることを示しています - ビルドされたアプリは指定された --server に接続できません: 接続に失敗し続けます #3698 - これは、他のユーザーが iOS で同じ問題を抱えていることを示していますが、ローカル サーバーへの接続に成功したと報告していますが、私も成功しています。しかし、リモートサーバーでの成功については言及されていません。修正は meteor を通じて展開されているよう
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 接続を同じサーバーに接続できるようにするための推奨される方法はありますか?
この問題に関するヘルプやポインタをいただければ幸いです。この点に関して他に必要な情報があればお知らせください。
どうもありがとう