オフラインでリアルタイム同期？注目の『Ditto』を使ってみた

## はじめに
以前書いた記事「[Multipeer Connectivityを使用して共有できるメモアプリ作成してみた](https://qiita.com/takeshi-ookane/items/730bdda84a2066f429e8)」を検証中に、「**Ditto**」に出会いました。
「エッジコンピューティング」や「P2P/メッシュ通信」は、インターネット接続が不安定な環境でも端末同士が直接情報をやり取りできるため、データの共有や更新がスムーズに行えます。
私は、こうした技術が現場での業務効率化やDX（デジタルトランスフォーメーション）を進めるうえで、欠かせない重要な要素だと考えていました。

## Dittoとは
Dittoとは、米国[Ditto社](https://www.ditto.com/)の提供する「インターネットに依存しない分散データ同期プラットフォーム」です。
* BluetoothやWi-Fiを用いたP2P通信
* エッジコンピューティング
* マルチプラットフォーム

BluetoothやWi-Fiを用いたピア・ツー・ピア（P2P）通信によって、中央サーバーに依存しないリアルタイム同期を実現できます。
またDittoを導入することでエッジ端末同士が直接データをやり取りできるようになります。すなわち、ネットワークが不安定でも現場のデバイス間でリアルタイムにデータを共有・保存できるようになります。
![ditto_advantage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796389/26bf61bc-b118-462e-9088-0f60e0999def.png)


## Dittoを活用するメリット
### オフライン環境でも端末同士でデータを保持・相互にデータを同期できる
多くの業務現場（例えば空港、倉庫、建設現場、医療施設、イベント会場など）では、必ずしも安定したインターネット接続が得られるとは限りません。DittoはBluetoothやWi-Fi Directなどを使ったピア・ツー・ピア（P2P）通信により、インターネットに依存しないデバイス間のリアルタイム同期を実現しています。
### 導入が簡単
開発者向けのSDK（ソフトウェア開発キット）が非常に充実している点も大きな強みです。Swift、 Kotlin、React Native、Flutter、.NET、JavaScript、C++ など、幅広いプラットフォーム向けに最適化されており、アプリ開発への統合がスムーズです。

## ユースケース
すでに様々な場所でDittoは活用されています。
### 航空機内でのCAの連絡手段
インターネット接続がない航空機内でも、CA（客室乗務員）同士がリアルタイムに情報を共有できる連絡手段として活用されています。

### 店舗での注文
飲食店において、ネットワークが不安定な状況でも注文情報をスタッフ間で確実に共有・同期するために利用されています。
## プランについて
簡単にプランについても触れます。詳しくは公式サイトを参考にしてください。
今回の検証ではFreeプランを使用しています。
実際のアプリに組み込んで本番リリースするには、Pro以上のプランは必須です。セキュリティ要件によってはEnterpriseプランを選択します。
|  | Free | Pro |Enterprise|
|:-:|:-:|:-:|:-:|
|  クラウド接続台数 | 10台  | 1000台以上<br>（追加可能） |　カスタム |
|  ストレージ | 2GB  | 50GB |　カスタム |
|  クラウドサポート | AWS  | AWS |　AWS, Azure, GCP |
|  導入形態 | Ditto-Hosted  | Ditto-Hosted |　BYOC |
| 価格  | 無料で開始可能  | 月額999USD~ |　お問い合わせ |
## Dittoを使ってみる
Dittoでは無料のPlaygroundが用意されています。技術ドキュメントも豊富に用意されているため、素早く簡単に試すことができます。
今回は自身の経験を踏まえたデモアプリを作成してみました。

### 新潟旅行の経験
新潟の越後湯沢に旅行した際のことです。
ちょうどスノーシーズン真っ只中で、スキーやスノーボードを楽しむ観光客で駅は大混雑していました。人が多すぎたためにスマートフォンの通信がほとんど使えない状態に陥っていました。

さらに不便だったのは、駅構内の飲食店で食事を注文した際に注文状況がレジ前のディスプレイにしか表示されなかったことです。注文状況をスマホで確認できる仕組みがあれば、レジ前で待たずに済み、混雑した駅の中でも自由に動けて便利だったと感じました。

この経験から、「オフラインでも注文状況を確認できるアプリがあればいいのに」と考えました。インターネット接続に依存せず、店内の端末やお客さんのスマホ間で情報を共有できる仕組みがあれば、多くの混雑した場面で役立つはずだと考えました。

### 作成したデモアプリ
今回は、注文番号が「呼び出し待ち」と「呼び出し済み」のどちらの状況にあるか確認できるものです。また、注文状況を変更できる画面も作成しました。
[Dittoのドキュメント](https://docs.ditto.live/home/introduction)が充実しているので、ソースコードについて詳細に書かないです。クイックスタートとして[リポジトリ](https://github.com/getditto/quickstart/tree/main)が用意されているので、そちらを参考に書き換えて行きました。
初めはSwiftで作成していましたが、Androidでも実行しみたかった点、Flutterを勉強したかった点からFlutterでも作成してみました。

下の画像が連携イメージです。
![スクリーンショット 2025-06-04 21.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796389/db310edd-7d3b-4265-bf83-fa82dbaede87.png)

SwiftとFlutterでそれぞれ作成した画面を示します。
![スクリーンショット 2025-06-04 22.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796389/e9351579-2c9d-454e-8479-b56d7fcfd96e.png)


### デモアプリの動作
アップロードできるサイズの問題で粗いです。。。
![output2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796389/b9343ae6-6815-4d1f-b81b-4468c9a3fee1.gif)

## まとめ
Dittoを使ったデモアプリの作成を通じて、リアルタイム同期やオフライン対応を簡単に試せることが実感できました。
特に、エッジコンピューティングやP2P/メッシュ通信により、インターネット接続が不安定な環境でも端末間のスムーズな情報共有が可能です。こうした技術は、現場での業務効率化やDXを進めるうえで、ますます重要になります。

今後は、より複雑なユースケース（ユーザー管理・アクセス制御・セキュリティなど）にも対応できるかを検証してみたいと思います。

## 参考サイト
https://www.ditto.com/

https://note.com/dittocom/n/n5bf6700dae8d

https://zenn.dev/kndoshn/articles/909081c0fbf5eb