我有一些使用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);
),那么它在桌面上会在浏览器中生成下载效果很好。在移动设备上,它将在浏览器中下载文件并将其显示为文本。 最佳答案
希望也能解决这个问题。