为什么印前检查在较新的 Android 设备上失败,但在旧设备和台式机上却没有?
Why does preflight fail on newer Android devices but not older devices and desktop?
- 我正在使用 axios 包将 API 请求从我的应用程序发送到我的后端
- 后端是用 Laravel 构建的,是一个简单的休息 API
- 如果我 运行 桌面上的 Ionic 应用程序使用
ionic serve
它工作正常
- 如果我构建 APK 并安装应用程序:
- 在版本 8 或以下的 Android 设备上工作正常
- 在版本 9 或更高版本的 Android 设备上,预检检查一直失败
(这是使用 Chrome 的远程设备功能来检查来自应用程序的请求)
- 最初,请求甚至不会发送,而且在此之前它会出错,所以我为 Android 设置了我的网络安全配置,这消除了初始错误,但现在它在预检时一直失败
- 我怀疑这可能与应用程序上的请求是从
http://localhost
发送的事实有关,但我不确定如何解决这个问题。你能强制它使用 SSL 吗?如果可以,怎么做?
- 我的 Laravel CORS 设置比 Laravel 附带的默认 CORS 配置更宽松:
return [
'paths' => ['*'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,
];
该问题与 SSL/TLS 固定有关,而 axios 并未按照 this comment 进行处理。
The Ionic Native HTTP plugin 本机处理固定并且适用于但当然它利用了非移动设备上不可用的 Cordova。
有两种可能的解决方案:
- 实现 SSL/TLS 本机固定
- 创建一个service/factory决定我们是要使用axios还是原生插件
我选择了 #2
- 如果您需要有关 #1
、 的信息。
我使用以下方法确定使用哪个 HTTP 包装器:
static makeRequest() {
return isPlatform('cordova') ? cordovaHttpService : axiosHttpService;
}
当然,可以根据具体情况进行修改。
- 我正在使用 axios 包将 API 请求从我的应用程序发送到我的后端
- 后端是用 Laravel 构建的,是一个简单的休息 API
- 如果我 运行 桌面上的 Ionic 应用程序使用
ionic serve
它工作正常 - 如果我构建 APK 并安装应用程序:
- 在版本 8 或以下的 Android 设备上工作正常
- 在版本 9 或更高版本的 Android 设备上,预检检查一直失败
(这是使用 Chrome 的远程设备功能来检查来自应用程序的请求)
- 最初,请求甚至不会发送,而且在此之前它会出错,所以我为 Android 设置了我的网络安全配置,这消除了初始错误,但现在它在预检时一直失败
- 我怀疑这可能与应用程序上的请求是从
http://localhost
发送的事实有关,但我不确定如何解决这个问题。你能强制它使用 SSL 吗?如果可以,怎么做? - 我的 Laravel CORS 设置比 Laravel 附带的默认 CORS 配置更宽松:
return [
'paths' => ['*'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,
];
该问题与 SSL/TLS 固定有关,而 axios 并未按照 this comment 进行处理。
The Ionic Native HTTP plugin 本机处理固定并且适用于但当然它利用了非移动设备上不可用的 Cordova。
有两种可能的解决方案:
- 实现 SSL/TLS 本机固定
- 创建一个service/factory决定我们是要使用axios还是原生插件
我选择了 #2
- 如果您需要有关 #1
、
我使用以下方法确定使用哪个 HTTP 包装器:
static makeRequest() {
return isPlatform('cordova') ? cordovaHttpService : axiosHttpService;
}
当然,可以根据具体情况进行修改。