8

我正在尝试使用 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。

4

2 回答 2

3

我遇到了同样的问题——直到找到这个帖子,我才能让 iPhone 读取我的 iCal 文件。

Safari 会说“Safari 无法下载此文件”,这具有误导性——Safari 已经下载了该文件——但它不喜欢带有破折​​号和冒号的标准 ISO 格式日期。

正如您正确地说的那样,解决方案是:

  • 确保行尾是 CRLF。
  • 确保 BEGIN:VCALENDAR 上方没有空行
  • 确保日期格式为 ISO - 但已删除破折号和分号。

感谢您指出正确的方向!

于 2013-09-17T10:10:39.627 回答
1

我尝试了这个确切的代码并且它有效!

BEGIN:VCALENDAR
PRODID:-//Some organization//some application//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
UID:20120925T072912Z-140@http://localhost/www/
CREATED:20120925T072912Z
DTSTAMP:20120922T090500Z
DTSTART:20120922T090500Z
DTEND:20120923T090500Z
DESCRIPTION:Please attend this sample meeting
SUMMARY:Invitation to attend training
LOCATION:Earth
ATTENDEE;RSVP=TRUE:mailto:periklis@example.com
ORGANIZER;CN=periklis@example.com:mailto:periklis@example.com
LAST-MODIFIED:20120922T090500Z
PRIORITY:5
SEQUENCE:0
STATUS:CONFIRMED
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR
于 2013-11-13T07:44:16.977 回答