\n
в середине данных FREEBUSY является частью спецификации iCalendar; в соответствии с RFC 2445 , новая строка, за которой следует пробел, является правильным способом разделения длинных строк, поэтому вы, вероятно, увидите много этого при сканировании данных FREEBUSY.
Как предполагает Натан, NSScanner
может быть всем, что вам нужно, если ожидаемые данные будут достаточно последовательными. Однако в iCalendar есть ряд капризов, поэтому я часто использую libical для анализа информации. Краткий пример анализа этих данных с использованием 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);
}
Документация для libical находится в самой загрузке проекта (см. UsingLibical.txt
). Есть также этот прекрасный учебник по доставке libical в комплекте приложений .