Procházet zdrojové kódy

1.完成iOS日历事件增删改查。

Pen Li před 7 roky
rodič
revize
88ba150a11

+ 63 - 0
common/CalendarEvent/RACalendarEventManager.h

@@ -0,0 +1,63 @@
+//
+//  RACalendarEventManager.h
+//  Calendar
+//
+//  Created by Jack on 2018/11/21.
+//  Copyright © 2018年 USAI. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class EKEvent,EKCalendar,EKAlarm;
+
+typedef void(^fetchEventCompletionBlk)(NSArray<EKEvent *> *events);
+typedef void(^commitResultBlk)(BOOL result, NSError *error);
+typedef void(^authorizeBlk)(BOOL granted);
+
+/**
+ * Privacy - Calendars Usage Description
+ */
+@interface RACalendarEventManager : NSObject
+
+@property (nonatomic,assign,readonly) BOOL authorized;
+
++ (instancetype)sharedManager;
+
+- (void)requestAuthorization:(authorizeBlk)blk;
+
+#pragma mark - 检索
+
+/**
+ * 异步执行
+ */
+- (void)eventsWithStartDate:(NSDate *)startDate endDate:(NSDate *)endDate completion:(fetchEventCompletionBlk)blk;
+
+- (EKEvent *)eventWithIdentifier:(NSString *)identifier;
+
+#pragma mark - 创建/编辑事件
+
+- (EKEvent *)createNewCalendarEvent;
+
+- (void)setTitle:(NSString *)title forEvent:(EKEvent *)event;
+
+- (void)setNotes:(NSString *)notes forEvent:(EKEvent *)event;
+
+- (void)setTimeZone:(NSTimeZone *)timeZone forEvent:(EKEvent *)event;
+
+- (void)setStartDate:(NSDate *)startDate forEvent:(EKEvent *)event;
+
+- (void)setEndDate:(NSDate *)endDate forEvent:(EKEvent *)event;
+
+- (void)setCalendar:(EKCalendar *)calendar forEvent:(EKEvent *)event;
+
+- (void)addAlarm:(EKAlarm *)alarm forEvent:(EKEvent *)evnet;
+
+#pragma mark - 保存/删除事件
+
+- (void)saveEvent:(EKEvent *)event withCompletion:(commitResultBlk)blk;
+
+- (void)removeEvent:(EKEvent *)event withCompletion:(commitResultBlk)blk;
+
+@end
+
+

+ 181 - 0
common/CalendarEvent/RACalendarEventManager.m

@@ -0,0 +1,181 @@
+//
+//  RACalendarEventManager.m
+//  Calendar
+//
+//  Created by Jack on 2018/11/21.
+//  Copyright © 2018年 USAI. All rights reserved.
+//
+
+#import "RACalendarEventManager.h"
+#import <EventKit/EventKit.h>
+
+
+@interface RACalendarEventManager ()
+
+/**
+ * 因为 EventStore 是 Calendar database 的数据库引擎,
+ * 所以应该尽量少的对他进行创建和销毁,所以推荐使用EventStore的时候使用单例模式
+ */
+@property (nonatomic,strong) EKEventStore *store;
+
+@end
+
+@implementation RACalendarEventManager
+
++ (instancetype)sharedManager {
+    static RACalendarEventManager *manager;
+    static dispatch_once_t token;
+    dispatch_once(&token, ^{
+        manager = [[RACalendarEventManager alloc] init];
+        manager.store = [[EKEventStore alloc] init];
+    });
+    return manager;
+}
+
+#pragma mark - 权限
+
+- (BOOL)authorized {
+    return [self authorization] == EKAuthorizationStatusAuthorized;
+}
+
+- (EKAuthorizationStatus)authorization {
+    
+    EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
+    return status;
+}
+
+- (void)requestAuthorization:(authorizeBlk)blk {
+    
+    [self.store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
+        
+        if (blk) {
+            
+            if (granted) {
+                blk(YES);
+            } else {
+                blk(NO);
+            }
+            
+        }
+    }];
+}
+
+#pragma mark - 检索事件
+
+/**
+ * 异步执行
+ */
+- (void)eventsWithStartDate:(NSDate *)startDate endDate:(NSDate *)endDate completion:(fetchEventCompletionBlk)blk {
+    if (!self.authorized) {
+        if (blk) {
+            blk(nil);
+        }
+    }
+    dispatch_async(dispatch_get_global_queue(0, 0), ^{
+       
+        NSPredicate *predicate = [self.store predicateForEventsWithStartDate:startDate
+                                                                     endDate:endDate
+                                                                   calendars:nil];
+        
+        NSArray<EKEvent *> *events = [self.store eventsMatchingPredicate:predicate];
+        
+        if (blk) {
+            blk(events);
+        }
+    });
+}
+
+- (EKEvent *)eventWithIdentifier:(NSString *)identifier {
+    if (!self.authorized) {
+        return nil;
+    }
+    if (identifier == nil) {
+        return nil;
+    }
+    
+    EKEvent *event = [self.store eventWithIdentifier:identifier];
+    
+    return event;
+}
+
+#pragma mark - 创建/编辑事件
+
+- (EKEvent *)createNewCalendarEvent {
+    if (!self.authorized) {
+        return nil;
+    }
+    EKEvent *event = [EKEvent eventWithEventStore:self.store];
+    [self setCalendar:self.store.defaultCalendarForNewEvents forEvent:event];
+    
+    return event;
+}
+
+- (void)setTitle:(NSString *)title forEvent:(EKEvent *)event {
+    if (event && self.authorized) {
+        event.title = title;
+    }
+}
+
+- (void)setNotes:(NSString *)notes forEvent:(EKEvent *)event {
+    if (event && self.authorized) {
+        event.notes = notes;
+    }
+}
+
+- (void)setTimeZone:(NSTimeZone *)timeZone forEvent:(EKEvent *)event {
+    if (event && self.authorized) {
+        event.timeZone = timeZone;
+    }
+}
+
+- (void)setStartDate:(NSDate *)startDate forEvent:(EKEvent *)event {
+    if (event && self.authorized) {
+        event.startDate = startDate;
+    }
+}
+
+- (void)setEndDate:(NSDate *)endDate forEvent:(EKEvent *)event {
+    if (event && self.authorized) {
+        event.endDate = endDate;
+    }
+}
+
+- (void)setCalendar:(EKCalendar *)calendar forEvent:(EKEvent *)event {
+    if (event && self.authorized) {
+        event.calendar = calendar;
+    }
+}
+
+- (void)addAlarm:(EKAlarm *)alarm forEvent:(EKEvent *)evnet {
+    if (evnet && alarm && self.authorized) {
+        [evnet addAlarm:alarm];
+    }
+}
+
+#pragma mark - 保存/删除事件
+
+- (void)saveEvent:(EKEvent *)event withCompletion:(commitResultBlk)blk {
+    if (event && self.authorized) {
+        
+        NSError *error;
+        [self.store saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
+        BOOL result = error ? NO : YES;
+        if (blk) {
+            blk(result, error);
+        }
+    }
+}
+
+- (void)removeEvent:(EKEvent *)event withCompletion:(commitResultBlk)blk {
+    if (event && self.authorized) {
+        
+        NSError *error;
+        [self.store removeEvent:event span:EKSpanThisEvent commit:YES error:&error];
+        BOOL result = error ? NO : YES;
+        if (blk) {
+            blk(result, error);
+        }
+    }
+}
+
+@end