メインコンテンツまでスキップ

ディープリンクの処理

ディープリンクをアプリケーションで処理する方法について記載します。

ディープリンクタップ時の処理フロー

ユーザがディープリンクをタップすると、アプリがフォアグランドで表示されます。 その際のアプリスタートの種類によりディープリンクの取り扱いが変わります。 アプリスタートの種類には次のものがあります。

  • コールドスタート
  • ウォームスタート
  • ホットスタート

アプリスタートの種類の詳細はアプリスタートの種類に応じた初期化処理を参照してください。

処理フローは以下になります。

コールドスタートの場合

ディープリンクタップ時(Quit)の処理フロー

コールドスタートの場合、Expo LinkingのgetInitialURLで取得したURLに応じた処理(画面遷移など)を行います。

ウォームスタートの場合

iOS

コールドスタートの場合と同様の処理フローになります。Expo LinkingのgetInitialURLで取得したURLに応じた処理(画面遷移など)を行います。

Android

ディープリンクタップ時(Kill)の処理フロー

Androidのウォームスタートの場合、前回起動時にExpo LinkingのaddEventListenerに設定した処理が呼ばれます。 この中でURLに応じた処理(画面遷移など)を行います。

注記

Androidは、android:launchModeによってActivityの起動方法が変わります。

android:launchModesingleTaskは、ウォームスタート時にActivityのインスタンスが作成されません。この場合、ディープリンクのURLはExpo LinkingのaddEventListenerで取得できます。

一方、android:launchModestandardなどは、ウォームスタート時にActivityのインスタンスが作成されます。この場合、ディープリンクのURLはExpo LinkingのgetInitialURLで取得できます。

このアプリでは、Expoのexpo-template-bare-minimumに合わせて、android:launchModesingleTaskに設定しています。 android:launchModestandard変更することで、コールドスタートやiOSのウォームスタートと挙動を合わせることもできます。 しかし、Activityの起動変更がアプリに及ぼす影響を完全に把握できていません。

そのため、android:launchModesingleTaskにして、Expo LinkingのaddEventListenerで取得する方法としています。

注記

ウォームスタート時は、コンポーネントが再マウントされますが、モジュールの再読み込みはされません。App.tsxのtop levelなどで実行した処理は、ウォームスタート時に再実行されることはありません。

そのため、このアプリではaddEventListenerの実行を、App.tsxのtop levelで実行しています。

詳細は、App.tsxを参照してください。

ホットスタートの場合

ディープリンクタップ時(Background)の処理フロー

ホットスタートの場合、Expo LinkingのaddEventListenerに設定した処理が呼ばれます。 この中でURLに応じた処理(画面遷移など)を行います。

ディープリンクに応じた画面遷移

このアプリでは、ディープリンクに応じた画面を表示します。その画面から戻るボタンをタップした場合は、以下の仕様とします。

  • 基本的には、ディープリンクをタップする前に表示していた画面に戻す
  • 遷移先画面がボトムタブを表示しているナビゲーター(Bottom Tabs Navigator)の場合は、前の画面へ戻れないようにする

ディープリンクをタップする前に表示していた画面に戻すためには、画面遷移時のNavigation actionとしてPUSHを使用します。

Bottom Tabs Navigatorに遷移する場合は、NAVIGATEを使用します。このアプリでは、Bottom Tabs Navigatorをログイン(自動ログイン含む)後の初期画面としてNavigation Stackの最初に必ず設定しています。そのため、NAVIGATEで画面遷移することによりNavigation Stackの最初まで戻り、前の画面に戻れなくなります。

注記

画面遷移に関しては、以下のDecision Recordに詳細な検証結果を記載しているので、こちらも参照してください。

認証状態の考慮

未認証時にディープリンクを受け取った場合は、ディープリンクを無視して通常通り起動するようにします。

その後、ユーザが認証した場合は、未認証時に受け取ったディープリンクの遷移先画面を表示します。

ディープリンクのバリデーション

ディープリンクによっては、パスパラメータやクエリパラメータを取得して、画面表示時などに使用する場合があります。

これらのパラメータは、攻撃者によってアプリが意図しない値を設定される場合があります。そのため、取得したパラメータは必ずバリデーションを実施します。

バリデーションエラーとなった場合は、ディープリンクを無視して通常通り起動するようにします。