見出し画像

Adjustを用いたFirebase Dynamic Linksの移行

🎄この記事は、NAVITIME JAPAN Advent Calendar 2024の6日目の記事です。


こんにちは、KTANです。
ナビタイムジャパンでiOS/Androidアプリ開発を担当しています。

今年の10月に、『NAVITIME』のルート検索結果をダイナミックリンクとして共有できる機能がリリースされました。私はこの機能の開発を9月まで担当していました。

実は、この機能は以前の『NAVITIME』アプリにも存在していましたが、当時は『Firebase Dynamic Links』を使って実装していたため、2025年8月25日のサービス終了後も問題なく運用するには、他のサービスに移行する必要がありました。しかし、リニューアル時には適切な移行先が見つからず、機能を一時的に停止することとなりました。

しかし、代替サービスとして『Adjust』を利用することで同じ機能が実装できることが分かったため、今回めでたくリリースできる運びとなりました。

この記事は、そこで得られた知見についてまとめています。
自分と同じように『Firebase Dynamic Links』の移行を検討している方々に向けて書きました。参考になりましたら幸いです。


開発したアプリの機能

今回開発した機能は、アプリで検索したルート検索結果をテキストとして共有する際に、同じルートを再検索してアプリで確認できるダイナミックリンクを作成するというものです。
これによって、ダイナミックリンクをメモするだけで、ルート検索結果をいつでもアプリで再確認でき、そこから最新の運行情報を確認したり、条件を変更して再検索などができるようになりました。

ダイナミックリンク作成方法
ダイナミックリンクをタップした後の流れ(アプリインストール済)

移行が必要となるFirebase Dynamic Linksの機能

『Firebase Dynamic Links』は複数の機能を提供していますが、今回のルートをアプリで再検索するダイナミックリンクを作成するために必要なのは以下の3つです。

  1. ワンクリックで、デバイスに合ったストアにユーザーを誘導する(必要に応じてウェブページにフォールバック)

  2. アプリ内のディープリンク コンテンツを通じて、コンテキスト エクスペリエンスをユーザーに提供する(インストール済みの場合)

  3. 短縮リンク URL を作成する

①は、作成したダイナミックリンクをタップしたユーザーが、アプリ未インストールの場合、アプリを起動してルートを表示することができないため、まずはアプリをインストールしてもらうようにストアに遷移させる必要があります。そこで、ユーザーが iOS / Android / PC のどのデバイスで確認した場合でも、『App Store』や『Google Play』などデバイスに合わせたストアに遷移させるために必要となります。

②は、作成したダイナミックリンクをタップしたアプリインストール済のユーザーに対して、アプリを起動してルート検索結果を表示するために必要です。

③は、ダイナミックリンクを作成する際に、再検索に必要となるルート検索の細かい条件を全てパラメータとしてリンクに付与することで、ダイナミックリンクが非常に長くなってしまうため、ユーザーに扱いやすいようにリンクを短縮化する際に必要です。

今回①と②は『Adjust』を、③は自社のURL短縮サービスを利用して移行しました。

公式ドキュメントにて、移行先のサービスとして、『Adjust』、『AppsFlyer』、『Bitly』、『Branch』、『Kochava』が紹介されていますが、どれも利用料金が発生したり、無料では制限があったりするサービスであるため、元から『NAVITIME』アプリで導入していた『Adjust』を選択することになりました。

Adjustのディープリンク設定方法

①と②の機能は『Adjust』のユニバーサルリンクを設定して、カスタムURLスキームを使用したディープリンクを設定することで実現することができます。

具体的な設定方法については、『Adjust』の開発者向けドキュメントにも記載がありますが、文章のみで少し分かりにくいため、ここでは詳細な手順を画像と共に紹介したいと思います。

1.左側のメニューから「Campaign Lab」→「カスタムリンク」を選択

2.右上の「+新規リンク」を選択

3.対象となるアプリのプラットフォームをすべて選択

4.カスタムリンクの名前を設定(名前は仮にrouteとする)

※ 集計のためにキャンペーンやアドグループといったラベル付けも可能ですが、リンクの機能自体とは関係ないため、ここでは割愛します

5.アプリをインストールしたユーザーの遷移先で「アプリ内画面」を選択

6.リダイレクト、フォールバックはデフォルトの「アプリストア」を選択

※ ここで①の遷移先を自由に設定できます。デフォルトはアプリストアですが、アプリストア以外にも任意のURLを設定可能です。

7.アトリビューションはデフォルトのまま「次 >」を選択

※ アトリビューションの設定も、リンクの機能自体とは関係ないため、ここでは割愛します

8.ソーシャルメディア共有プレビューもデフォルトのまま「次 >」を選択

