数据:uri for ical在Android或iPhone上不起作用

时间:2013-03-15 18:43:25

标签: javascript android iphone icalendar

我正在尝试使用数据在移动设备上使用ical创建日历条目:Uri,如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上运行。根据我的阅读,我认为数据:Uris得到了支持。

在使用默认浏览器(不是Chrome)的Android 4.1.1上,我看到我的字符串文本在浏览器中显示为纯文本文档。在iPhone上,我看到“下载失败:Safari无法下载此文件”。

如何在iPhone和Android上完成这项工作?

更新---

上面的原始代码中有一些错误。所有行必须以\ r \ n结尾。我只有\ n。最后一行也需要\ r \ n。 javascript Date.toISOString格式对iCal无效。你必须删除破折号,分号和分数秒。用于捕获这些错误的非常有价值的工具是ical validator

最重要的是,我认为Android不支持iCal或ics文件。有很多论坛帖子讨论这个和3rd party tools以填补这个空白。所以我认为我的代码是正确的(除了上面列出的更新中的错误),但它在我的手机上失败了,因为没有为文本/日历mime类型注册app或Intent。

2 个答案:

答案 0 :(得分:2)

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

Safari会说“Safari无法下载此文件”这是误导性的 - Safari下载了该文件 - 但它不喜欢标准的ISO格式日期,用破折号和冒号。

解决方案正如您所说的那样:

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

感谢您指出正确的方向!

答案 1 :(得分: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