Приложение для iOS - на некоторых устройствах сотовый доступ к нашему домену отсутствует. - PullRequest
6 голосов
/ 21 мая 2019

С приложением React Native (проверено только приложения, сгенерированные с create-react-app) у некоторых пользователей iPhone возникает проблема, из-за которой приложение практически никогда не может отправлять веб-запросы нашему API при подключении через сотовые данные.Проблемы с доменом указывают на Amazon Elastic Load Balancer (уровень 7, завершение SSL), который указывает на обратный прокси-сервер Nginx (внутри кластера EKS Kubernetes).Другие API (например, Mapbox), вызываемые приложением, отлично работают с сотовыми данными, включая один из наших, размещенный на выделенном сервере.Единственные запросы, которые не работают, это запросы в нашем домене ELB.Когда пользователь переключается на WiFi, наше приложение может отправлять веб-запросы на этот домен.Это наблюдалось на iPhone 7, iPhone 8 и iPhone X, все под управлением iOS 12.3.1.Одно устройство Verizon, а 5 других - AT & T.Каждый вызов API является HTTPS.Удаление и переустановка приложения и перезапуск устройства не решают проблему.Мы подтвердили во всех случаях, что сотовые данные были включены для приложения в Settings > Cellular > [App name] и в Settings > [App name] > Use Cellular Data.

Приложение построено с использованием React Native, а веб-запросы выполняются с cross-fetch library.

Нам удалось получить устройство, которое имеет проблему, и запустить его через XCode.Вот подмножество стека ошибок, захваченных в Xcode:

nw_connection_copy_connected_local_endpoint [C12] Connection has no local endpoint
2019-06-27 11:26:16.841347-0400 myapp[23700:1527268] [BoringSSL] 
nw_protocol_boringssl_get_output_frames(1301) [C10.1:2][0x117d5a050] get output frames failed, state 8196
2019-06-27 11:26:22.465855-0400 myapp[23700:1527305] [BoringSSL] nw_protocol_boringssl_error(1584) [C20.1:2][0x119b0e420] Lower protocol stack error: 54
2019-06-27 11:26:22.466665-0400 myapp[23700:1527305] TIC TCP Conn Failed [20:0x280022400]: 1:54 Err(54)
2019-06-27 11:26:23.040101-0400 myapp[23700:1527399] Task <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7> HTTP load failed (error code: -1005 [1:54])
2019-06-27 11:26:23.040408-0400 myapp[23700:1527305] Task <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7> finished with error - code: -1005
load failed with error Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={_kCFStreamErrorCodeKey=54, NSUnderlyingError=0x283a521f0 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={NSErrorPeerAddressKey=<CFData 0x28161ab70 [0x1e9e5d420]>{length = 16, capacity = 16, bytes = 0x100201bb3416ca8a0000000000000000}, _kCFStreamErrorCodeKey=54, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7>"
), NSLocalizedDescription=The network connection was lost.

Запросы к этому конкретному [ELB] -> [Контейнер Nginx] -> [Служебные контейнеры] установка иногда будет работатьно тогда остановись.Это почти указывает на ситуацию поддержки активности, такую ​​как эта проблема .У нас было установлено время ожидания простоя ELB по умолчанию (60 с), и мы увеличили его до 300 с без видимого эффекта.Мы попытались установить для keep-alive для Nginx значения 360 и 0 (полностью отключены).

Для данного домена у нас есть набор служб, размещенных в кластере Kubernetes, таких как Java и Node.JS.Эта проблема затрагивает их всех одинаково.

Ни один из пользователей приложения Android не сообщил об этой проблеме.

Все устройства, которые сталкиваются с этой проблемой, делают это последовательно, это не прерывается.

Из-за типа ошибки запросы никогда не доходят до наших журналов Nginx.

1 Ответ

4 голосов
/ 03 июля 2019

К сожалению, мы так и не нашли четкого ответа на проблему, но мы применили обходной путь.

Некоторые телефоны iOS 12.3.1 в сотовых сетях имеют проблему с тем фактом, что Amazon ELB Classic всегда отправляет заголовок ответа «Connection: keep-alive». Вы можете изменить время ожидания простоя балансировщика нагрузки, но не можете установить его на 0 (минимум 1 секунда). Мы можем воспроизвести ошибки подключения iOS с помощью нового приложения, созданного create-react-app. Сначала запросы всегда работают, а затем начинают последовательно терпеть неудачу.

Мы устранили проблему, переключившись с ELB на балансировщик сетевой нагрузки (AWS NLB). NLB общается напрямую с входным контроллером Nginx. Поскольку он находится на уровне TCP, уровень NLB не меняет заголовки. Контроллер Nginx по умолчанию вообще не отправляет заголовок ответа «Соединение». Используя эту новую настройку, приложение iOS прекрасно работает на всех устройствах.

...