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);
}
}



