iOSのEventKitでiPhoneのカレンダー情報を読み取る方法
公開日:
:
最終更新日:2012/12/19
iOSアプリ開発
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
こんにちは。アキオ(@akio0911)です。
先日はカレンダー・リマインダーにアクセスしているアプリをiOS 6のプライバシー設定に対応させる方法を解説しましたが、今回はiPhoneのカレンダー情報を読み取る方法を解説したいと思います。
関連 : カレンダー・リマインダーにアクセスしているアプリをiOS 6のプライバシー設定に対応させる方法
EKEventStoreオブジェクトを生成する
iOSのカレンダー情報にアクセスするには、EKEventStoreクラスのオブジェクトを使います。
以下はEKEventStoreのオブジェクトを生成するコード例です。
_eventStore = [[EKEventStore alloc] init];
カレンダー情報へのアクセスに対する許可状況を確認する
カレンダー情報にアクセスする前に、authorizationStatusForEntityType:メソッドを使って、カレンダー情報へのアクセスの許可状況を確認する必要があります。
詳しくはカレンダー・リマインダーにアクセスしているアプリをiOS 6のプライバシー設定に対応させる方法をチェックしてみて下さい。
カレンダーの配列を取得する
calendarsForEntityType:メソッドを呼び出して、カレンダーの配列を取得します。
以下はそのコード例です。
NSArray *eventCalendars = [_eventStore calendarsForEntityType:EKEntityTypeEvent];
イベント情報を検索する為のNSPredicateオブジェクトを作成する
predicateForEventsWithStartDate:endDate:calendars:メソッドを使って、イベント情報を検索する為のNSPredicateオブジェクトを作成します。
以下は、1日前から1年後までのイベント情報を検索するNSPredicateオブジェクトを作成するコードです。
NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init]; oneDayAgoComponents.day = -1; NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents toDate:[NSDate date] options:0]; NSDateComponents *oneYearFromNowComponents = [[NSDateComponents alloc] init]; oneYearFromNowComponents.year = 1; NSDate *oneYearFromNow = [calendar dateByAddingComponents:oneYearFromNowComponents toDate:[NSDate date] options:0]; NSPredicate *predicate; predicate = [_eventStore predicateForEventsWithStartDate:oneDayAgo endDate:oneYearFromNow calendars:eventCalendars];
イベント情報を検索する
作成したNSPredicateオブジェクトをeventsMatchingPredicate:メソッドに渡して、イベント情報を検索します。
以下は、検索したイベント情報をNSLogで出力するコード例です。
NSArray *events = [_eventStore eventsMatchingPredicate:predicate]; for(EKEvent *event in events){ NSLog(@"%@ - starts at %@", event.title, event.startDate); }
コード例
- (IBAction)pressFetchEvent:(id)sender { if(_eventStore == nil){ _eventStore = [[EKEventStore alloc] init]; } EKAuthorizationStatus authStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]; switch (authStatus) { case EKAuthorizationStatusAuthorized: [self accessEvents]; break; case EKAuthorizationStatusDenied: case EKAuthorizationStatusRestricted: [self presentDeniedAlert]; break; case EKAuthorizationStatusNotDetermined: [_eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { if(granted){ [self accessEvents]; }else{ [self presentDeniedAlert]; } }]; break; } } - (void)accessEvents { NSArray *eventCalendars = [_eventStore calendarsForEntityType:EKEntityTypeEvent]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init]; oneDayAgoComponents.day = -1; NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents toDate:[NSDate date] options:0]; NSDateComponents *oneYearFromNowComponents = [[NSDateComponents alloc] init]; oneYearFromNowComponents.year = 1; NSDate *oneYearFromNow = [calendar dateByAddingComponents:oneYearFromNowComponents toDate:[NSDate date] options:0]; NSPredicate *predicate; predicate = [_eventStore predicateForEventsWithStartDate:oneDayAgo endDate:oneYearFromNow calendars:eventCalendars]; NSArray *events = [_eventStore eventsMatchingPredicate:predicate]; NSLog(@"Events this week"); for(EKEvent *event in events){ NSLog(@"%@ - starts at %@", event.title, event.startDate); } }