RACalendarEventManager.m 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //
  2. // RACalendarEventManager.m
  3. // Calendar
  4. //
  5. // Created by Jack on 2018/11/21.
  6. // Copyright © 2018年 USAI. All rights reserved.
  7. //
  8. #import "RACalendarEventManager.h"
  9. #import <EventKit/EventKit.h>
  10. @interface RACalendarEventManager ()
  11. /**
  12. * 因为 EventStore 是 Calendar database 的数据库引擎,
  13. * 所以应该尽量少的对他进行创建和销毁,所以推荐使用EventStore的时候使用单例模式
  14. */
  15. @property (nonatomic,strong) EKEventStore *store;
  16. @end
  17. @implementation RACalendarEventManager
  18. + (instancetype)sharedManager {
  19. static RACalendarEventManager *manager;
  20. static dispatch_once_t token;
  21. dispatch_once(&token, ^{
  22. manager = [[RACalendarEventManager alloc] init];
  23. manager.store = [[EKEventStore alloc] init];
  24. });
  25. return manager;
  26. }
  27. #pragma mark - 权限
  28. - (BOOL)authorized {
  29. return [self authorization] == EKAuthorizationStatusAuthorized;
  30. }
  31. - (EKAuthorizationStatus)authorization {
  32. EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
  33. return status;
  34. }
  35. - (void)requestAuthorization:(authorizeBlk)blk {
  36. [self.store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
  37. if (blk) {
  38. if (granted) {
  39. blk(YES);
  40. } else {
  41. blk(NO);
  42. }
  43. }
  44. }];
  45. }
  46. #pragma mark - 检索事件
  47. /**
  48. * 异步执行
  49. */
  50. - (void)eventsWithStartDate:(NSDate *)startDate endDate:(NSDate *)endDate completion:(fetchEventCompletionBlk)blk {
  51. if (!self.authorized) {
  52. if (blk) {
  53. blk(nil);
  54. }
  55. }
  56. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  57. NSPredicate *predicate = [self.store predicateForEventsWithStartDate:startDate
  58. endDate:endDate
  59. calendars:nil];
  60. NSArray<EKEvent *> *events = [self.store eventsMatchingPredicate:predicate];
  61. if (blk) {
  62. blk(events);
  63. }
  64. });
  65. }
  66. - (EKEvent *)eventWithIdentifier:(NSString *)identifier {
  67. if (!self.authorized) {
  68. return nil;
  69. }
  70. if (identifier == nil) {
  71. return nil;
  72. }
  73. EKEvent *event = [self.store eventWithIdentifier:identifier];
  74. return event;
  75. }
  76. #pragma mark - 创建/编辑事件
  77. - (EKEvent *)createNewCalendarEvent {
  78. if (!self.authorized) {
  79. return nil;
  80. }
  81. EKEvent *event = [EKEvent eventWithEventStore:self.store];
  82. [self setCalendar:self.store.defaultCalendarForNewEvents forEvent:event];
  83. return event;
  84. }
  85. - (void)setTitle:(NSString *)title forEvent:(EKEvent *)event {
  86. if (event && self.authorized) {
  87. event.title = title;
  88. }
  89. }
  90. - (void)setNotes:(NSString *)notes forEvent:(EKEvent *)event {
  91. if (event && self.authorized) {
  92. event.notes = notes;
  93. }
  94. }
  95. - (void)setTimeZone:(NSTimeZone *)timeZone forEvent:(EKEvent *)event {
  96. if (event && self.authorized) {
  97. event.timeZone = timeZone;
  98. }
  99. }
  100. - (void)setStartDate:(NSDate *)startDate forEvent:(EKEvent *)event {
  101. if (event && self.authorized) {
  102. event.startDate = startDate;
  103. }
  104. }
  105. - (void)setEndDate:(NSDate *)endDate forEvent:(EKEvent *)event {
  106. if (event && self.authorized) {
  107. event.endDate = endDate;
  108. }
  109. }
  110. - (void)setCalendar:(EKCalendar *)calendar forEvent:(EKEvent *)event {
  111. if (event && self.authorized) {
  112. event.calendar = calendar;
  113. }
  114. }
  115. - (void)addAlarm:(EKAlarm *)alarm forEvent:(EKEvent *)evnet {
  116. if (evnet && alarm && self.authorized) {
  117. [evnet addAlarm:alarm];
  118. }
  119. }
  120. #pragma mark - 保存/删除事件
  121. - (void)saveEvent:(EKEvent *)event withCompletion:(commitResultBlk)blk {
  122. if (event && self.authorized) {
  123. NSError *error;
  124. [self.store saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
  125. BOOL result = error ? NO : YES;
  126. if (blk) {
  127. blk(result, error);
  128. }
  129. }
  130. }
  131. - (void)removeEvent:(EKEvent *)event withCompletion:(commitResultBlk)blk {
  132. if (event && self.authorized) {
  133. NSError *error;
  134. [self.store removeEvent:event span:EKSpanThisEvent commit:YES error:&error];
  135. BOOL result = error ? NO : YES;
  136. if (blk) {
  137. blk(result, error);
  138. }
  139. }
  140. }
  141. @end