将.ics文件投放到webcal://,而不是通过浏览器下载

时间:2019-08-08 10:19:06

标签: javascript icalendar

我有一些使用ics.js框架的代码,该框架使用fileSaver.js(https://github.com/eligrey/FileSaver.js)创建日历邀请(.ics)并将其保存到用户浏览器中。

通过测试/研究,我了解到移动浏览器不喜欢通过此javascript下载机制下载文件,并尝试在浏览器中将它们呈现为文本文件,而不是像台式机一样触发iOs / Android打开日历程序

有人告诉我要在移动设备上打开这些文件的方法是,将它们作为“ webcal://”链接显示给浏览器,指向我的.ics文件。

那么我该如何劫持fileSaver.js的下载功能,并强制浏览器通过“ webcal://myInvite.ics”加载该.ics blob /文件,以触发日历应用程序识别移动设备上的文件?

尝试使用FileSaver.js中的URL保存方法,但不起作用:(

https://github.com/eligrey/FileSaver.js#saving-urls

我还确保设置了MIME类型。

ics.js

        /**
         * Download calendar using the saveAs function from filesave.js
         * @param  {string} filename Filename
         * @param  {string} ext      Extention
         */
        'download': function (filename, ext) {
            if (calendarEvents.length < 1) {
                return false;
            }

            ext = (typeof ext !== 'undefined') ? ext : '.ics';
            filename = (typeof filename !== 'undefined') ? filename : 'webcal://calendar';
            var calendar = calendarStart + SEPARATOR + calendarEvents.join(SEPARATOR) + calendarEnd;

            var blob;
            if (navigator.userAgent.indexOf('MSIE 10') === -1) { // chrome or firefox
                blob = new Blob([calendar]);
                blob = new Blob([calendar], { type: 'text/calendar;charset=' + document.characterSet });
            } else { // ie
                var bb = new BlobBuilder();
                bb.append(calendar);
                blob = bb.getBlob('text/x-vCalendar;charset=' + document.characterSet);
            }

            saveAs("webcal://", filename + ext);
           // saveAs(blob, filename + ext);

            return calendar;
        },

myApp.js

////////////////////////////////////////////
// ics generator
///////////////////////////////////////////
const calForm = document.querySelector('#add-cal-form');

var el = document.getElementById('add-cal-form');
if(el){

calForm.addEventListener('submit', (e) =>{
    e.preventDefault();

    var cal = ics();
    cal.addEvent('Demo Event', 'This is an all day event', 'Nome, AK', '8/7/2019', '8/7/2019');
    cal.addEvent('Demo Event', 'This is thirty minute event', 'Nome, AK', '8/7/2019 5:30 pm', '8/7/2019 6:00 pm');

    cal.download();
});

}

如果我尝试另存为URL(saveAs("webcal://", filename + ext);),则会出现此错误

Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.

如果我使用默认的下载示例(saveAs(blob, filename + ext);),则它在桌面上可以正常工作,并在浏览器中生成下载内容。在移动设备上,它将在浏览器中下载文件并将其显示为文本。

1 个答案:

答案 0 :(得分:0)

也希望找到这个问题的解决方案。