Невозможно заставить Meteor/Cordova использовать удаленный сервер для DDP
Я уже несколько дней пытаюсь решить следующую проблему, и это сводит меня с ума.
У меня есть (1.2) метеорное приложение, развернутое на http://some.application.com:3000
, Он прекрасно работает и делает то, что должен. Приложение использует несколько пакетов, которые, я думаю, связаны с этой проблемой: autoupdate
и accounts
пакет (который загружает свою кучу вещей).
Наша директива - превратить это веб-приложение в приложение для Android, что, как нам сказали, meteor может сделать "довольно легко". На первый взгляд кажется, что это простой случай meteor run android-device --mobile-server http://some.application.com:3000 --settings settings.json --verbose
Однако это не делает то, что я ожидаю.
Метеор решает сделать подключение DDP на 10.0.2.2
(по любой причине), и независимо от того, какие переменные env я установил, я окажусь в одной и той же ситуации.
Важно отметить, что приложение не было написано с использованием DDP.connect(url)
метод в любом месте [ документы], так что все зависит от основного соединения DDP (что, я подозреваю, может быть одной из основных причин нашей проблемы).
Для записи вот мой скрипт запуска. Я впал в отчаяние и добавил много-много разных env-вариаций, и мне не повезло ни с какой их комбинацией.
#!/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, которая связана с этим исправлением, но после того, как я его внедрил (изменения в пакете autoupdate), я все еще столкнулся с той же проблемой (хотя исправления горячего кода перестали поступать с моей локальной машины)
Еще большее расследование привело меня к мысли, что удаленный сервер DDP может быть изменен таким образом, но, к сожалению, это решение не работает с Cordova.
Я пробовал настройки HTTP_PROXY
в качестве комментария "если мы не за прокси" в <head>
скрипт привел меня к мысли, что это может быть быстрым решением, но мне не повезло с этим.
Я попытался удалить пакет учетных записей, но не повезло в этом отношении.
Основной вопрос Есть ли какой-нибудь способ разрешить приложению Meta в оболочке Cordova подключаться к произвольному серверу и разрешить подключение DDP к нему?
Пакет аккаунтов (скорее всего) необходим. Я полагаю, что автоматические обновления не так важны, хотя они помогают с точки зрения отсутствия необходимости регулярно выпускать код в различные магазины приложений.
Вещи, которые я пробовал:
- Удаление пакета аккаунтов
- Удалить автообновления
- Изменение автообновлений для указания на удаленный DDP
- С использованием
remote-ddp
пакет - форсирование
__meteor_runtime_config__
Переопределение - Настройка прокси
- Переменные среды
- И еще несколько тысяч вещей
Связанные проблемы (начиная с января 2015 года):
- Как можно установить DDP_DEFAULT_CONNECTION_URL? # 3852 - Показывает сложность подключения к удаленным метеорологическим серверам и рассказывает о том, как
autoupdate
Пакет влияет на вещи. - Не запускать локальный сервер при использовании опции --mobile-server # 3727 - Это показывает случай
--mobile-server
становление10.0.2.2
- Сборка Meteor Mobile не меняется DDP_DEFAULT_CONNECTION_URL # 4396 - Это показывает очевидное исправление, но это не работает для меня вообще
- Возможность передать альтернативное соединение DDP на автообновление #3815 - Это показывает путаницу, которая исходит из официальной документации, и приводит меня к
autoupdate
пакет "исправить", который я связал ранее - MOBILE_ROOT_URL и MOBILE_DDP_URL игнорируются при сборке метеора #4581 - Это показывает, как сборка метеора игнорирует эти переменные
- Невозможно создать мобильное приложение с другим сервером DDP #4412 - Это показывает, что другие испытывают трудности с той же проблемой, и в ответ на них спрашивают PR по этой проблеме.
- Учетные записи Meteor аутентифицируют только 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. Существует ли какой-либо предлагаемый способ, позволяющий приложению Meteor в Cordova подключаться к произвольному серверу и разрешать подключение DDP к нему?
Любая помощь или указатели по этому вопросу будет высоко ценится. Пожалуйста, дайте мне знать, если есть какая-либо другая информация, которая может вам понадобиться в этом отношении.
Большое спасибо