我正在尝试使用 data:Uri 在移动设备上使用 ical 创建日历条目,如https://stackoverflow.com/a/4551467/90236中所述。现在,当我在 Chrome 中运行它并且我的日历应用程序是 MS Outlook 时,它在我的台式机上运行良好。
基本上,我在 Javascript 中所做的是:
var icalsample = "BEGIN:VCALENDAR\r\n\
VERSION:2.0\r\n\
PRODID:-\/\/mycompany.com\/myproduct\/\/NONSGML v1.0\/\/EN\r\n\
BEGIN:VEVENT\r\n\
UID:" + uuid + "@mycompany.com\r\n\
DTSTAMP:" + dtstamp.toISOString() + "\r\n\
ORGANIZER;CN=mycompany scheduler\r\n\
DTSTART:" + dtstart.toISOString() + "\r\n\
DTEND:" + dtend.toISOString() + "\r\n\
SUMMARY:" + title + "\r\n\
DESCRIPTION:" + description + "\r\n\
END:VEVENT\r\n\
END:VCALENDAR\r\n";
var uriContent = "data:text/calendar," + encodeURIComponent(icalsample);
location.href = uriContent;
下面是我的应用程序中的一个示例 uriContent。当我将其复制并粘贴到 Chrome 的地址栏中时,它按预期工作:
data:text/calendar,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2Fmycompany.com%2Fmyproduct%2F%2FNONSGML%20v1.0%2F%2FEN%0ABEGIN%3AVEVENT%0AUID%3A3e40a5db-bfe3-4ab5-92c0-22cb7aeaa2d4%40mycompany.com%0ADTSTAMP%3A2013-03-15T18%3A17%3A55.792Z%0AORGANIZER%3BCN%3Dmycompany%20scheduler%0ADTSTART%3A2013-03-18T16%3A00%3A00.000Z%0ADTEND%3A2013-03-18T20%3A00%3A00.000Z%0ASUMMARY%3AService%20Appointment%0ADESCRIPTION%3Aupgrade.%0AEND%3AVEVENT%0AEND%3AVCALENDAR
我的问题是它不适用于 iPhone 或 Android。从我读过的内容来看,我认为 data:Uris 是受支持的。
在使用默认浏览器(不是 Chrome)的 Android 4.1.1 上,我看到我的字符串文本在浏览器中显示为纯文本文档。在 iPhone 上,我看到“下载失败:Safari 无法下载此文件”。
如何在 iPhone 和 Android 上进行这项工作?
更新 - -
上面的原始代码中有一些错误。所有行必须以 \r\n 结尾。我只有\n。最后一行也需要\r\n。javascript Date.toISOString 格式对 iCal 无效。您必须删除破折号、分号和秒的小数部分。用于捕获这些错误的真正有价值的工具是ical 验证器。
最重要的是,我认为 Android 不支持 iCal 或 ics 文件。有很多论坛帖子讨论这个和第 3 方工具来填补这个空白。所以我认为我的代码是正确的(除了上面更新中列出的错误),但它在我的手机上失败了,因为没有为文本/日历 mime 类型注册应用程序或 Intent。