【发布时间】:2021-01-01 23:39:02
【问题描述】:
我的应用正在使用 OkHttp 3 和 Retrofit2 进行网络连接。它与服务器通信,成功登录后返回会话。我需要保存此会话并将其附加到登录后将执行的所有请求的请求标头。
我为此使用了 Cookie Jar,它在模拟器和我的三星手机上运行良好,但我的客户在华为 P40 Lite 上报告了问题。在服务器上进行了一些日志检查后,我发现会话没有发送到服务器并导致验证问题。
之后,我使用华为实时调试在远程华为 P40 设备上测试我的应用程序并报告问题仍然存在。在玩了我的应用程序和测试之后,我得出结论,我用来处理保存和附加会话的 OkHttp 3 Cookie Jar 和拦截器在华为上根本不起作用。这是否与最新的华为设备的谷歌服务禁令有关,因为应用程序在 P30 等旧设备上运行良好?
欢迎提供任何提示或解决方案。
我已经通过手动从响应中提取会话并使用@Header 将其附加到我的调用来克服这个问题,但是这个解决方案非常不干净。
这是我的 OkHttpClient 代码。请记住,它在非最新的华为手机上运行了 2 年多,并且在生产中仍然可以正常工作。
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 和拦截器无法正常工作。我尝试了这条线的 catch 块:ProviderInstaller.installIfNeeded(context); 这会失败,因为它需要 google 服务,并且在 catch 块中我会重新运行一个没有附加 Cookie Jar 的 OkHttpClient。
我检查了是否有类似的华为替代品:ProviderInstaller.installIfNeeded(context);,但我找不到。此行用于更新任何丢失的安全提供程序补丁(如果它们丢失)。 Google documentation about mentioned line.
【问题讨论】:
标签: android okhttp huawei-developers