日記アプリで大変評価の高いDay Oneが発売以来5年を経てメジャーバージョンアップを行い、新規アプリとしてリリースされました。
新バージョン移行に際して、よく考えられた導線を用意しており、感心したので軽く書いておきます。
URLスキームの競合問題
これまで新バージョンが別アプリとして出た場合にはURLスキームの競合による問題が発生してきました。
それは旧アプリと新アプリのURLスキームを同一に設定することによる弊害であり、新旧アプリの使い分けが困難になるというものでした。
二つのアプリに同じURLスキームを割り振った場合、どちらが優先して起動するかはわかっていません。
Day Oneでもそうです。
旧アプリにdayone://
新アプリにdayone://
と、2つとも同じURLスキームが割り振られており、私の環境では旧アプリが起動するようになっていました。(これは再インストールで変わる場合があります)
どちらが優先するかわからないというのは厄介な問題で、2つのアプリに1つのURLスキームしか用意されていないというのは、開発者が「インストールするのは1つだけにしろ」と宣告するのに近い状態でした。
いや、両方買ったんだから両方使わせてほしいんですって。
旧来の競合の解消方法
これまでは別々のURLスキームを用意するのが常套手段とされてきました。
Day Oneにも別のURLスキームが用意されています。
旧アプリにはdayone1://
新アプリにはdayone2://
これにより明示的にどちらを起動するかを指定できるわけですが、ユーザーが自分でランチャーなどの設定を変更してやる必要が出てきます。
おそらくURLスキームを活用するユーザーというのは中級者以上でしょうから、自分で変更するのはさほど問題がないと思われますが、過去にいろんな人が作成されたWorkflowやURLスキームアクションなどをすべて書き換えなくてはいけなくなってしまいます。
ですから過去の資産には手を加えなくてもそのまま使えるようにするのが理想でしょう。
その場合、旧アプリを削除するのがもっとも簡単な解決策ではありますが、リリースされたばかりの新アプリが安定しない場合や、事情があってしばらく残しておきたい場合にはとても困ることになります。
これをユーザー側に対処させるのではなく、Day Oneはアプリ側で対処をしてくれました。
Day Oneの競合解消方法
やり方はシンプルです。
dayone://という新旧共通のURLスキームを実行
↓
もし旧アプリが起動した場合には新アプリにリダイレクトをする
これだけ。わかりやすいですね。
もちろん単純な起動だけでなくURLスキームによるデータの受け渡しも可能です。
dayone://post?entry=test
これを実行すると旧アプリからリダイレクトした上で、新アプリにエントリが作成される。
毎回リダイレクトするのが嫌だという人も中にはいるでしょうが、両方をインストールした状態では新アプリを優先するのは妥当なことでしょう。
これにより旧アプリを入れたままでも、過去のURLスキームアクションやWorkflowをそのまま新アプリに対して使えるようになりました。
パワーユーザー向けには旧来の使い分けの導線を用意しつつ、URLスキームを理解していない初心者ユーザーには過去の資産に手を加えることなく新アプリへの誘導を可能としたわけです。
実に素晴らしい施策であると思う。
課題
ただ一つだけ問題があって、
dayone://post?entry=test
dayone1://post?entry=test
dayone2://post?entry=test
実はこの真ん中にある旧アプリにデータを渡すURLスキームだけ現時点では機能しません。
起動はするけど、データを受け取ってはくれない。
一番上は新アプリにリダイレクトしてしまうから、いまのところURLスキームで旧アプリに渡すことができないんです。
たぶん実装を忘れたかバグなんでしょうけど、ここさえクリアしていれば完璧な新旧アプリの共存が完璧となっていただけに惜しいですね。
さいごに
新アプリのリリースに際しては少なからず不具合や旧アプリとの違いに不満が噴出します。
私の環境では大きな問題は起きていないが、レビューには不具合の報告が出ているので、今しばらくは旧アプリとの共存生活が必要になるかもしれない。
ちゃんとしたデベロッパなので不具合はいずれ解消されることと思いますが、不具合の修正を願う人はちゃんと直接報告してあげてください。ストアのレビューはバグ報告をするのに適していませんから。
今回Day Oneが示したリダイレクトという手法は、正確に言えばこれで競合問題が解消したわけではない。しかしどちらが起動するかわからない状態だったURLスキームで新アプリを優先して使うようにすることができるようになったという、開発者がこれまでコントロールできなかった競合URLスキーム問題に一つの解が示されたことを評価したい。まぁひとつ手落ちはありましたけどね。
ユーザーに手間をかけさせないように配慮した、とてもいい解決策だと思います。
これはぜひ他の開発者さんにも真似してほしい
誰に向けて書いてるんだかわからなくなってしまいましたが、誰かの参考になれば。