ディープリンクの処理
ディープリンクをアプリケーションで処理する方法について記載します。
ディープリンクタップ時の処理フロー
ユーザがディープリンクをタップすると、アプリがフォアグランドで表示されます。 その際のアプリスタートの種類によりディープリンクの取り扱いが変わります。 アプリスタートの種類には次のものがあります。
- コールドスタート
- ウォームスタート
- ホットスタート
アプリスタートの種類の詳細はアプリスタートの種類に応じた初期化処理を参照してください。
処理フローは以下になります。
コールドスタートの場合
コールドスタートの場合、Expo LinkingのgetInitialURLで取得したURLに応じた処理(画面遷移など)を行います。
ウォームスタートの場合
iOS
コールドスタートの場合と同様の処理フローになります。Expo LinkingのgetInitialURLで取得したURLに応じた処理(画面遷移など)を行います。
Android
Androidのウォームスタートの場合、前回起動時にExpo LinkingのaddEventListenerに設定した処理が呼ばれます。 この中でURLに応じた処理(画面遷移など)を行います。
Androidは、android:launchModeによってActivityの起動方法が変わります。
android:launchMode
のsingleTask
は、ウォームスタート時にActivityのインスタンスが作成されません。この場合、ディープリンクのURLはExpo LinkingのaddEventListener
で取得できます。
一方、android:launchMode
のstandard
などは、ウォームスタート時にActivityのインスタンスが作成されます。この場合、ディープリンクのURLはExpo LinkingのgetInitialURL
で取得できます。
このアプリでは、Expoのexpo-template-bare-minimumに合わせて、android:launchMode
をsingleTask
に設定しています。
android:launchMode
をstandard
変更することで、コールドスタートやiOSのウォームスタートと挙動を合わせることもできます。
しかし、Activityの起動変更がアプリに及ぼす影響を完全に把握できていません。
そのため、android:launchMode
はsingleTask
にして、Expo LinkingのaddEventListener
で取得する方法としています。
ウォームスタート時は、コンポーネントが再マウントされますが、モジュールの再読み込みはされません。App.tsx
のtop levelなどで実行した処理は、ウォームスタート時に再実行されることはありません。
そのため、このアプリではaddEventListener
の実行を、App.tsx
のtop levelで実行しています。
詳細は、App.tsxを参照してください。
ホットスタートの場合
ホットスタートの場合、Expo LinkingのaddEventListenerに設定した処理が呼ばれます。 この中でURLに応じた処理(画面遷移など)を行います。
ディープリンクに応じた画面遷移
このアプリでは、ディープリンクに応じた画面を表示します。その画面から戻るボタンをタップした場合は、以下の仕様とします。
- 基本的には、ディープリンクをタップする前に表示していた画面に戻す
- 遷移先画面がボトムタブを表示しているナビゲーター(Bottom Tabs Navigator)の場合は、前の画面へ戻れないようにする
ディープリンクをタップする前に表示していた画面に戻すためには、画面遷移時のNavigation actionとしてPUSH
を使用します。
Bottom Tabs Navigator
に遷移する場合は、NAVIGATE
を使用します。このアプリでは、Bottom Tabs Navigator
をログイン(自動ログイン含む)後の初期画面としてNavigation Stackの最初に必ず設定しています。そのため、NAVIGATE
で画面遷移することによりNavigation Stackの最初まで戻り、前の画面に戻れなくなります。
画面遷移に関しては、以下のDecision Recordに詳細な検証結果を記載しているので、こちらも参照してください。
認証状態の考慮
未認証時にディープリンクを受け取った場合は、ディープリンクを無視して通常通り起動するようにします。
その後、ユーザが認証した場合は、未認証時に受け取ったディープリンクの遷移先画面を表示します。
ディープリンクのバリデーション
ディープリンクによっては、パスパラメータやクエリパラメータを取得して、画面表示時などに使用する場合があります。
これらのパラメータは、攻撃者によってアプリが意図しない値を設定される場合があります。そのため、取得したパラメータは必ずバリデーションを実施します。
バリデーションエラーとなった場合は、ディープリンクを無視して通常通り起動するようにします。