Parse VCALENDAR (ci) con Objective-C
-
11-09-2019 - |
Domanda
Sto cercando un modo semplice per analizzare i dati vCalendar con Objective-C. In particolare tutto io sono preoccupato sono i dati FreeBusy (Vedi sotto):
BEGIN:VCALENDAR
VERSION:2.0
METHOD:REPLY
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VFREEBUSY
UID:XYZ-DONT-CARE
DTSTART:20090605T070000Z
DTEND:20090606T070000Z
ATTENDEE:/principals/__uids__/ABC1234-53D8-4079-8392-01274F97F5E1/
DTSTAMP:20090605T075430Z
FREEBUSY;FBTYPE=BUSY:20090605T170000Z/20090605T200000Z,20090605T223000Z/20
090606T003000Z
FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20090605T070000Z/20090605T150000Z,2009060
6T010000Z/20090606T070000Z
ORGANIZER:/principals/__uids__/ABC1234-53D8-4079-8392-01274F97F5E1/
END:VFREEBUSY
END:VCALENDAR
Ho provato parsing esso utilizzando componentsSeparatedByString: @ "\ n", ma c'è un \ n in parte dei dati FreeBusy, inducendolo a non analizza correttamente
.C'è qualcosa di semplice che mi manca?
Soluzione
Il \n
nel mezzo di dati FreeBusy è una parte della specifica iCalendar; secondo RFC 2445 , la nuova riga seguito da uno spazio è il modo corretto per dividere linee lunghe, per cui è probabile vedere un sacco di questo nei dati di scansione FreeBusy.
Come suggerisce Nathan, un NSScanner
può essere tutto ciò che serve se i dati ci si aspetta sarà abbastanza consistente. Ci sono una serie di capricci in iCalendar, però, così mi ritrovo spesso utilizzando libical per analizzare ics informazioni . Un esempio veloce-e-sporca di analizzare questi dati utilizzando libical:
NSString *caldata = @"BEGIN:VCALENDAR\nVERS....etc";
icalcomponent *root = icalparser_parse_string([caldata cStringUsingEncoding:NSUTF8StringEncoding]);
if (root) {
icalcomponent *c = icalcomponent_get_first_component(root, ICAL_VFREEBUSY_COMPONENT);
while (c) {
icalproperty *p = icalcomponent_get_first_property(c, ICAL_FREEBUSY_PROPERTY);
while (p) {
icalvalue *v = icalproperty_get_value(p);
// This gives: 20090605T170000Z/20090605T200000Z
// (note that stringWithCString is deprecated)
NSLog(@"FREEBUSY Value: %@", [NSString stringWithCString:icalvalue_as_ical_string(v)]);
icalparameter *m = icalproperty_get_first_parameter(p, ICAL_FBTYPE_PARAMETER);
while (m) {
// This gives: FBTYPE=BUSY
NSLog(@"Parameter: %@", [NSString stringWithCString:icalparameter_as_ical_string(m)]);
m = icalproperty_get_next_parameter(p, ICAL_FBTYPE_PARAMETER);
}
p = icalcomponent_get_next_property(c, ICAL_FREEBUSY_PROPERTY);
}
c = icalcomponent_get_next_component(root, ICAL_VFREEBUSY_COMPONENT);
}
icalcomponent_free(root);
}
La documentazione per libical è nel download del progetto stesso (vedi UsingLibical.txt
). C'è anche questo bel tutorial sul trasporto di libical nel bundle dell'applicazione .
Altri suggerimenti
Date un'occhiata a NSScanner .