iOS系统日历的获与、创立、增除和批改1、Info.plist 中添加获与系统日历权限揭示
Privacy - Calendars Usage Description / 有助于您更好的打点日程
权限添加
2、获与权限
/**
EKAuthorizationStatusNotDetermined = 0,// 未停行授权选择
EKAuthorizationStatusRestricted,//未授权,且用户无奈更新,如家长控制状况下
EKAuthorizationStatusDenied, // 用户谢绝App运用
EKAuthorizationStatusAuthorized, // 已授权,可运用
*/
-(BOOL)getLocalCalendarAuthorization{
_eventStore = [[EKEventStore alloc]init];
EKAuthorizationStatus eventStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
__block BOOL allow = NO;
if(eventStatus ==EKAuthorizationStatusNotDetermined){
//用户尚未授权,提示用户授权。下边的requestAccessToEntityType:办法可以调出系统授权弹窗
[_eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
//允许
allow = YES;
}else{
//不允许
allow = NO;
}
}];
}else if(eventStatus ==EKAuthorizationStatusAuthorized){
//用户曾经允许授权。做相应办理,比如查问日历里原日的所有变乱..
allow = YES;
}
return allow;
}
3、获与所有的系统原地日历
/// 获与系统原地日历变乱
- (NSArray *)getLocalSystemCalendarEventWithStartDate:(NSDate *)startDate endDate:(NSDate *)endDate {
NSArray * eventArray = [_eventStore calendarsForEntityType:EKEntityTypeEvent];
NSMutableArray * onlyArray = [NSMutableArray array];
for (int i=0; i<eventArray.count; i++) {
EKCalendar * tempCalendar = eventArray[i];
EKCalendarType type = tempCalendar.type;
if (type == EKCalendarTypeCalDAV) {
[onlyArray addObject:tempCalendar];
}
}
NSPredicate * predicate = [_eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:onlyArray];
NSArray * events = [_eventStore eventsMatchingPredicate:predicate];
return events;
}
通过 event.calendar.allowsContentModifications == YES 可以过滤节假日、节气等系统添加的日历。
由于咱们手动添加的数据都是可以手动编辑的,所以event的allowsContentModifications那一只读属性恰恰可以用到。
4、创立日程并写入原地日历
- (void)writeToLocalCalendarAction {
EKEventStore *eventStore = [[EKEventStore alloc] init];
//变乱保存到日历
//06.07 元素
//title(题目 NSString),
//location(位置NSString),
//startDate(初步光阳 2016/06/07 11:14AM),
//endDate(完毕光阳 2016/06/07 11:14AM),
//addAlarm(揭示光阳 2016/06/07 11:14AM),
//notes(备注类容NSString)
/// 06.07 光阳格局
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setAMSymbol:@"AM"];
[dateFormatter setPMSymbol:@"PM"];
[dateFormatter setDateFormat:@"hh:mm"];
NSDate *date = [NSDate date];
NSString * s = [dateFormatter stringFromDate:date];
NSLog(@"%@",s);
/// 创立变乱
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = [NSString stringWithFormat:@"写入日历变乱-%@",s];
event.location = @"北京app";
/// 初步光阳(必须传)
event.startDate = [date dateByAddingTimeInterval:60 * 2];
/// 完毕光阳(必须传)
event.endDate = [date dateByAddingTimeInterval:60 * 5 * 24];
/// event.allDay = YES;//全天
/// 添加揭示
/// 第一次揭示 (几多分钟后)
[event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -1.0f]];
/// 第二次揭示 ()
/// [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -10.0f * 24]];
/// 06.07 add 变乱类容备注
NSString * str = @"那是备注";
event.notes = [NSString stringWithFormat:@"%@:%@",str,s];
/// 将日历变乱添加到默许的日历源中
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
/// 保存日历变乱
NSError *err;
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
}
5、增除单个日历和增除所有日历
/// 增除日历变乱(增除单个)
/// @param eventIdentifier 变乱ID(标识符)
- (BOOL)deleteCalendarEventIdentifier:(NSString *)eventIdentifier{
EKEvent *event;
NSError*error =nil;
if (eventIdentifier && ![eventIdentifier isEqualToString:@""]) {
event = [self.eventStore eventWithIdentifier:eventIdentifier];
/// commit:NO:最后再一次性提交,YES:当前提交
return [self.eventStore removeEvent:event span:EKSpanThisEvent commit:YES error:&error];
//
一次提交所有收配到变乱库
//
NSError *errored = nil;
//
BOOL commitSuccess = [self.eventStore commit:&errored];
//
return commitSuccess;
}
return NO;
}
/// 增除日历变乱(可增除一段光阳内的变乱)
/// @param startDate 初步光阳
/// @param endDate 完毕光阳
- (BOOL)deleteCalendarStartDate:(NSDate *)startDate addEndDate:(NSDate *)endDate {
// 获与到此变乱
NSArray * eventArray = [self.eventStore calendarsForEntityType:EKEntityTypeEvent];
NSMutableArray * onlyArray = [NSMutableArray array];
for (int i=0; i<eventArray.count; i++) {
EKCalendar * tempCalendar = eventArray[i];
EKCalendarType type = tempCalendar.type;
if (type == EKCalendarTypeCalDAV) {
[onlyArray addObject:tempCalendar];
}
}
NSPredicate * predicate = [self.eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:onlyArray];
NSArray * events = [self.eventStore eventsMatchingPredicate:predicate];
for (int i = 0; i < events.count; i ++) {
// 增除那一条变乱
EKEvent *event = events[i];
NSError*error =nil;
// commit:NO:最后再一次性提交
[self.eventStore removeEvent:event span:EKSpanThisEvent commit:NO error:&error];
}
//一次提交所有收配到变乱库
NSError *errored = nil;
BOOL commitSuccess = [self.eventStore commit:&errored];
return commitSuccess;
}
- (EKEventStore *)eventStore {
if (!_eventStore) {
_eventStore = [[EKEventStore alloc]init];
}
return _eventStore;
}
6、批他日历:
依据eventIdentifier 查找对应日历,没找到则从头创立,找假如有先增除正在从头创立。
7、问题处置惩罚惩罚:
(1)惟一变乱id(eventIdentifier)只读的问题:变乱创立之后,系统主动创立eventIdentifier,而咱们无奈精确找到对应变乱的 eventIdentifier。
@property(null_unspecified, nonatomic, readonly) NSString *eventIdentifier;
(2)获与原地日历中的日程数据数据质可能会很大,招致取效劳端返回的新数据停行婚配的时候双重for循环影响效率。
处置惩罚惩罚方案:运用allowsContentModifications属性。由于咱们手动添加的数据都是可以手动编辑的,所以event的allowsContentModifications那一只读属性恰恰可以用到。可以减少不少系统日历自带的event对象,比如节假日、节气等等。
event.calendar.allowsContentModifications == YES
8、其余
(1)基于天文位置的揭示
咱们可以设定当用户进入或分隔指定的天文位置区域时,触发日程揭示。譬喻当用户分隔公司,揭示用户须要到超市置办日用品,做为开发者,须要确定一个经纬度以及一个半径领域。
EKAlarm *alarm = [[EKAlarm alloc] init];
EKStructuredLocation *location = [EKStructuredLocation
locationWithTitle:@"Current Location"];
location.geoLocation = [[CLLocation alloc] initWithLatitude:23.1754700000 longitude:113.4147400000];
alarm.structuredLocation = location;
alarm.proximity = EKAlarmProximityEnter;
[event addAlarm:alarm];
参考:
1、iOS 添加名目到系统日历
2、iOS删、增、改、查系统揭示变乱和日历变乱
3、iOS—EventKit真现app日程同步到原地日历(惟一id,过滤节假日)