Flutterでディープリンクを修正する機会があったので、設定・実装の全体像をまとめてみました。
ディープリンクとは
WebサイトのURLから、直接アプリのコンテンツを開くことができる技術のことです。
iOSではUniversal Links(ユニバーサルリンク)と呼ばれ、Androidではアプリリンクと呼ばれています。
(技術的な仕様は少し違いますがここでは省きます)
X(旧Twitter)やInstagramなどのURLをタップしたときに、アプリをインストールしていれば、ブラウザではなくアプリでそのコンテンツが表示されるものです。
アプリ側の設定方法
iOS
まずはApple Developper Programのサイトの「Certificates, Identifiers & Profiles」のページを開き、「Associated Domains」をONにします。

次にXcodeの「Runner」→「Signing & Capabilities」→「Associated Domains」に後述するapple-app-site-associationを保存するドメインを指定します。

Android
android/app/src/main/AndroidManifest.xmlに以下を追加します。
<!-- App Links -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with https://YOUR_HOST -->
<data
android:scheme="https"
android:host="[YOUR_HOST]" />
</intent-filter>
apple-app-site-associationの設定方法
iOSではアプリとWebサイトを紐づけるために、apple-app-site-associationというファイルを用意し、サーバーにアップロードします。
実際のファイルは以下のように書きます。
{
"applinks": {
"apps": [],
"details": [
{
"appID": "ABCDFE.com.example.app",
"paths": ["*"]
}
]
}
}
「appID」はdevelopperチームのIDに、アプリのバンドルIDを繋げたものです。
また「paths」にはWebサイトのパスを指定できます。今回は全てのパスを渡せるワイルドカードを使っています。
そして以下の場所でファイルにアクセスできるようにアップロードします。
https://{domain}/.well-known/apple-app-site-association
assetlinks.jsonの設定方法
AndroidでもアプリとWebサイトを紐づけるために、assetlinks.jsonというファイルを用意し、サーバーにアップロードします。
記載内容は以下のとおりです。
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example",
"sha256_cert_fingerprints":
["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
そして以下の場所でファイルにアクセスできるようにアップロードします。
https://{domain}/.well-known/assetlinks.json
実装方法
↓↓「Uni Links」というプラグインを使います。
https://pub.dev/packages/uni_links
まずはアプリが開始された時のUriオブジェクトを返す処理を行います。
この処理はアプリ開始の初期に一度だけ実行します。
import 'dart:async';
import 'package:uni_links/uni_links.dart';
import 'package:flutter/services.dart';
Future _initURIHandler() async {
try {
final initialURI = await getInitialUri();
} on PlatformException {
debugPrint("Failed to receive initial uri");
}
}
次にディープリンクを認識したときの処理を書きます。
ここでは、 ディープリンクを認識したらpushDeepLink()が呼ばれ、そのメソッド内で画面遷移が実行されます。
StreamSubscription _sub;
Future initUniLinks() async {
_sub = linkStream.listen((String? link) {
pushDeepLink();
}, onError: (err) {
debugPrint('Error occurred: $err');
});
}
Future pushDeepLink() async {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TestPage();
},
)
);
}
まとめ
本記事のまとめは以下のとおりです。
- iOSは「Associated Domains」の設定を行い、apple-app-site-associationを作成しサーバーにアップロードする。
- AndroidはAndroidManifest.xmlにタグを追加し、assetlinks.jsonを作成しサーバーにアップロードする。
- 「Uni Links」というプラグインを使い、公式通りに実装する。
最後までお読みいただきありがとうございました。
参考文献
https://pub.dev/packages/uni_links
https://developer.apple.com/documentation/xcode/supporting-associated-domains
https://developer.android.com/training/app-links/verify-android-applinks?hl=ja