Parse VCALENDAR (ci) avec Objective-C
-
11-09-2019 - |
Question
Je cherche un moyen facile d'analyser les données VCALENDAR avec c-objectif. Plus précisément tout ce que je suis préoccupé par les données est de FreeBusy (voir ci-dessous):
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
Je l'ai essayé de l'analyser en utilisant componentsSeparatedByString: @ « \ n », mais il y a une \ n dans une partie des données de FreeBusy, l'amenant à ne pas fonctionner correctement parser
.Y at-il quelque chose de facile que je suis absent?
La solution
Le \n
au milieu de données FREEBUSY est une partie de la spécification iCalendar; selon RFC 2445 , le saut de ligne suivi d'un espace est la bonne manière de diviser de longues lignes, de sorte que vous verrez probablement beaucoup de cela dans les données FreeBusy de balayage.
Nathan suggère, un NSScanner
peut être tout ce dont vous avez besoin si les données que vous attendez sera raisonnablement cohérente. Il y a un certain nombre de caprices iCalendar, cependant, donc je me surprends souvent à l'aide de libical pour analyser les informations ics . Un exemple rapide et sale de l'analyse de ces données en utilisant 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);
}
Documentation pour libical est dans le projet téléchargement lui-même (voir UsingLibical.txt
). Il y a aussi ce beau tutoriel sur l'expédition libical dans votre paquet d'applications .
Autres conseils
Jetez un oeil à NSScanner .