FlutterアプリでFirebaseDynamicLinksを受信する

作成したFirebaseDynamicLinksを受け取るには、アプリにDynamic Links SDKを含め、アプリの読み込み時にFirebaseDynamicLinks.getDynamicLink()メソッドを呼び出して、動的リンクに渡されるデータを取得する必要があります。

  1. まだ行っていない場合は、Flutter用のFirebaseSDKをインストールして初期化します

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

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

プラットフォームの統合

アプリを構築するプラットフォームについて、次のプラットフォーム統合手順を完了します。

アンドロイド

Androidでは、アプリがインストールされている場合、ダイナミックリンクがドメインにリダイレクトされるため、ドメインのディープリンクをキャッチする新しいインテントフィルターを追加する必要があります。これは、Playストアからインストール/更新して[続行]ボタンを1回タップした後、アプリがダイナミックリンクデータを受信するために必要です。 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>

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

Appleプラットフォーム

  1. まだ持っていない場合は、Appleデベロッパアカウントを作成します

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

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

  4. Xcodeで、次の手順を実行します。

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

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

    3. Firebaseコンソールで作成したドメインを、接頭辞applinks:たとえば、 applinks:example.page.link )を付けて関連ドメインに追加します。

    4. [情報]ページで、プロジェクトにURLタイプを追加します。 [URLスキーム]フィールドをアプリのバンドルIDに設定します。 (識別子はBundle IDまたは任意のものにすることができます。)

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

      <?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. オプション: DynamicLinksSDKによるiOSペーストボードの使用を無効にします。

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

      これの欠点は、ペーストボードを使用するとiOS14以降で通知がトリガーされることです。そのため、ユーザーが初めてアプリを開いたときに、ペーストボードに動的リンクURLが含まれている場合、アプリがペーストボードにアクセスしたという通知が表示され、混乱を招く可能性があります。

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

アプリケーションで動的リンクを処理するには、2つのシナリオを実装する必要があります。

終了した状態

アプリケーションが終了した場合、 FirebaseDynamicLinks.getInitialLinkメソッドを使用すると、アプリケーションを開いた動的リンクを取得できます。

これは非同期リクエストであるため、ナビゲーターなどのアプリケーションロジックをレンダリングする前にリンクを処理することは理にかなっています。たとえば、これをmain関数で処理できます。

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

  // Get any initial links
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  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);
}

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

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

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

背景/前景の状態

アプリケーションが開いている間、またはバックグラウンドで、ストリームハンドラーを使用してDynamicLinksイベントをリッスンできます。 FirebaseDynamicLinks.onLinkゲッターは、 PendingDynamicLinkDataを含むStreamを返します。

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