独自の sqlite データベースを持ち、カレンダー フレームワークから EKEvent にアタッチするミーティング プランナー アプリがあります。イベント ID を会議データの外部キーとして使用しています。この問題は、ユーザーがカレンダー アプリケーションでイベントのカレンダーを変更したときに発生します。識別子が変更され、アプリの外部で作成されたため、変更されたことを知る方法がありません。誰かアイデアがあれば教えてください
3 に答える
iOS 5.0以降、イベントを確実に一意に識別する方法はありません。
ドキュメントには、「イベントのカレンダーが変更されると、その識別子も変更される可能性が高い」と警告されています。
もう 1 つの落とし穴は、繰り返しイベントのすべてのインスタンスが同じ識別子を持つことです。-[EKEventStore eventWithIdentifier:]
最初のインスタンスを返すようです。(識別子が nil のイベントも見たことがあります。正確な原因は思い出せません。)
-eventWithIdentifier:
繰り返しのないイベントが返された場合は、おそらく問題ありません。それ以外の場合、これらの両方を回避する最も簡単な方法は、ほぼ同時にすべてのカレンダーでイベントを検索し、ヒューリスティックを使用して最適な一致を判断するか、適切な一致がない場合は対応するイベントを選択するようユーザーに依頼することです。
また、繰り返し予定の 1 つのインスタンスを編集するときに Google カレンダーがどのように動作するかを確認することもできます (新しい識別子で予定が作成され、元の予定の繰り返し情報に「穴」が追加され、ヒューリスティックが壊れる可能性があります)。
私は今、この問題に直面しています。EventStore をアプリの内部 DB と同期させようとしています。私の解決策は、EKEvents とアプリ内のイベントの間のマッピングを作成することです。一致しない EKEvents は削除され、一致しないすべての EKEvents が追加されます。これにより、変更されたばかりの EKEvents も同期中に追加されます。