代码之家  ›  专栏  ›  技术社区  ›  christo16

使用Objective-C分析vCalendar(ics)

  •  1
  • christo16  · 技术社区  · 16 年前

    我正在寻找一种用Objective-C解析vCalendar数据的简单方法。具体来说,我所关心的是FreeBusy数据(见下文):

    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
    

    我尝试使用componentsseparatedbystring:@\n“”来分析它,但是部分freebusy数据中有一个\n,导致它无法正确分析。

    有什么容易让我错过的吗?

    2 回复  |  直到 16 年前
        1
  •  7
  •   Jarret Hardie    16 年前

    这个 \n 在freebusy中,数据是iCalendar规范的一部分;根据 RFC 2445 ,换行后加空格是拆分长线的正确方法,因此在扫描忙/闲数据时可能会看到很多这样的情况。

    正如内森建议的那样, NSScanner 如果您所期望的数据是合理一致的,那么您可能只需要这些数据。不过,伊卡伦达有很多变幻莫测的地方,所以我经常发现自己在使用 libical 解析ICS信息。使用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 in your application bundle .

        2
  •  0
  •   Nathan Kinsinger    16 年前

    看一看 NSScanner .