🔗

go_routerでサクッとカスタムURLスキームを実装する

2025/01/01に公開

はじめに

アプリにおいて特定のURLに対して反応し、アプリに動作させることはよくあるケースです。これを実現するためのリンクをディープリンクといい、そのリンクに独自のURLスキームを利用することをカスタムURLスキームと呼びます。
また、特定のWebページへのリンク(httpsで始まるスキーム)に反応してアプリを動作させることもディープリンクと呼び、これを行うための技術として
AndroidではAppLinks、iOSではUniversalLinksがあります。
Flutter公式の説明にはこちらのAppLinksとUniversalLinksを使用する例が載っていますが、カスタムURLスキームについては書かれていませんでした。

ので、今回はFlutterとgo_routerでカスタムURLスキームを実装する方法を紹介します。

今回使用したサンプルコードはこちらです。

環境

対象 バージョン
Flutter 3.27.1
go_router 14.6.2
go_router_builder 2.7.1
build_runner 2.4.14
build_verify 3.1.0

実装

Android、iOSそれぞれで、schemesampleで発火するカスタムURLスキームを有効化する方法を紹介します。
とはいえ、どちらも数行追加するのみです。

Android

AndroidManifest.xmlにディープリンクを有効化する記述と、有効化するURLスキームの定義を追加します。

https://github.com/kktaro/url-scheme-sample/blob/main/android/app/src/main/AndroidManifest.xml#L27-L33

iOS

Androidと同じく、info.plistにディープリンクを有効化する記述と、有効化するURLスキームの定義を追加します。

https://github.com/kktaro/url-scheme-sample/blob/main/ios/Runner/Info.plist#L5-L17

動かしてみる

これによりカスタムURLスキームによりアプリの起動や対象の画面への遷移を行うことができるようになりました。

アプリを起動する

カスタムURLスキームのみを渡した場合はinitialLocationで指定した最初の画面が開かれます。

URL: schemesample://

android-launch

ios-launch

特定のルートに遷移する

go_routerで定義した個別のルートへのパスを渡すことで、対象の画面を開くことができます。

URL: schemesample://app/detail/1

android-transition

ios-transition

存在しないルートに遷移する

未定義のパスへのURLを渡した場合はGoRoutererrorBuilderで定義した画面が表示されます。今回は特に指定していないのでデフォルトのエラー画面が表示されます。

URL: schemesample://app/aaaaaa

android-unknown

ios-unknown

まとめ

最近ではセキュリティ上の理由からカスタムURLスキームではなくApplinksやUniversalLinksを使用することが推奨されています。[1][2]
ですがWebサイトの用意やassetlinksファイル等の準備が必要になるため過剰な対応になってしまう場面もあるかと思います。カスタムURLスキームであればサクッと実装することができるため、場合によって使い分けることができると良いかと思います。

脚注
  1. https://developer.android.com/privacy-and-security/risks/unsafe-use-of-deeplinks?hl=ja ↩︎

  2. https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app ↩︎

Discussion