withはアプリケーション独自のプロジェクト同期機能(with共有)を持っています。
プロジェクトをiCloud DriveやDropBoxのオフラインフォルダーに置かなくても、同じApple IDを使うデバイス間で原稿を書き継いでいくことができます。
同期開始
プロジェクトのラウンドメニューから他の端末に共有するを選んでください。


共有を開始するとiCloudのCloudKit領域にプロジェクトが送信されます。アップロードが終わると、他の端末のプロジェクトサイドバーに受信可能なプロジェクトが現れます。これをタップすると、with共有プロジェクトが一覧に現れます。


with共有を受信したプロジェクトアイコンにはクラウドのバッヂ、共有している側のプロジェクトアイコンには、サイクルバッヂがつきます。ファイルの実体はデバイスのユーザーライブラリに保存されるので、ネットワーク接続が切れている時でも、原稿を読み書きできます。


with共有を受信したプロジェクトは、扱いやすい位置に実体化することも可能です。用が済んだら一覧から外すことで、受信した端末のファイルは削除されます。一覧から外してもCloudKitには残っているので、いつでも共有を再開できます。
プロジェクトの共有もとで共有を停止することも可能です。この場合、共有を受けている側は、プロジェクトの実体化をするか、削除するかを決めることになります。
プロジェクトのステータス
with共有しているプロジェクトには、いくつかの状態表示が追加されます。普段目にするのは以下の3つでしょう。
- 最新版:手元の原稿が最新版
- 新版を検出:手元の原稿は変更なし他のデバイスで変更を行なった新版がある
- 別版を検出:手元の原稿に変更を加えたが、他のデバイスでも原稿を変更している
最新版の時は何も考える必要がありません。原稿を書けば、自動的にwith共有が最新版に保たれます。
新版を検出、または別版を検出した時は、この通知をクリックして手元の原稿と異なる版をどうするか決めることになります。
共有の扱い方
まず新版を検出した時のケースを説明します。選択肢は「新版を受け入れる」「変更点を確認」「別版を破棄(ダイアログ間違ってました! 直します)」です。

新版を検出するのは、他の端末で書き進めた内容がある時です。Macbookで書き進めた後電車に乗ってiPhoneを立ち上げた時です。大きなミスをしたことがわかっている時はともかく、ほとんどの場合は「新版を受け入れる」ことになると思います。あっちで書いたのは捨てる、ということなら「別版を破棄」すると、手元の原稿が最新版になります。
取り入れるか捨てるかの他に、with共有では「変更点を確認」することができます。変更点を確認して、合流できます。例えば下の例では、6段落目の変更は要らない、というような合流もできるわけです。

合流を終えると、操作した端末の原稿が最新版になります。
操作方法は別版も同じです。こちらは「受け入れる」よりも変更点の確認が大切なのでダイアログの並びが変わりますが、やることは変わりません。ほとんどの場合、with共有を受け入れつつこちらで変更した部分を残すことになると思います。手元で書いた部分のチェックボックスをオフにして合流することで、新しい最新版を作ることができます。

with共有の管理
アプリケーション設定の共有パネルでは、現在のApple IDで共有しているプロジェクトが一覧表示できます。それぞれのwith共有はファイルとして復元するか、with共有を停止して削除することができます。

with共有の使いどころ
withの同期はネットワーク接続ができない環境で、安心して原稿を書くために開発しました。
出勤・通学するときのことを考えてみましょう。
家で最後に書いていた原稿はwith共有にあります。行きの電車で修正したくなったらiPhoneで「新版を取得」すると、家で書いた原稿がiPhoneにやってきます。電車で書いて、iPhoneは会社のロッカーに入れるとしましょう。
昼食休みには、キーボードを繋いだiPadで編集したくなるかもしれません。ところが行ったお店が地下で、ネットワークに接続できなかったりします。それでもiPadのプロジェクトに書くことができます。ご飯を食べて何枚か書いてお店を出たところでiPadをネットに繋ぐとwithは「別版を検出」するはずです。
別版の「変更点を確認」して、いま書いた部分だけチェックを外して「別版を優先してこちらを破棄(ちょっと名前が悪いですね。合流、に変更しておきます)」すると、MacとiPhoneで書いた原稿がiPadに入ってきて、iPadのプロジェクトが「最新版」に変わります。
会社を出て、電車でiPhoneのwithを開くと「新版を検出」していることがわかります。新番を受け入れて書き続ければ、iPhoneが「最新版」に変わります。家に帰ったら、Macで「新版を受け入れる」。
これがwith共有の代表的なワークフローです。
Gitの差分(diff)と統合(merge)に近い機能ですが、withの変更点検出では「ファイルの順序」や「段落の移動」を検出して、どんな変更か知ることができます。また、同じユーザーが書き続けるwithにはGitHubにあるような変更の提案(PR)に似た仕組みもありません。with共有にあるのが新版なら受け入れればいいし、別版が出てきたなら手元で書いた分だけ合流すればいい、という仕組みです。
Gitで実装することも考えたのですがiOSでGitを動かすハードルが高かったので、独自実装することになりました。インターフェイスは独自ですが、アルゴリズム面ではGitにできないことはやらないようにしているので、iOS用のGitをAppleが用意してくれればGit実装に変わるかもしれません。
iCloudやDropBoxを使う同期は「取り込む」作業が必要ない反面、ネットワークのない場所でプロジェクトを修正することに危険が伴います。ネットワークに繋がった時にどちらかの作業が上書きされてしまう危険もありますし、段落ごとに合流するような機能はありません。この不便を解決するために多くのエンジニアはGitを使いますが、クラウドドライブの多くは.gitを上手く扱うことができませんね。困ったものです。
withの共有は、iCloud Driveの利便性とGitの安心の両方が欲しいというわがままのために作りました。
奄美大島に帰省する際、機内で仕事を続けたくなることが多々あるのですが、LCCを選ぶこともあって、いつもMacbookを載せられるテーブルが使えるわけではありません。iPhoneで書いて、途中からMacbookで書いて、着陸する前はiPhoneに戻るようなこともあるのです。withを作ってからは安心してデバイスを持ち替えられるようになりました。手元にある端末の原稿が多少古くても、安心して書けるのは嬉しいものです。
そして今日後悔したwith story 1.1.6とwith to go 1.1.5ではwith共有のレスポンスと信頼性を大幅に強化しています。ぜひ試してみてください。