※ SNS投稿時のリンクのプレビューを設定できますが、設定しても③のURL短縮化によって表示されなくなるため、割愛します。

9.選択内容を確認して「リンクの作成」を選択

10.作成したURLの「リンクトークン」をコピー(仮に1234_abcdとする)

11.リンクトークンとカスタムURLスキームからディープリンクを作成

下記のようにURLにパスとパラメータを設定することで、ディープリンクが完成します。

https://app.adjust.com/{リンクトークン}?deeplink={カスタムURLスキーム}

例えば、リンクトークンが「1234_abcd」、『NAVITIME』アプリでルート開くカスタムURLスキームが「navitime://routesearch?start=0000123&goal=0000456&starttime=202412241030」の場合は、ディープリンクは

https://app.adjust.com/1234_abcd?deeplink=navitime%3A%2F%2Froutesearch%3Fstart%3D0000123%26goal%3D0000456%26starttime%3D202412241030

上記のようになります。

このリンクをタップすることで、アプリ未インストールの場合は、デバイスに応じたストアページに遷移し、アプリインストール済みの場合は、『NAVITIME』アプリが起動してルート検索結果が表示されるという、①と②の機能が実現できます。

ただ、上記を見てもわかるように、deeplinkクエリに渡すカスタムURLスキームはURLエンコードする必要があるため、全体として非常に長いディープリンクになってしまいます。

このままではコピーしたり、メモとして保存、LINEやメールで送信などする場合に非常に不便ですし、SNSの投稿文字数上限などの影響も受けてしまいます。

そのため、③のURLの短縮化が必要となります。

短縮URLの作成

作成したダイナミックリンクをユーザーに扱いやすいリンクにするため、URLの短縮化がどうしても必要となりますが、2024年12月現在、『Adjust』は、ドキュメントに記載がある通り任意のURLを渡して、そのURLを短縮してくれるサービスを提供しておらず、『short.io』などの外部サービスを利用することを推奨しています。

ただし、代わりに『Adjust』は『Deep link generator API』(公式ドキュメント)というAPIを提供しています。
これは、上記で解説したディープリンクの作成を、コンソール上で手動で行うのではなく、APIで作成できるサービスです。
そして、このAPIには、作成時にディープリンクを短縮化するパラメータが存在しているため、このAPIを使えば、『Adjust』で作成したディープリンクも短縮URLとして作成することが可能です。

例えば、上記で説明したディープリンクと全く同じリンクを、このAPIを使って短縮URLとして作成する場合、下記のようなリクエストになります。

curl --location 'https://automate.adjust.com/engage/deep-links' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer adjustApiToken' \
--data '{
    "link_token": "1234_abcd",
    "deep_link_path": "navitime://routesearch?start=0000123&goal=0000456&starttime=202412241030,
    "shorten_url": true
}'

リクエストサンプル

しかし、このAPIはディープリンクの作成とURLの短縮を同じタイミングでしか行えないということに注意が必要です。
あらかじめディープリンクの作成をしておき、必要に応じて後から短縮化を行うという運用はできません。
例えば、今回開発した『NAVITIME』のサービスでは、ルート検索時にそのパラメータから短縮化されていないダイナミックリンクを作成しておき、ユーザーがルート結果を共有するタイミングで、そのダイナミックリンクを短縮化するという設計になっています。

しかし、『Deep link generator API』ではこの方式は採用できず、ダイナミックリンクを作成するルート検索時に、このAPIをリクエストして短縮化されたディープリンクを作成する必要があります。そのため、ユーザーがルートを共有するかどうかに関わらず、常にルート検索時にこのAPIをリクエストする必要があり、無駄な通信が増えてしまいます。

また、ドキュメントにも記載がある通り、このAPIには1秒間に200リクエストまでというアクセス制限と、作成した短縮URLは120日間まで利用可能という有効期限が存在します。
今回開発した『NAVITIME』のルート検索結果を再現するダイナミックリンクでは、制限なしでダイナミックリンクの作成とそのリンクからルートの復元を行いたかったため、『Deep link generator API』は採用しませんでした。

そのため、③のURL短縮化については『Adjust以外のサービスで移行を検討することになりました。

しかし、URL短縮化サービスは、基本的に有料のサービスが殆どです。また、無料で利用できたとしても、一定期間に何回までといった、時間単位のアクセス制限があります。『NAVITIME』アプリのユーザー数が非常に多いため、その数に応じて作成したダイナミックリンクを短縮化する回数も増え、どうしてもアクセス制限に引っかかります。

