iOS4.3/日历同步到Google日历的EventKit中未正确创建事件警报

iOS4.3/日历同步到Google日历的EventKit中未正确创建事件警报,ios,cocoa-touch,ios4,google-calendar-api,eventkit,Ios,Cocoa Touch,Ios4,Google Calendar Api,Eventkit,我有一个使用EventKit创建带有警报的事件的简单案例。令人沮丧的是,它不起作用。以下是我正在做的: 使用[EKEvent eventWithEventStore::创建一个EKEvent,并填写它的一组属性 添加带有[myEvent addAlarm:[EKAlarm alarmWithRelativeOffset:][code]的报警 使用[myEventStore saveEvent:span:error://保存事件。 整个过程中唯一“不寻常”的事情是,我使用的手机使用的是较旧的iOS

我有一个使用EventKit创建带有警报的事件的简单案例。令人沮丧的是,它不起作用。以下是我正在做的:

  • 使用
    [EKEvent eventWithEventStore::
    创建一个
    EKEvent
    ,并填写它的一组属性
  • 添加带有
    [myEvent addAlarm:[EKAlarm alarmWithRelativeOffset:][code]的报警
  • 使用
    [myEventStore saveEvent:span:error://保存事件。
  • 整个过程中唯一“不寻常”的事情是,我使用的手机使用的是较旧的iOS版本(iPhone4上的iOS4.3.3),而且我使用的所有日历都与谷歌日历同步

    我有一个日历(我们称之为CalendarA),它在Google Calendars中设置为对新事件进行30分钟自动报警,另一个日历(CalendarB)没有设置为任何自动报警

    以下是我看到的坏行为:

    • 当我向CalendarA添加带有某种非零相对偏移量(例如5分钟)的
      EKAlarm
      时,日历会忽略我的偏移量并将其设置为30分钟
    • 当我在CalendarB中执行相同的操作时,我的报警被完全忽略,事件最终没有报警
    真正奇怪的是:如果我将relativeOffset设置为零,那么在这种特殊情况下,一切都会正常工作!(在CalendarA和CalendarB情况下,均正确添加了零偏移报警)。顺便说一下,如果我根本不创建闹钟,CalendarA中的事件仍然会收到30分钟的闹钟。我想对此无能为力

    我还尝试在创建事件后立即保存事件,然后立即向已保存的实例添加警报并再次保存。这没用

    如果我通过手机上的本机日历应用程序手动创建带有警报的事件,警报工作得非常好,因此我知道可以将任意警报同步到谷歌日历-问题是如何通过代码实现


    如何使我的事件警报正常运行?

    哇,我刚刚解决了它。。。显然,这与iOS版本、谷歌日历同步等无关。我只是没有意识到我需要将负值传递给alarmWithRelativeOffset。这完全是非直觉的。如果偏移量为负数,则可以完美工作。这也解释了为什么以前零偏移是有效的

    (我猜这可能与谷歌日历有点关系……我猜其他日历可能会在事件发生后支持报警,这样我就可以更容易地调试问题,但谷歌日历不支持,所以无效的“未来报警”被忽略)


    还有一个小问题,即在Calendar中基本上无法创建没有警报的事件,但我猜在这里什么也做不了——即使本机Calendar应用程序也有这个问题。

    这在iOS 4.2上对我很有效,看看它是否对你也有帮助

     EKEventStore* eventStore = [[EKEventStore alloc] init];
     EKEvent* event = [EKEvent eventWithEventStore:eventStore];
     // set startDate, endDate, title, location, etc.
    
    [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -5.0f]]; // 5 min
    
    [event setCalendar:[eventStore defaultCalendarForNewEvents]];
    NSError* error = nil;
    BOOL success = [eventStore saveEvent:event span:EKSpanThisEvent error:&error];