单军华
2018-07-11 7b02207537d35bfa1714bf8beafc921f717d100a
screendisplay/screendisplay/Classes/Helpers/LMJEventTool.m
New file
@@ -0,0 +1,242 @@
#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<NSString *> *savedArr = [[NSUserDefaults standardUserDefaults] objectForKey:SavedLMJEventsIdenti];
   NSArray<NSString *> *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