Мое приложение использует OkHttp 3 и Retrofit2 для работы в сети. Он связывается с сервером, который возвращает сеанс после успешного входа в систему. Мне нужно сохранить этот сеанс и прикрепить его к заголовку запроса для всех запросов, которые будут выполняться после входа в систему.
Я использовал для этого Cookie Jar, и он отлично работал на эмуляторе и моем телефоне Samsung, но мой клиент сообщил о проблеме на Huawei P40 Lite. После некоторой проверки журнала на сервере я решил, что сеанс не был отправлен на сервер, и это вызвало проблему проверки.
После этого я использовал отладку Huawei в реальном времени, чтобы протестировать свое приложение на удаленном устройстве Huawei P40, и сообщил, что проблема сохраняется. После некоторой игры с моим приложением и тестирования я пришел к выводу, что OkHttp 3 Cookie Jar и Interceptor, которые я использую для обработки сеанса сохранения и присоединения, вообще не работают на Huawei. Может ли это быть связано с запретом сервисов Google для новейших устройств Huawei, поскольку приложение отлично работает на старых, таких как P30?
Любые советы или решения более чем приветствуются.
Я преодолел это, вручную извлекая сеанс из ответа и прикрепив его к своим вызовам с помощью @Header, но это решение очень нечистое.
Вот мой код для OkHttpClient. Имейте в виду, что он работал, и он все еще отлично работает в производстве более 2 лет на не новейших телефонах Huawei.
return new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory(), loadX509TrustManager(tmf))
.hostnameVerifier(hostnameVerifier)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.cookieJar(new JavaNetCookieJar(cookieManager))
.cache(cache)
.addNetworkInterceptor(logInterceptor)
.build();
ОБНОВЛЕНИЕ
Я ошибался, говоря, что Cookie Jar и Interceptors не работают. У меня был блок try catch с этой строкой: ProviderInstaller.installIfNeeded(context);
, который не удался, потому что для этого требуются службы Google, а в блоке catch я бы повторно запустил OkHttpClient, к которому не прикреплен Cookie Jar.
Я проверил, есть ли аналогичная замена Huawei для: ProviderInstaller.installIfNeeded(context);
, но не нашел. Эта строка используется для обновления любых отсутствующих исправлений поставщика безопасности, если они отсутствовали. Документация Google по указанной строке.