我很难让订阅日历与Google日历一起使用。以下网址适用于Outlook和Apple日历(iCal),但我收到来自Google的错误 - “您提供的地址未包含有效iCal或GData格式的日历。”
我的URL通过以下验证器验证(icalvalid.cloudapp.net/和severinghaus.org/projects/icv /)
任何人都可以提供任何错误的想法吗?这是URL: https://beta.vcallboard.com/calls/exportcalendar.php?userID=Mg%3D%3D&token=MjB6N2E0OTk%3D
我已经尝试过的理论: - 不适用于https - (我将.ics文件保存并上传为我的服务器根目录中的文件并且该URL工作 - 似乎它与自动生成有关) - 某些字段的空白值无效(如果我将其作为.ics文件上传,则可以使用)
答案 0 :(得分:2)
您没有定义要在ICS文件中引用的时区。您有以下几行:
DTSTART;TZID=America/Chicago:20140121T010000
但要使用这些,您需要定义您的时区,例如:
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Test calendar
X-WR-TIMEZONE:Indian/Reunion
BEGIN:VTIMEZONE
TZID:Indian/Reunion
TZURL:http://tzurl.org/zoneinfo/Indian/Reunion
X-LIC-LOCATION:Indian/Reunion
BEGIN:STANDARD
TZOFFSETFROM:+034152
TZOFFSETTO:+0400
TZNAME:RET
DTSTART:19110601T000000
RDATE:19110601T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
...
获取时区定义文件的好地方是tzurl.org
答案 1 :(得分:2)
我对我的问题感到困惑,因为我可以手动导入由我的脚本输出的.ics文件,并且谷歌日历读取它没有任何问题。所以我认为我对iCal文件的实际格式没有问题 - 我认为它必须是标题或某些服务器配置的问题。所以我做了一些实验......
长话短说,我可以通过以下方式让这个在Google日历上运行:
使用所有iCal数据加载变量,从数据库中提取,站点常量等。确保使用\r
和\n
在验证器中进行更好的验证。
$iCal = "BEGIN:VCALENDAR\r
VERSION:2.0\r
PRODID:-//VirtualCallboard//".SITENAME."//EN\r
CALSCALE:GREGORIAN\r
METHOD:PUBLISH\r";
while ($r=mysql_fetch_assoc($result))
{
// i do a bunch of stuff here to get variables ready for the output
$iCal .= "BEGIN:VEVENT\r
DTSTAMP:".gmdate("Ymd\THis\Z")."\r
DTSTART:".date("Ymd\THis\Z", strtotime($r[tdstart]))."\r
DTEND:'.date("Ymd\THis\Z", strtotime($r[tdend]))."\r
SUMMARY:$r[title]\r
UID:$r[callid]@".$_SERVER['HTTP_HOST']."\r
DESCRIPTION:$r[notes].\r
LOCATION:$r[location_name].\r
STATUS:CONFIRMED\r
END:VEVENT\r\n";
}
$iCal .= "END:VCALENDAR";
逃避特殊字符(我现在所知道的都是逗号)。然后(这是秘密) - 使用file_put_contents将iCal变量中的字符串写入缓存目录中扩展名为.ics的文件。
//escape special characters.
$iCal = str_replace(",","\,",$iCal);
//output to a file
$filename = 'site/cache/'.date("YmdHis").'.ics';
file_put_contents($filename,$iCal);
调用标题:
//set correct content-type-header
header("Content-Type:text/calendar");
header("Content-Disposition:inline;filename=my_ical.ics");
使用file_get_contents从文件中读取.ics数据并将其输出到浏览器。
print file_get_contents($filename);
清理我在缓存目录中创建的.ics文件。
unlink($filename);
exit;
由于某种原因,我无法解释,这使得完全相同的文件在Google日历中起作用。因此,这与Outlook,Google日历和Apple日历兼容。
答案 2 :(得分:0)
可能值得记住的是,Google缓存日历URL,并且每隔x个小时才刷新一次(12?)。因此,如果您尝试在无法正常运行之前添加URL,则它可能仍会显示该旧版本,可能没什么用。
请尝试在URL中添加无关的更改,例如在末尾查询(?foo = 1),或者,如果可以的话,更改服务器上的地址。
https://www.binarysludge.com/2012/02/01/how-to-force-refresh-google-calendar/
(缓存是一类问题,在弄乱标头和ics格式的最后几个小时中我从未想到。人们倾向于认为一个人的改变至少起了作用。)