如何将图像加载到 canvas 而没有离子 iOS 混合应用程序的 CORS 问题
How to load an image into a canvas without CORS issues for ionic iOS hybrid app
我想将图像加载到用于显示自定义 google 地图标记的 canvas 中。以下代码适用于浏览器和 Android 但不适用于 iOS,因为 WKWebView 不接受针对此事的 CORS 请求。
let ctx = canvas.getContext('2d');
let img = new Image();
img.crossOrigin = "anonymous";
img.src = url;
img.onload = function () {
// process and load the image into the canvas map marker
};
img.onerror = function () {
// handle fallback
};
图像必须从 google 地图照片 api(以及我无法控制服务器上的 CORS 设置的其他 api)加载。这必须在应用程序中以某种方式处理。
这个问题有哪些可能的解决方案?
我发现的一件事是 ionic-image-loader (https://github.com/zyra/ionic-image-loader),它使用离子原生 http 请求将图像加载和缓存到 img 标签中。虽然这从 html 开始工作,但我需要直接在 js/ts 中使用它,这似乎是不可能的。
如果我尝试通过 ionic http 请求加载图像,即使在浏览器中,请求也会被 CORS 阻止,而不是通过 img 标签加载图像。也许如果(以某种方式)可以将以下 header 设置为离子 http 请求,以便请求看起来相同:Sec-Fetch-Mode: no-cors
[WKWebView]
即使是本地图像也无法以这种方式加载,它显示:Access-Control-Allow-Origin 不允许 Origin null (Cannot load image: file:/// ... ) 然后它陷入试图加载图像的循环中。
通过使用带有 cordova 原生 http 的 ionic-image-loader 预加载函数的分支解决,完全绕过 webview 以获取 http 请求并手动处理缓存。这是 http 请求的完成方式,在 iOS WKWebView 上工作也是如此:
let options = {
method: 'get',
responseType: 'blob',
data: {},
headers: {}
};
cordova.plugin.http.sendRequest(url, options, (data: any) => {
let blob = data.data;
resolve(blob);
}, (error: any) => {
console.log(error.status);
console.log(error.error);
reject(error.error);
});
我想将图像加载到用于显示自定义 google 地图标记的 canvas 中。以下代码适用于浏览器和 Android 但不适用于 iOS,因为 WKWebView 不接受针对此事的 CORS 请求。
let ctx = canvas.getContext('2d');
let img = new Image();
img.crossOrigin = "anonymous";
img.src = url;
img.onload = function () {
// process and load the image into the canvas map marker
};
img.onerror = function () {
// handle fallback
};
图像必须从 google 地图照片 api(以及我无法控制服务器上的 CORS 设置的其他 api)加载。这必须在应用程序中以某种方式处理。
这个问题有哪些可能的解决方案?
我发现的一件事是 ionic-image-loader (https://github.com/zyra/ionic-image-loader),它使用离子原生 http 请求将图像加载和缓存到 img 标签中。虽然这从 html 开始工作,但我需要直接在 js/ts 中使用它,这似乎是不可能的。
如果我尝试通过 ionic http 请求加载图像,即使在浏览器中,请求也会被 CORS 阻止,而不是通过 img 标签加载图像。也许如果(以某种方式)可以将以下 header 设置为离子 http 请求,以便请求看起来相同:Sec-Fetch-Mode: no-cors
[WKWebView] 即使是本地图像也无法以这种方式加载,它显示:Access-Control-Allow-Origin 不允许 Origin null (Cannot load image: file:/// ... ) 然后它陷入试图加载图像的循环中。
通过使用带有 cordova 原生 http 的 ionic-image-loader 预加载函数的分支解决,完全绕过 webview 以获取 http 请求并手动处理缓存。这是 http 请求的完成方式,在 iOS WKWebView 上工作也是如此:
let options = {
method: 'get',
responseType: 'blob',
data: {},
headers: {}
};
cordova.plugin.http.sendRequest(url, options, (data: any) => {
let blob = data.data;
resolve(blob);
}, (error: any) => {
console.log(error.status);
console.log(error.error);
reject(error.error);
});