また、URL短縮化サービスの運営元によっては、そのサービスで短縮化したURLがいつまで使えるかという保証がありません。いくら無料だったとしても、個人が運営していたりすると、突然サービスを終了し、これまでに短縮化したURLも全て使えなくなってしまうということも考えられます。

上記のような理由から、今回は外部のURL短縮化サービスではなく、ナビタイムジャパン社内で独自に開発したURL短縮化サービスを使うということになりました。

もちろん、独自のURL短縮化サービスは容易に作れるものではないので、一般的には、有料サービスの料金運営元の信頼性、アプリの想定アクセス数開発コストなどを考慮して、『Deep link generator API』や外部のURL短縮化サービスを使うのかどうかをきちんと検討した方が良いです。

注意点

今回のように、①と②のディープリンクを作成するサービス(今回は『Adjust』)と③のURL短縮化サービス(今回はNAVITIME)が異なる場合は、短縮化の前後でドメインが異なるURLとなります。

短縮化URL(NAVITIMEドメイン)
↓ リダイレクト
ディープリンク(Adjustドメイン)

セキュリティリスクがあるパターン

こういった短縮したURLのドメインと短縮する前のURLのドメインが異なる場合は、セキュリティリスクの注意が必要です。

短縮URLは短縮する前のURLへリダイレクトすることになるので、ユーザーが短縮URLをタップした際に、短縮URLとして見えてるドメインからユーザーに見えてない外部ドメインに勝手にリダイレクトすることになります。

上記のように短縮化URLを使って、ユーザーの意図しないサイトへリダイレクトさせる動きは、フィッシングサイトやランサムウェアといった不正サイトへの誘導によく利用されており現在もその傾向は続いています

そのため、ユーザーがセキュリティ対策ソフトなどをスマートフォンに導入している場合は、短縮URLをタップしても、フィッシングサイトと判断して警告が表示され、ディープリンクへのリダイレクトがブロックされてしまう可能性があります。

一応、『Adjust』にはブランドドメインという、カスタムリンクのドメインをapp.adjust.comからxxxxxx.go.linkという形の文字列のドメインに変更する機能もありますが、あくまでドメインの一部にアプリ名や会社名を入れて、安全なリンクであるように見せることができるだけで、ドメインの所有者は変わらずAdjust』のままですので、このセキュリティリスクを回避することはできません。

そこで、このセキュリティリスクを回避するため、今回の『NAVITIME』アプリでルートを再検索するダイナミックリンクでは、短縮URLから外部サイトへリダイレクトする前に確認ダイアログを表示し、ユーザーの確認をとってから外部サイトへリダイレクトさせるようにしています。

短縮化URL(NAVITIMEドメイン)
↓ リダイレクト
確認ダイアログ表示ページ(NAVITIMEドメイン)
↓ 「OK」選択後、リダイレクト
ディープリンク(Adjustドメイン)

セキュリティリスクがないパターン
確認ダイアログ

このように確認ダイアログを表示することで、リダイレクト先の外部ドメインが不正なサイトではないことをユーザーに明示し、セキュリティ対策ソフトの誤検知を防ぎます。

今回は、コストの面から、制限のないURL短縮サービスを提供していないAdjust』を移行先として選択したため、仕方なくこのような実装となりましたが、もちろんユーザーにとっては確認ダイアログなしで短縮URLからすぐにディープリンクでアプリが起動してくれた方が便利なのは間違いありません。
AppsFlyer』や『Bitly』など、①と②のディープリンクの作成と③のURL短縮サービスどちらも提供しているサービスもあるため、こちらを利用すれば短縮URLからのリダイレクト先も同じドメインとなり、確認ダイアログなしでセキュリティリスクも回避できます。
ですので、もし『Adjust』を元から導入していなかったり、『AppsFlyer』や『Bily』のサービス利用料金が問題ないと判断できるならば、『Adjust』ではなくこれらのサービスを選択した方が良い場合もあります。

まとめ

今回は、『Firebase Dynamic Links』を『Adjust』で移行した経験で得られた知見をまとめました。
結論として『Firebse Dynamic Links』を『Adjust』で移行する際には、制限のないURL短縮機能は外部サービスを利用する必要があり、その際はドメインの違いによるセキュリティリスクに注意すべきということです。
既に『Adjust』をアプリに導入していて、『Firebase Dynamic Links』 の移行を検討している場合は、上記の点を考慮して、『Adjust』を利用するのか、それとも他のサービスを利用するかを検討していただければと思います。

また、冒頭でご紹介した通り、メールやLINE、カレンダーにテキストとして共有したルート結果がいつでもアプリで確認できるダイナミックリンクが追加されたiOS/Android版『NAVITIME』アプリが既にリリースされています。
予定の当日に最新の状況をチェックしたい時など、ぜひ利用してみてください!