#import "LMJEventTool.h" @implementation LMJEventModel @end #define yyyyMMddHHmm @"yyyy-MM-dd HH:mm" #define SavedLMJEventsIdenti @"SavedLMJEventsIdenti" @interface LMJEventTool () @property (nonatomic, strong) EKEventStore *myEventStore; @end @implementation LMJEventTool static LMJEventTool *eventTool = nil; + (instancetype)sharedEventTool { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ eventTool = [[LMJEventTool alloc]init]; }); return eventTool; } /** * 创建事件 */ - (void )createEventWithEventModel:(LMJEventModel *)eventModel { EKEventStore * eventStore = [[EKEventStore alloc]init]; if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) { [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) { dispatch_async(dispatch_get_main_queue(), ^{ if (error) { NSLog(@"添加失败"); } else if (!granted) { NSLog(@"被拒绝"); } else { //判断当前日历中是否已经创建了该事件 EKEvent *event = [self getEventWithEKEventModel:eventModel]; if (event == nil) { event = [EKEvent eventWithEventStore:self.myEventStore]; event.title = eventModel.title; event.location = eventModel.location; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:yyyyMMddHHmm]; NSDate *startDate = [dateFormatter dateFromString:eventModel.startDateStr]; NSDate *endDate = [dateFormatter dateFromString:eventModel.endDateStr]; event.startDate = startDate; event.endDate = endDate; event.allDay = eventModel.allDay; event.notes = eventModel.notes; if (eventModel.alarmStr.length) { NSInteger alarmTime = [self getAlarmWithStr:eventModel.alarmStr]; if (alarmTime != 0) { [event addAlarm:[EKAlarm alarmWithRelativeOffset:alarmTime]]; } } [event setCalendar:[self.myEventStore defaultCalendarForNewEvents]]; NSError *err; BOOL isSave; isSave = [self.myEventStore saveEvent:event span:EKSpanThisEvent error:&err]; if (isSave) { NSString *identifer = event.eventIdentifier; NSMutableArray *tmpArr = [NSMutableArray arrayWithObject:identifer]; NSMutableArray *arr = [[NSUserDefaults standardUserDefaults] objectForKey:SavedLMJEventsIdenti]; if (!arr) { [[NSUserDefaults standardUserDefaults] setObject:tmpArr forKey:SavedLMJEventsIdenti]; } else { [tmpArr addObjectsFromArray:arr]; [[NSUserDefaults standardUserDefaults] setObject:tmpArr forKey:SavedLMJEventsIdenti]; } } } } }) ; }]; } } /** * 删除事件 */ - (BOOL)deleteEvent:(LMJEventModel *)eventModel { BOOL isDeleted = NO; NSString *eventIdentif; EKEvent * event = [self getEventWithEKEventModel:eventModel]; eventIdentif = event.eventIdentifier; NSError *err = nil; isDeleted = [self.myEventStore removeEvent:event span:EKSpanThisEvent commit:YES error:&err]; if (isDeleted) { [self clearIdentifier:eventIdentif]; } return isDeleted; } //删除后,清除 NSUserDefaults 中的 identifier - (void)clearIdentifier:(NSString *)identifier { NSMutableArray *savedArr = [[NSUserDefaults standardUserDefaults] objectForKey:SavedLMJEventsIdenti]; NSArray *newArray = [savedArr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != %@", identifier]]; [[NSUserDefaults standardUserDefaults] setObject:newArray forKey:SavedLMJEventsIdenti]; } /** * 使用 identifier删除 */ -(void)deleteWithIdentifier:(NSString *)identifier { if (!self.myEventStore) { self.myEventStore = [[EKEventStore alloc]init]; } EKEvent *event = [self.myEventStore eventWithIdentifier:identifier]; NSLog(@"eventtitle == %@", event.title); BOOL isDeleted = NO; NSError *err = nil; isDeleted = [self.myEventStore removeEvent:event span:EKSpanThisEvent commit:YES error:&err]; if (isDeleted) { [self clearIdentifier:event.eventIdentifier]; } } /** * 删除全部保存的 */ - (void)deleteAllCreatedEvent { NSMutableArray *savedArr = [[NSUserDefaults standardUserDefaults] objectForKey:SavedLMJEventsIdenti]; for (int i = 0; i < savedArr.count; i++) { NSString *eventIdentifier = savedArr[i]; [self deleteWithIdentifier:eventIdentifier]; } [[NSUserDefaults standardUserDefaults] removeObjectForKey:SavedLMJEventsIdenti]; } /** * 查找日历事件中相同的事件 */ - (EKEvent *)getEventWithEKEventModel:(LMJEventModel *)eventModel { EKEventStore * eventStore = [[EKEventStore alloc]init]; self.myEventStore = eventStore; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:yyyyMMddHHmm]; NSDate *startDate = [dateFormatter dateFromString:eventModel.startDateStr]; NSDate *endDate = [dateFormatter dateFromString:eventModel.endDateStr]; NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:@[[eventStore defaultCalendarForNewEvents]]]; NSArray *events = [eventStore eventsMatchingPredicate:predicate]; EKEvent *resultEvent = nil; if (events) { for (EKEvent *event in events) { if ([self checkEvent:event sameWithEvent:eventModel]) { resultEvent = event; } } } return resultEvent; } /** * 判断两个事件是否相同 */ - (BOOL)checkEvent:(EKEvent *)event sameWithEvent:(LMJEventModel *)eventModel { NSInteger modelAlarm = [self getAlarmWithStr:eventModel.alarmStr]; EKAlarm *eventAlarm = event.alarms[0]; NSInteger alarmInt = eventAlarm.relativeOffset; //项目中日程 只有 标题和 时间 和提醒时间 所有只做两个判断 if ([event.title isEqualToString: eventModel.title] && (modelAlarm == alarmInt)) { return YES; } else { return NO; } } /** * 获得提醒 NSinteger */ - (NSInteger)getAlarmWithStr:(NSString *)alarmStr { NSInteger alarmTime; if (alarmStr.length == 0) { alarmTime = 0; } else if ([alarmStr isEqualToString:@"不提醒"]) { alarmTime = 0; } else if ([alarmStr isEqualToString:@"1分钟前"]) { alarmTime = 60.0 * -1.0f; } else if ([alarmStr isEqualToString:@"10分钟前"]) { alarmTime = 60.0 * -10.f; } else if ([alarmStr isEqualToString:@"30分钟前"]) { alarmTime = 60.0 * -30.f; } else if ([alarmStr isEqualToString:@"1小时前"]) { alarmTime = 60.0 * -60.f; } else if ([alarmStr isEqualToString:@"1天前"]) { alarmTime = 60.0 * - 60.f * 24; }else { alarmTime = 0; } return alarmTime; } @end