Flutter アプリで Firebase Dynamic Links を受信する

作成した Firebase Dynamic Links を受信するには、Dynamic Links SDK をアプリに組み込み、アプリが読み込まれるときに FirebaseDynamicLinks.getDynamicLink() メソッドを呼び出して、ダイナミック リンクで渡されたデータを取得する必要があります。

  1. Flutter 用の Firebase SDK をインストールして初期化します(まだ行っていない場合)。

  2. Flutter プロジェクトのルート ディレクトリから、次のコマンドを実行して、Dynamic Links プラグインをインストールします。

    flutter pub add firebase_dynamic_links
    
  3. Android アプリをビルドする場合は、Firebase コンソールの [プロジェクトの設定] ページを開き、SHA-1 署名鍵を指定していることを確認します。アプリリンクを使用する場合は SHA-256 の鍵も指定します。

プラットフォームの統合

アプリを作成するプラットフォームに対して、次のプラットフォーム統合手順を行います。

Android

Android の場合、アプリがインストールされると、ダイナミック リンクがドメインにリダイレクトされるため、新しいインテント フィルタをドメインのディープリンクに追加する必要があります。これは、アプリが Play ストアからインストールまたは更新され、[続行] ボタンがタップされた後にダイナミック リンクデータを受け取るために必要です。AndroidManifest.xml で次のように変更します。

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:host="example.com"
        android:scheme="https"/>
</intent-filter>

指定したスキームとホストへのディープリンクを持つダイナミック リンクをユーザーが開くと、アプリはこのインテント フィルタを使用してリンクを処理するアクティビティを開始します。

次のステップでは、アプリの Firebase コンソールに署名証明書の SHA-256 フィンガープリントが登録されていることを確認します。SHA-256 フィンガープリントを取得する方法の詳細については、クライアントの認証ページをご覧ください。

Apple プラットフォーム

  1. Apple デベロッパー アカウントを作成します(まだ作成していない場合)。

  2. Firebase コンソールの [プロジェクトの設定] ページで、iOS アプリが App Store ID とチーム ID で正しく構成されていることを確認します。

  3. Apple Developer サイトで、関連するドメインの機能を有効にして、アプリのプロビジョニング プロファイルを作成します。

  4. Xcode で次の操作を行います。

    1. TARGETS ヘッダーの下にあるアプリを開きます。

    2. [Signing & Capabilities] ページで、チームが登録され、プロビジョニング プロファイルが設定されていることを確認します。

    3. [Signing & Capabilities] ページで [Associated Domains] を有効にし、次のものを [Associated Domains] リストに追加します(「example」はお使いのドメインに置き換えてください)。

      applinks:example.page.link
      
    4. [Info] ページで、URL タイプをプロジェクトに追加します。[URL Schemes] フィールドに、アプリのバンドル ID を設定します(ID は Bundle ID など自由に設定できます)。

    5. Firebase プロジェクトにカスタム ドメインを設定している場合は、FirebaseDynamicLinksCustomDomains キーを使用して iOS アプリの Info.plist ファイルにダイナミック リンクの URL プレフィックスを追加します。

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      <key>FirebaseDynamicLinksCustomDomains</key>
      <array>
          <string>https://custom.domain.io/path1</string>
          <string>https://custom.domain.io/path2</string>
      </array>
      
      ...other settings
      
      </dict>
      </plist>
      
    6. オプション: Dynamic Links SDK による iOS のペーストボードの使用を無効にします。

      デフォルトでは、Dynamic Links SDK はペーストボードを使用して、インストール後のディープリンクの信頼性を向上させます。ペーストボードを使用するのは、ユーザーがダイナミック リンクを開く前にアプリをインストールする必要がある場合でも、インストール後に初めてアプリを開いたときに元のリンク先コンテンツがすぐ表示されるようにするためです。

      ただし、iOS 14 以降では、ペーストボードを使用すると通知がトリガーされるというデメリットがあります。つまり、ユーザーが最初にアプリを開いたときに、ペーストボードにダイナミック リンク URL の情報があると、アプリがペーストボードにアクセスしたという通知が表示されます。これはユーザーの混乱を招く可能性があります。

      この動作を無効にするには、Xcode プロジェクトの Info.plist ファイルを編集し、FirebaseDeepLinkPasteboardRetrievalEnabled キーを NO に設定します。

アプリでダイナミック リンクを処理するには、2 つのシナリオを実装する必要があります。

終了状態

以下のメソッドを設定します。

  1. FirebaseDynamicLinks.getInitialLink - Future<PendingDynamicLinkData?> を返す
  2. FirebaseDynamicLinks.onLink - PendingDynamicLinkData? を含む Stream を返すイベント ハンドラ

Android は常に終了状態の FirebaseDynamicLinks.getInitialLink を介してリンクを受け取りますが、iOS ではこの処理は保証されません。そのため、アプリがリンクを確実に受け取るようにするには、両方のメソッドを次の順序で設定することをおすすめします。

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseConfig.platformOptions);

  // Check if you received the link via `getInitialLink` first
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  if (initialLink != null) {
    final Uri deepLink = initialLink.link;
    // Example of using the dynamic link to push the user to a different screen
    Navigator.pushNamed(context, deepLink.path);
  }

  FirebaseDynamicLinks.instance.onLink.listen(
        (pendingDynamicLinkData) {
          // Set up the `onLink` event listener next as it may be received here
          if (pendingDynamicLinkData != null) {
            final Uri deepLink = pendingDynamicLinkData.link;
            // Example of using the dynamic link to push the user to a different screen
            Navigator.pushNamed(context, deepLink.path);
          }
        },
      );

  runApp(MyApp(initialLink));
}

その後、アプリケーション ロジック内で、リンクが処理されたかどうかを確認し、アクションを実行します。次に例を示します。

if (initialLink != null) {
  final Uri deepLink = initialLink.link;
  // Example of using the dynamic link to push the user to a different screen
  Navigator.pushNamed(context, deepLink.path);
}

バックグラウンド / フォアグラウンドの状態

アプリが開いている間、またはバックグラウンドで実行されている間は、FirebaseDynamicLinks.onLink ゲッターを使用します。

FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
  Navigator.pushNamed(context, dynamicLinkData.link.path);
}).onError((error) {
  // Handle errors
});

または、アプリを開くために正確なダイナミック リンクが使用されたかどうかを確認するには、getDynamicLink メソッドにリンクを渡します。

String link = 'https://dynamic-link-domain/ke2Qa';

final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getDynamicLink(Uri.parse(link));

iOS でダイナミック リンクをテストするには、実際のデバイスを使用する必要があります。また、終了した(アプリをスワイプして閉じた)状態からダイナミック リンクをテストする場合は、アプリをリリースモード(flutter run --release)で実行する必要があります。