2014-01-22 2 views
4

Google 캘린더에서 구독 캘린더를 사용하는 데 어려움을 겪고 있습니다. 다음 URL은 Outlook 및 Apple 캘린더 (iCal)에서 올바르게 작동하지만 Google에서 오류가 발생합니다. "제공된 주소에 유효한 iCal 또는 GData 형식의 캘린더가 없습니다.".ics 파일 가져 오기시 Google 캘린더 오류가 발생했습니다.

내 URL은 다음과 유효성 검사기 (icalvalid.cloudapp.net/ 및 severinghaus.org/projects/icv/)에 대한 유효성 검사를 통과

사람이 무엇이 잘못되었는지 어떤 아이디어를 제공 할 수 있습니까? (I 저장하고 내 서버 루트에 파일로의 .ics 파일을 업로드하고 해당 URL이 일 - - HTTPS를 통해 작동하지 않습니다 - 을 보인다 : 이미 해봤 https://beta.vcallboard.com/calls/exportcalendar.php?userID=Mg%3D%3D&token=MjB6N2E0OTk%3D

이론 : 여기에 URL입니다 - 일부 필드의 값이 유효하지 않음 (.ics 파일로 업로드하면 작동 함)

+0

'를 추가했습니다.' DESCRIPTION : 및 LOCATION : 뒤에 나오는 문자는 공백 값이 아닙니다. 이제 Google에서 캘린더를 가져올 수는 있지만 실제로 일정을 표시하지는 않습니다. – WhiteEyebrows

+0

나는 또한이 해결책을 시도했다 : http://devnet.superoffice.com/Developer/Blog/google-calendar-ical-parser/ 작동하지 않았다. – WhiteEyebrows

+0

첫 번째 조언은 http://icalendar.org/validator.html로 가서 파일/콘텐츠의 유효성을 검사합니다. 그것은 나를 많이 도왔다. – RolandoCC

답변

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

되어 다음과 같이 라인의 번호를 가지고
+0

이 URL (http://devnet.superoffice.com/Developer/Blog/google-calendar-ical-parser/)로 인해 시간대로 이동하려했지만 실제로 Outlook에서 작동하는 캘린더가 손상되었습니다. 그래서 전으로 되돌아갔습니다. 당신은 다시 한번 볼 수 있습니다. 이제 DTSTART/DTEND를 GMT 형식으로 저장합니다. – WhiteEyebrows

+0

위의 ICS를 Google 캘린더에 잘 가져 오면 이벤트가 표시됩니다. – jgm

+0

예 - 그것이 저를 곤란하게합니다. 그 ICS를 잘 가져올 수는 있지만 "URL로 추가"를 선택하고 참조 된 URL을 제공하면 이벤트가 표시되지 않습니다 (실제로는 캘린더가 오류가 아니지만). – WhiteEyebrows

2

스크립트로 출력 된 .ics 파일을 수동으로 가져올 수 있었기 때문에 문제가 발생하여 당황했습니다. 문제없이 Google 캘린더에서 읽었습니다. 그래서 iCal 파일의 실제 포맷에 문제가 없다고 생각했습니다. 헤더 나 서버 설정에 문제가 있다는 생각이 들었습니다. ,

  1. 로드까지 모든 iCal의 데이터와 변수 : 그래서 몇 가지 실험 ...

    길고도 짧은 이야기, 나는 다음이 수행하여 Google 캘린더에 작업을 얻을 수있었습니다했다 데이타베이스, 사이트 상수 등을 가져 오는 것. 유효성 검사기에서 더 나은 유효성 검사를 위해 \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"; 
    
  2. 특수 문자를 이스케이프 처리합니다. (지금 알고있는 것은 모두 쉼표입니다.) 그리고 나서 (여기에 비밀이 있습니다) - 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); 
    
  3. 전화 헤더 :

    //set correct content-type-header 
    header("Content-Type:text/calendar"); 
    header("Content-Disposition:inline;filename=my_ical.ics"); 
    
  4. 사용 file_get_contents 다시 브라우저에 파일 출력을 밖으로을 .ics 데이터를 읽을 수 있습니다.

    print file_get_contents($filename); 
    
  5. 캐시 디렉토리에서 만든 .ics 파일을 정리하십시오.내가 설명 할 수없는 어떤 이유로,

unlink($filename); 
exit; 

, 이것은 Google 캘린더에서 동일한 파일 작업을했다. 따라서 Outlook, Google 캘린더 및 Apple 캘린더와 호환됩니다.

+0

HEREDOC 구문을 사용하면 솔루션이 반드시 휴대 할 수있는 것은 아닙니다. iCal 파일에는'\ r \ n' (CR + LF) 줄 끝이 있어야합니다. HEREDOC 문자열에는 OS가 사용하는 모든 것을 더한'\ r'이 있습니다. FTP를 통해 다른 OS로 파일을 전송하고 FTP 소프트웨어가 라인 결말을 수정하도록 허용하면 OS에 따라 중단 될 수 있습니다. – MrWhite

+0

.net에서 작업 할 경우 매우 유용합니다. contenidoArchivoICS.AppendLine ("BEGIN : VCALENDAR"); contendidoArchivoICS.AppendLine ("VERSION : 2.0"); contendidoArchivoICS.AppendLine ("PRODID : -// COMPANY // APP NAME // ES"); contendidoArchivoICS.AppendLine ("CALSCALE : GREGORIAN"); contendidoArchivoICS.AppendLine ("METHOD : PUBLISH"); – RolandoCC

관련 문제