我正在开发一个使用EKEventStore和EKCalendar的应用程序。
EKEventStore是静态的:
static EKEventStore *eventStore = nil;
然后使用以下方法查看用户是否允许我访问他们的日历。
- (void)requestAccess:(void (^)(BOOL granted, NSError *error))callback;
{
if (eventStore == nil) {
eventStore = [[EKEventStore alloc] init];
}
// request permissions
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:callback];
//EKCalendar *calendar = nil;
NSString *calendarIdentifier = [[NSUserDefaults standardUserDefaults] valueForKey:calendarIdentifer];
if (calendarIdentifier) {
self.calendar = [self retrieveCalendar];
}
}
之后,我可以创建一个新的日历并保存我的事件。但是,如果我删除应用程序,日历仍然在日历应用程序中。当我运行应用程序时,我正在创建一个新的EKEventStore,这意味着我也在创建一个新的日历。
这意味着如果我删除应用程序并重新安装多次,我最终会得到一个巨大的相同日历列表,只有最新的日历可以在应用程序中访问。当应用程序被删除时,是否可以删除日历?或者我可以做些什么来访问之前创建的日历。
非常感谢。
直到现在我还没有找到其他的解决方案,所以:要获得以前的日历,可以按名称搜索,如下所示:
EKEventStore *eventDB = [[EKEventStore alloc] init];
NSArray *calendarEvents = [eventDB calendarsForEntityType:EKEntityTypeEvent];
NSArray *calendarReminder = [eventDB calendarsForEntityType:EKEntityTypeReminder];
NSMutableArray *calendars = [NSMutableArray arrayWithArray:calendarEvents];
[calendars addObjectsFromArray:calendarReminder];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *typeString = @"";
for (EKCalendar *thisCalendar in calendars)
if([thisCalendar.title isEqualToString:@"YourcalendarName"])
// your code
但是用户可以更改日历名称,这是有风险的,所以你可以得到它的id,你可以在创建日历时存储,但是如果你与iCloud合并:
与日历完全同步将失去此标识符。您应该有一个计划来处理标识符无法通过缓存其其他属性来获取的日历。