概要
iOSのURLスキームが意外と脆弱だから気をつけた方が良いよと言う話をします。
※違うよ、とかあれば気軽にコメント頂ければ幸いです
※すみません、間違って一度記事を削除してしまいました。。orz もう一度再掲します
iOSのURLスキームについて
下記のようにURLスキームを叩くことがあると思うのですが、
hoge://〜
これってどの情報を元にどのアプリがこのURLスキームを受けるか決めているのでしょうか。
答えとしては、どのアプリが受け取ると言う情報が入っている訳ではありません。
なので
AアプリとBアプリでそれぞれ同じプロトコル名で受け取るようにしていた場合、どちらがそのURLスキームを受け取るかわかりません
(過去に確認した挙動だと、先にインストールされている方のアプリが受け取るようです)
Aアプリ
hoge://〜
を受け取るように実装
Bアプリ
hoge://〜
を受け取るように実装
奪い取りたいURLスキームのプロトコルなんて他の人わからないじゃんって思うかもしれませんが、
ツールなどで結構に気軽に他のアプリが受け取るURLスキームは調べることはできるようです。
Androidの場合は下記のように(アプリのパッケージ名)を指定することで起動するアプリを指定できます。
intent://〜#Intent;package=(アプリのパッケージ名);scheme=hoge;end;
SFSafariViewControllerの例外
アプリからSFSafariViewControllerを開きURLスキーム(Deeplink)で戻ってくることがあると思いますが、
その場合はSFSafariViewControllerを開いたアプリが優先的にURLスキームを受け取るようで、
他のアプリに先に奪い取られてしまうことはないようです。
まとめ
iOSでSFSafariViewController以外でURLスキームを送信・受信する際は、セキュリティに影響するような情報の受け渡しはやめよう。
iOSのURLスキームは他のアプリが受け取る可能性があることを考慮しよう。