iOS5まではEKEnentStoreをインスタンス化してそのクラスをとおしてカレンダーデータにアクセスすればよかった。だがiOS6以降からはユーザーにカレンダーデータにアクセスしてもよいか許可を得るメソッドを追加しないとカレンダーデータにアクセスできなくなった。
そのメソッドがEKEventStoreクラスの
requestAccessToEntityType:completion:
というメソッド。
Appleのリファレンスで確認してみるとこのメソッドは
- 初回起動時にカレンダーデータにアクセスしてもよいかをユーザーに問うプロンプトを非同期で表示。
- ユーザーが選択したあとは完了ハンドラやEKEventStoreChangedNotificationが呼ばれる。ユーザーがカレンダーデータアクセスに拒否する場合も考えてEKEventStoreが空の場合の処理もしておく。
- プロンプトを出す前にカレンダーデータにアクセスした場合、一旦resetメソッドでリセットしないとカレンダーデータにアクセスできない。
というようなことが書いてある。
実際に今までのコードにrequestAccessToEntityType:completion:のメソッドを追加すると初回起動時にプロンプトが出てきて、許可するとちゃんとiPhone標準カレンダーの予定が表示された。
また「設定」→「プライバシー」→「カレンダー」の欄にもアプリ名が表示され、ここをOFFにすると今度は表示されなくなった。EKEventStoreが空の場合の処理もちゃんと反映されている。
意外と簡単に修正できてよかった。こんどからiOSアップデート時は気をつけないと。