ObjecTips

Swift & Objective-C で iOS とか macOS とか

デフォルトの EKSource について

EKSource

上記コードでカレンダーへのプライバシーアクセスとリマインダーへのプライバシーアクセスを表示して全ての EKSource の配列を取得できる。
このソースは iCloud や CalDav を設定する事で増減するが、デフォルトでは2つのソースが用意されている。

1つは titleDefaultsourceTypeEKSourceTypeLocaliPhoneの端末ローカルで管理されるデータベースのソースになる。
もう1つは titleOthersourceType はヘッダに定義されていない 5 の定数が与えられている。
この Other の EKSource オブジェクトをログ出力すると

type = Other; title = Other;

と表示されるので、公開ヘッダに定義されている

typedef enum {
    EKSourceTypeLocal,
    EKSourceTypeExchange,
    EKSourceTypeCalDAV,
    EKSourceTypeMobileMe,
    EKSourceTypeSubscribed,
    EKSourceTypeBirthdays
} EKSourceType;

この定数に加えておそらく内部では EKSourceTypeOther が追加されていると考えられる。

まとめるとデフォルトのソースは以下になる。

title sourceType EKSourceTypeの値 備考
Default EKSourceTypeLocal 0
Other EKSourceTypeOther 5 Private
Local EKSource

Local のソースは EKEvent 扱う場合のデフォルトのソースとなっていて、EKReminder を扱う場合のデフォルトのソースにもなっている。
ただし、

[localSource calendarsForEntityType:EKEntityTypeEvent];

で取得できる EKEvent 用の EKCalendar

[localSource calendarsForEntityType:EKEntityTypeReminder];

で取得できる EKReminder 用の EKCalendar は別々のカレンダーが割り当てられている。

Other EKSource

Other のソースは EKEvent 用のソースで、誕生日用の EKCalendar が入っている。
誕生日のカレンダーの type プロパティは EKCalendarTypeBirthdayallowsModify が NO となっている。
このカレンダーの性質上、おそらく AddressBook.framework の内部で使われている専用のカレンダーで EventKit.framework からはアクセスできないようになっていると思われる。

注意事項

Private な定数 EKSourceTypeOtherEKSource はリマインダーのみを扱う場合には関係無いので、リマインダーアプリでソース一覧を表示する必要がある場合には標準のリマインダー.appのUIに習ってこのソースをリストから除外して表示すると良い。