🔗

DeepLinkの実装で気をつけるべきこと

2025/01/03に公開

はじめに

「ボタンの押下や、URLを踏んだ時にモバイルアプリへ遷移させたい!」という時に使うのがDeepLinkです。
従来はFirebase Dynamic Linksを使って簡単に実装できていたのですが、2025年8月25日をもってサービス終了となるため、各プロジェクトでどのようにDeepLinkを実装するのかを悩まれている時期かと思います。
https://firebase.google.com/docs/dynamic-links?hl=ja

2025年1~2月にリリースを控えるアプリでDeepLinkを実装する機会があったので、備忘録として注意事項だけ残しておこうかなと思います。
基本的な実装方法は公式ドキュメントや他のわかりやすい記事があるので、ここには記載不要かなと思っています。

Deep Linkの基本的な実装方法

Flutterが公式ドキュメントを出してくれています。
ありがたい。
https://docs.flutter.dev/ui/navigation/deep-linking

AndroidのApp Linksについて

https://docs.flutter.dev/cookbook/navigation/set-up-app-links

iOSのUniversal Linkについて

https://docs.flutter.dev/cookbook/navigation/set-up-universal-links

iOSのディープリンクをCustom URL schemaで実装したい場合はこのあたりを参考に。
https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app

気をつけるべきこと

共通

  • DeepLinkに指定しているドメインにIP制限がかかっている場合はうまく発火しないので要注意
  • httpはNGで、httpsでアクセスする必要がある。
  • ユーザーのアクションによる発火でない場合は機能しない
    • ディープリンクに指定しているドメインへのリダイレクトでは発火しない
  • AppleのCDN経由にて{ドメイン}/.well-known/apple-app-site-associationにアクセスしてもらう際はリダイレクトでもOKだった。ちなみにAndroidのAppLinksは失敗した。
  • 同じドメイン内でのWebの回遊中にディープリンクのURLを踏んでも発火しない

Universal links let users open your app when they tap links to your website within WKWebView and UIWebView views and Safari pages, in addition to links that result in a call to openURL:, such as those that occur in Mail, Messages, and other apps.
When a user is browsing your website in Safari and they tap a universal link to a URL in the same domain as the current webpage, iOS respects the user’s most likely intent and opens the link in Safari. If the user taps a universal link to a URL in a different domain, iOS opens the link in your app.

https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html

  • AppleのCDNは24時間以内にAASA(apple-app-site-association)ファイルを見に行ってくれる。
  • アプリインストール時にAASAファイルを見に行って、ディープリンクの検証を行う

参考

以下の記事でもディープリンクが発火しない条件をまとめてくださっています。
https://qiita.com/poteko_knnn/items/fce0061b081160668217#ユニバーサルリンクが起動する条件

AASAフィイル関連の説明はこちらが参考になります。
https://developer.apple.com/documentation/xcode/supporting-associated-domains

  • {ドメイン}/.well-known/assetlinks.jsonにリダイレクトでアクセスできるようにしてもディープリンクはうまく機能しない
  • 同じドメイン内でのWebの回遊中にディープリンクのURLを踏んでも発火しない
    • 公式のドキュメントではないが下記URLに似たような報告があった。

https://stackoverflow.com/questions/47117683/deep-link-wont-work-if-opened-from-the-same-domain/47143820#47143820

  • アプリのインストール時にApp Linksの検証が行われる
    • アプリのインテント フィルタの 1 つ以上に android:autoVerify="true" が存在する場合の話だが、公式ドキュメントの実装に沿えば設定されているはず。

https://developer.android.com/training/app-links/verify-android-applinks?hl=ja#verification

Tips

iOSの場合はディープリンクに設定しているドメインにIP制限がかかっている場合でも、mode=developer設定することでAppleのCDNを経由せずにディープリンクを起動できる。

手順

  • iOSの設定アプリからデベロッパモードをONにする
  • 関連ドメイン開発をONにする
  • 診断を押下し、検証したいURLを入力
  • キーボードの開くを押下すると診断結果が表示される

こちらの記事が参考になります。
https://dev.classmethod.jp/articles/ios-universal-link-developer-mode/

最後に

僕がハマった部分も含め、ディープリンク実装時に気をつけるべきことを挙げてみました。

  • 「webサイト内で特定のボタンを押した時のみディープリンクを発火させ、モバイルアプリへ遷移させたい!」
    • => 同じドメイン内での遷移なので、ディープリンク設定が正しくともブラウザ内での回遊が優先されてしまう
  • 「ボタンを押下させないとアプリに戻せないのは嫌だから、リダイレクト設定をして自動でアプリに戻してしまいたい!」
    • => (UniversalLinkの)起動にはユーザーのアクションが必要なのでうまくいかない...
  • 「dev,stg,prod環境があり、dev,stg環境にてディープリンクの検証がしたい!」
    • => dev,stg環境でディープリンクに設定しているドメインにはIPアドレスがかかっているため、Apple,GoogleのCDN経由でドメイン直下の./well-known/..にアクセスできず、ディープリンクが機能しない。

開発時にたまたま上記全てを踏んだので、もう二度とディープリンクで悩まないための備忘録でした。
どなたかの参考になれば幸いです。

Twitter では Flutter を中心とする技術関連の情報を発信しています!
https://x.com/marksaito4

Discussion