Странное поведение при вызове HTTP, когда гибридное приложение Android запускается из фона - PullRequest
0 голосов
/ 27 марта 2019

Возможно, заголовок вопроса считается недействительным , но мы потратили 4-5 дней на его устранение.Вот контекст:

  1. У нас есть гибридное приложение (Ionic3 + Cordova)
  2. У нас есть оператор телекоммуникационной сети в Европе
  3. Мы предоставили им URLбыть в белом списке, который обогащен заголовком (оператором связи) номера мобильного телефона пользователя при каждом обращении к этому URL, когда пользователь использует мобильную сеть этого оператора
  4. Этот URL должен быть http URL не https
  5. Поэтому мы добавили в нашу кодовую базу угловой HTTP-перехватчик для преобразования https в http только для этого URL-адреса
  6. Мобильное приложение для Android сразу же обращается к этому URL-адресукак приложение запускается

Теперь здесь работает / ожидаемое поведение:

Когда приложение запускается заново (не в фоновом режиме или было убито домашним экраном), приложение переходит на этот URL, и сетевой оператор идентифицирует этот URL, и мы получаем номер мобильного телефона пользователя.

Вот сценарий, который не работает:

Теперь мы нажимаем баНажмите кнопку в Android и выйдите из приложения изящно.Это означает, что приложение Android находится в фоновом режиме и убито.Теперь мы снова запускаем приложение из значка приложения, и это обогащение заголовка не работает.

Теперь мы добавили различные журналы уровня TCP, используя команду tcpflow:

sudo tcpflow -i eth0 port 443 -C -e http
sudo tcpflow -i eth0 port 80 -C -e http

И мыопределили, что всякий раз, когда приложение перезапускается из фона (следовательно, происходит переход по этому URL-адресу), весь запрос шифруется , но получаемым URL-адресом является http-URL , а порт - 443.

Мы добавили различные журналы в наш http-перехватчик и в телефон Android, но мы не можем определить основную причину.Может ли кто-нибудь указать другое направление для поиска проблемы.

Редактировать 1:

  1. Протестировано на 5 разных устройствах с разными ОС Android и производителем устройства
  2. Android-приложение представляет собой релиз build

1 Ответ

1 голос
/ 30 марта 2019

После очередного исследования на весь день я смог выяснить причину этой проблемы.

Здесь я получил проблему, следуя подсказкам (на случай, если кто-то получит от нее помощь):

  1. Я узнал о типе Android-приложения launchMode
  2. Я смотрел Googling с Android launchMode и этим http-шифрованием
  3. Я попал в пост в блоге, читая Android O, чтобы застраховать страховку откат версии TLS
  4. Я погуглил больше о Откат версии TLS
  5. Гугление разных ключевых слов привело меня к Изменениям в поведении Android 8.0 , где я прочитал о Сетях и соединениях HTTP (S) , где я увидел новую концепцию (для меня), то есть пересмотр TLS ,
  6. Я начал читать о пересмотре TLS и начал связывать его с Nginx, и это журналы изменений, поэтому я понял, что это что-то связанное с Nginx и HTTP-связью.
  7. До этого момента я смотрел только на блок HTTP в конфигурации сервера Nginx, но я посмотрел на блок HTTPs в Nginx и увидел неясную (для меня) конфигурацию заголовка Strict-Transport-Security, которая была установлена ​​на max-age=31536000 always
  8. Я обкопал эту конфигурацию заголовка, и сразу же выяснилось, что это не проблема, это поведение по умолчанию, когда браузер видит успешный запрос HTTP и видит этот заголовок, следующий не HTTP по умолчанию запрос выполняется с помощью HTTP, и это была проблема, с которой мы столкнулись.

Я удалил заголовок (сначала уменьшил его значение до 10 миллисекунд, чтобы браузеры могли вступить в силу) и протестировал мое приложение по тому же сценарию, все начало работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...