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

Mic*_*evy 6 javascript iphone icalendar android

我正在尝试使用数据在移动设备上使用ical创建日历条目:Uri,如/sf/answers/318602721/中所述.现在,当我在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;
Run Code Online (Sandbox Code Playgroud)

我的应用程序中的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
Run Code Online (Sandbox Code Playgroud)

我的问题是它无法在iPhone或Android上运行.根据我的阅读,我认为数据:Uris得到了支持.

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

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

更新---

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

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

小智 3

我遇到了同样的问题 - 在我找到此线程之前,我无法让 iPhone 读取我的 iCal 文件。

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

正如您所说,解决方案是:

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

感谢您指出正确的方向!