美文网首页
2022年10月21日dom-to-image iOS端线上版本

2022年10月21日dom-to-image iOS端线上版本

作者: Steven_2016 | 来源:发表于2022-10-21 16:25 被阅读0次

背景:dom中img src 为项目本地路径,本地调试时调用dom-to-image toPng方法时,可以正常生成截图,但线上调试时提示:Cross origin requests are only supported for HTTP.
XMLHttpRequest cannot load file:///var/mobxxxxxxx

按照提示,这个应该是跨域问题,但在调用方法时,我明明已经开启了useCORS: true
断点查看调用栈显示在XMLHttpRequest这里出了问题:

cannot load file:///var/mobile/Containers/Data/Application/3AD80DAD-368A-4F7A-A553-EDD9CBFA3028/Documents/xxxx/mPaaS/xxxx/xxxx/static/media/xxxx.17ad6194.png due to access control checks.

 function getAndEncode(url) {
            var TIMEOUT = 30000;
            if(domtoimage.impl.options.cacheBust) {
                // Cache bypass so we dont have CORS issues with cached images
                // Source: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache
                url += ((/\?/).test(url) ? "&" : "?") + (new Date()).getTime();
            }

            return new Promise(function (resolve) {
                var request = new XMLHttpRequest();

                request.onreadystatechange = done;
                request.ontimeout = timeout;
                request.responseType = 'blob';
                request.timeout = TIMEOUT;
                request.open('GET', url, true);
                request.send();

                var placeholder;
                if(domtoimage.impl.options.imagePlaceholder) {
                    var split = domtoimage.impl.options.imagePlaceholder.split(/,/);
                    if(split && split[1]) {
                        placeholder = split[1];
                    }
                }

                function done() {
                    if (request.readyState !== 4) return;

                    if (request.status !== 200) {
                        if(placeholder) {
                            resolve(placeholder);
                        } else {
                            fail('cannot fetch resource: ' + url + ', status: ' + request.status);
                        }

                        return;
                    }

                    var encoder = new FileReader();
                    encoder.onloadend = function () {
                        var content = encoder.result.split(/,/)[1];
                        resolve(content);
                    };
                    encoder.readAsDataURL(request.response);
                }

                function timeout() {
                    if(placeholder) {
                        resolve(placeholder);
                    } else {
                        fail('timeout of ' + TIMEOUT + 'ms occured while fetching resource: ' + url);
                    }
                }

                function fail(message) {
                    console.error(message);
                    resolve('');
                }
            });
        }

解决方案1:img标签里的图片改为url加载

<img  src:'url'></img>

解决方案2:img标签里的图片改为base64加载

<img  src:'base64'></img>

原理
方案1:通过http链接加载,正常完成XMLHttpRequest请求逻辑
方案2:让newImage 方法在进入isDataUrl判断后,直接返回,不在进入XMLHttpRequest逻辑

function newImage(element) {
            return {
                inline: inline
            };

            function inline(get) {
                if (util.isDataUrl(element.src)) return Promise.resolve();

                return Promise.resolve(element.src)
                    .then(get || util.getAndEncode)
                    .then(function (data) {
                        return util.dataAsUrl(data, util.mimeType(element.src));
                    })
                    .then(function (dataUrl) {
                        return new Promise(function (resolve, reject) {
                            element.onload = resolve;
                            element.onerror = reject;
                            element.src = dataUrl;
                        });
                    });
            }
        }

相关文章

  • 版本号判断问题

    背景:客户端接收到服务端返回的线上版本号, 客户端判断线上版本是否比当前版本新, 如果存在新的版本号, 客户端需要...

  • 工作总结(10月1日)

    这一周主要是侧重于线上教师端5,5sUI适配问题,以及部分bug的修复问题;发布教师端修复版本; 1.IOS11发...

  • 2022年10月21日dom-to-image iOS端线上版本

    背景:dom中img src 为项目本地路径,本地调试时调用dom-to-image toPng方法时,可以正常生...

  • APICloud_开发控制台

    概览 关键信息预览. 端开发 :app端 端设置: 证书: Android证书_____iOS证书 代码:版本控...

  • 使用过哪些第三方?

    1.iOS 降低线上版本Crash率,IOS防止Crash组件WTSafeGuard。https://www.al...

  • 2020-01-03

    针对第二个问题,iOS被拒审的原因是服务端在线上的缓存触发了苹果的审核条例,iOS版本2年没有出现过被拒审的情况,...

  • 每周工作总结

    这周完成的 在这周ios端进行了细致的功能测试和bug梳理,对ios端进行了全面的完善与优化,ios端2.0版本...

  • HTTP2.0

    iOS 9.0+ 保证服务端支持 HTTP2.0,并且留意下 NPN 或 ALPN 客户端系统版本 iOS 9 +...

  • 简书交互分析文档

    体验概览 体验产品:简书web端、简书iOS端 产品版本:2.10.0 设备型号:iPhone6 操作系统:iOS...

  • 关于iOS 中App 证书更新的一些事情

    iOS 中线上的App 可以分为企业版本和App Store版本 企业版的更新 现象:iOS企业版证书到期导致AP...

网友评论

      本文标题:2022年10月21日dom-to-image iOS端线上版本

      本文链接:https://www.haomeiwen.com/subject/vmdmzrtx.html