ObjecTips

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

デフォルトの EKSource について その2

前回の記事で、デフォルトでは2つの EKSource が存在する事について書いた。

iCloud のアカウントを設定するとさらに EKSourceTypeCalDAV EKSourceTypeSubscribed の2つのソースが追加される。
一覧は以下

title sourceType EKSourceTypeの値 備考
Default EKSourceTypeLocal 0
Other EKSourceTypeOther 5 Private
iCloud EKSourceTypeCalDAV 2
Subscribed Calendars EKSourceTypeSubscribed 4

iCloud のリマインダーを有効にするとリマインダーのデータが iCloud に統合され Default EKSourceTypeLocal 内のリマインダーのリストはすべて iCloud EKSourceTypeCalDAV に移動する。

Default EKSourceTypeLocalEKSource はソースの一覧には存在しているが、このソースを指定して新しいリストを作成しようとしてもエラーが起きてリストを作成する事はできない。

Domain=EKErrorDomain Code=24 "That account does not support reminders." UserInfo=0x15ed2580 {NSLocalizedDescription=That account does not support reminders.}

エラーコードを EKError.h で確認すると

EKErrorSourceDoesNotAllowReminders      You are trying to add a calendar that allows reminders to a source that does not allow them.

となっている。
iCloud 同期中はローカルのリマインダーには書き込み出来なくなるというのが仕様らしい。

新しいリマインダーのリストを作成する時はソースの一覧から iCloud EKSourceTypeCalDAV を探して、存在しなければ Default EKSourceTypeLocal を作成するようにするか、ユーザが設定しているデフォルトのリマインダーリストと同じソースを利用するといった方法が考えられる。
後者の方がスマートかな。