ディープリンクの実装で広く利用されているFirebase Dynamic Linksが2025年8月25日に廃止されます。
担当している案件でもFirebase Dynamic Linksを利用した機能実装を行っているため、廃止前に別サービスへの移行を実施しました。
今回は移行先として選んだBranchの紹介とその導入方法を共有したいと思います。
Branchを採用するまで
FirebaseのDynamic Linksの非推奨に関するよくある質問ページには廃止に関する技術情報と併せて移行候補となり得るサービスの名前が記載されています。
これといった移行候補がなかったため、担当している案件で求められる機能要件と上記で紹介されているサービスの対応状況を比較するところから始めました。
担当案件で求められる機能要件
- ディープリンクが動的に生成できる
- 短縮リンクが生成できる
- Deferred Deep Linkに対応している
- Flutterに対応している
Deferred Deep Linkとは
アプリがインストールされていない状態でリンクをクリックした場合でも、アプリインストール後に特定の画面へ遷移できる仕組みのことです。
各サービスの対応状況
サービス名 | 動的生成 | 短縮リンク | Deferred Deep Link | Flutter対応 |
---|---|---|---|---|
Adjust | ◯ | ◯ | ◯ | ◯ |
AppsFlyer | ◯ | ◯ | ◯ | ◯ |
Bitly | ◯ | ◯ | × | × |
Branch | ◯ | ◯ | ◯ | ◯ |
Kochava | ◯ | ◯ | ◯ | ◯ |
調査を行っていたタイミングではFirebase側でAirbridgeが紹介されていなかったため、Airbridgeについては評価できていません。
調査の結果、Bitly以外のサービスであれば機能要件を満たせそうなことが分かりました。
候補が複数残ってしまったため、どれにしようか悩みましたが、最終的にはBranchにしかなかった以下の要素に惹かれて採用しました。
Branchの長所
- Firebase Dynamic Linksとの共存が可能なため、ディープリンクのシステム切り替え時にシームレスな移行が可能
- アプリがインストールされていない場合に表示されるページのカスタマイズが可能(ただし、内容によってはEnterprise契約が必要な場合あり)
一方でBranchには短所に感じる部分もあるため、軽く触れておきます。
Branchの短所
- MAU10,000までは無料で利用できるが、それ以降は1,000人毎に月額$5の支払いが必要
- 日本の販売拠点や代理店が存在していないため、契約したい場合は英語でのやり取りが必須
Branchの導入方法
Branchを使ってディープリンクを実装するためには、最低限以下の作業が必要になります。
下記に貼ってあるリンク先を見るためにはBranchアカウントでのサインインが必要になる場合があります。
1. アカウントの作成
まず、Branchアカウントを作成する必要があります。
最初はデモのリクエストを試したのですが、数日間、Branchから反応がありませんでした。
Sign inページにある「Create an account」からもアカウントを用意することができるので、急いでいる方にはこちらの方法をオススメします。
2. Branchダッシュボード上でのプロジェクト設定
Branchアカウントを作成するとダッシュボードが見られるようになるので、アプリと紐づけるプロジェクトの設定を行います。
プロジェクト名
アカウント作成直後はプロジェクト名が設定されていないため、PROFILEページで適切な名前に変更します。

支払いクレジットカード
ディープリンクを使うためには、無料枠の範囲内で利用する場合でもBILLINGページで支払いを行うクレジットカードの設定を行う必要があります。

リダイレクト設定
ディープリンクをクリックした際のリダイレクト先をGENERALページの Required Redirects に設定します。


設定内容については各SDKのドキュメントが参考になります。
Android - only section: Configure Branch Dashboard
iOS - only section: Configure Branch Dashboard
ソーシャルメディアプレビュー
ソーシャルメディア等でディープリンクを共有した際に表示されるプロダクトの情報をGENERALページの Social Media Preview に設定します。

ここまで設定すればダッシュボード上での作業は完了です。
3. FlutterプロジェクトへSDKを追加
次にFlutterプロジェクトへBranchのSDKを追加します。
追加方法は上記のReadmeを参照してください。
[補足] BranchのLIVE環境とTEST環境について
SDKの導入中、LIVE環境とTEST環境向けの設定を行う箇所が幾つかあります。
基本的にはLIVE環境のみの設定で問題ないのですが、それぞれ以下のような特徴があるので、必要に応じてTEST環境向けの設定も行っておくと良いでしょう。
LIVE環境
- 実際のユーザー向けのリンクが生成され、本番の分析データとして記録される
- Deferred Deep LinkはLIVE環境でないと動作しない
TEST環境
- テスト用のリンクが生成され、LIVE環境のデータに影響を与えずに動作確認ができる
- TEST環境で動作させる場合、MAUにはカウントされないため、支払いを気にすることなく開発に専念できる
4. コードの追加
最後にBranchを使ってディープリンクを処理するコードを追加していきます。
SDKの初期化
import 'package:flutter_branch_sdk/flutter_branch_sdk.dart';
await FlutterBranchSdk.init();
Branch SDKを使用するためには最初に初期化処理を呼び出す必要があります。
他のSDKと同様にアプリ起動時の処理に含めると良いでしょう。
ディープリンクの読み込み
FlutterBranchSdk.listSession().listen((Map<dynamic, dynamic> data) {
if (data.containsKey('+clicked_branch_link') &&
data['+clicked_branch_link'] == true) {
print('Custom string: ${data['custom_string']}');
}
}, onError: (Object error) {
print('listSession error: ${error.toString()}');
});
listSession()を使うことでBranch経由のディープリンクを取得することができます。
ただ、ディープリンクからの起動でない場合(通常起動)でもリッスンされてしまうため、+clicked_branch_link キーの値をチェックして、ディープリンクからの起動かどうかを確認する必要があります。
ディープリンクの動的生成
final BranchUniversalObject buo = BranchUniversalObject(
canonicalIdentifier: 'identifier',
contentMetadata: BranchContentMetaData()
..addCustomMetadata('custom_parameter', 'abc'),
);
final BranchLinkProperties lp = BranchLinkProperties();
final BranchResponse<dynamic> response =
await FlutterBranchSdk.getShortUrl(buo: buo, linkProperties: lp);
if (response.success) {
print('short url: ${response.result.toString()}');
}
動的にディープリンク(今回は短縮リンク)を生成するにはgetShortUrl()を使用します。
[補足] BranchUniversalObjectのプロパティについて
canonicalIdentifier
ドキュメントのベストプラクティスで「一意な値にすべき」と記載されているため、ディープリンクの生成毎に値が変化するようにしてください。
contentMetadata
Firebase Dynamic Linksでクエリパラメータを指定していた場合は、このプロパティを使うことで同じように処理することができます。
おわりに
Branchを使うことでディープリンクの機能をFirebase Dynamic Linksから移行することができました。
正直なところ、ディープリンクの機能を実現するためだけに導入するにはBranchは多機能過ぎると感じているので、今後、より丁度良いサービスが出てくることを期待しています。
株式会社ボトルキューブではFlutterを使ったお仕事を募集中です。
お問い合わせは下記リンク先のフォームからご連絡ください。