Debug/Release環境の切り替えを整えたあと、身内から「機種変更したらデータが全部消えた」と言われてしまいました。データは端末内にしか保存しておらず、複数端末での同期に対応していなかったのです。今回はCloudKitでのiCloud同期に挑戦した記録です。
1. 「同期」の意味を誤解していた
最初は、CloudKitを導入すれば自動的にリアルタイムで全端末のデータが揃うものだと思い込んでいました。
CloudKit: iCloudを経由してデータを保存・同期する仕組み
SwiftDataと組み合わせることで、複数端末間の同期を実現できる
実際に試してみると、同期には数秒から数分のタイムラグがあり、「保存したら即座に他の端末にも反映される」という理想とは少し違いました。同期は非同期的に行われるものであり、即時性を前提にした設計は見直す必要があると気づきました。
2. 実機でしか動作確認できないと知らなかった
シミュレーターでCloudKitの同期を試そうとしたところ、うまく動かず時間を無駄にしてしまいました。
シミュレーターでもある程度は動作しますが、実際のiCloudアカウントを使った同期の挙動を正確に確認するには実機が必要でした。プッシュ通知のときと同様、Appleのサーバーと連携する機能は実機確認が前提になると改めて実感しました。
3. 同じiCloudアカウントでないと同期されないと後から気づいた
一通り実装が終わり、自分のiPhoneとiPadで試したところ問題なく同期できたのですが、身内のiPadで試したところ全く同期されませんでした。
CloudKitの同期は、同じApple ID(iCloudアカウント)の
端末間でのみ行われる(プライベートデータベースの場合)
冷静に考えれば当たり前の仕組みですが、「同じアプリなら誰とでも同期できる」と思い込んでいたため混乱しました。複数のユーザー間でデータを共有したい場合は別の設計(CloudKitの共有機能や、独自のサーバーを用意するなど)が必要だと理解しました。
4. 同時編集で競合が起きたときの挙動に驚いた
テストのために、2つの端末でほぼ同時に同じデータを編集してみたところ、片方の変更が上書きされて消えてしまう場面がありました。
CloudKitの初期設定: 基本的に「後から保存した方」が優先される
複数端末で同時に編集される可能性があるデータについては、単純な上書きではなく、変更内容をユーザーに提示して選ばせるような設計が必要になる場合があると学びました。今回のアプリでは頻度が低いと判断し、ひとまず「後勝ち」のままにしていますが、今後の課題として認識しています。
まとめ
- CloudKitの同期は即時ではなく、数秒〜数分のタイムラグがあることを前提に設計する
- 実際のiCloudアカウントを使った同期の挙動は、シミュレーターではなく実機で確認する
- 同期は同じiCloudアカウントの端末間でのみ行われる。別ユーザー間の共有には別の仕組みが必要
- 同時編集による競合は基本的に「後から保存した方」が優先される。重要なデータは競合解決の設計も検討する
「同期させれば解決」という単純な話ではなく、タイムラグや競合といった分散システムならではの課題に向き合う機会になりました。
次は、Combineを使ってみて分かったことをまとめます。
本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。


コメント