Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

iOSで動的リンクを受信する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

作成した Firebase Dynamic Links を受け取るには、Dynamic Links SDK をアプリにhandleUniversalLink: 、アプリの読み込み時に handleUniversalLink: メソッドとdynamicLinkFromCustomSchemeURL:メソッドを呼び出して、Dynamic Link で渡されたデータを取得する必要があります。

前提条件

開始する前に、必ずFirebase を iOS プロジェクトに追加してください

Swift Package Manager を使用して、Firebase の依存関係をインストールおよび管理します。

  1. Xcode で、アプリ プロジェクトを開いた状態で、 File > Add Packagesに移動します。
  2. プロンプトが表示されたら、Firebase Apple プラットフォーム SDK リポジトリを追加します。
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Dynamic Links ライブラリを選択します。
  5. Dynamic Links で最適なエクスペリエンスを得るには、Firebase プロジェクトでGoogle アナリティクスを有効にし、Google アナリティクス用の Firebase SDK をアプリに追加することをお勧めします。 IDFA コレクションのないライブラリまたは IDFA コレクションのあるライブラリのいずれかを選択できます。
  6. 完了すると、Xcode はバックグラウンドで依存関係の解決とダウンロードを自動的に開始します。

ここで、いくつかの構成手順を実行します。

  1. Firebase コンソールで、[ Dynamic Links]セクションを開きます。プロンプトが表示されたら、利用規約に同意します。
  2. アプリの App Store ID とアプリ ID プレフィックスがアプリの設定で指定されていることを確認してください。アプリの設定を表示および編集するには、Firebase プロジェクトの[設定] ページに移動し、iOS アプリを選択します。

    次の URL を開くと、iOS アプリで Dynamic Links を使用するように Firebase プロジェクトが適切に構成されていることを確認できます。

    https://your_dynamic_links_domain/apple-app-site-association

    アプリが接続されている場合、 apple-app-site-associationファイルには、アプリのアプリ ID プレフィックスとバンドル ID への参照が含まれています。例えば:

    {"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["NOT /_/*","/*"]}]}}

    detailsフィールドが空の場合は、App ID プレフィックスを指定したことを再確認してください。アプリ ID プレフィックスは、チーム ID と同じではない場合があることに注意してください。

  3. オプション: Dynamic Links SDK による iOS ペーストボードの使用を無効にします。

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

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

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

  1. アプリの Xcode プロジェクトの [情報] タブで、ダイナミック リンクに使用する新しい URL タイプを作成します。識別子フィールドを一意の値に設定し、 URL スキームフィールドをバンドル ID に設定します。これは、Dynamic Links で使用されるデフォルトの URL スキームです。
  2. アプリの Xcode プロジェクトの [機能] タブで、関連付けられたドメインを有効にし、関連付けられたドメインのリストに次を追加します:
    applinks:your_dynamic_links_domain
  3. フルカスタム ドメインでダイナミック リンクを受け取りたい場合は、Xcode プロジェクトのInfo.plistファイルで、 FirebaseDynamicLinksCustomDomainsというキーを作成し、アプリのダイナミック リンク URL プレフィックスに設定します。例:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. UIApplicationDelegateFirebaseCoreモジュールをインポートし、アプリ デリゲートが使用する他のすべてのFirebase モジュールをインポートします。たとえば、Cloud Firestore と認証を使用するには:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    迅速

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. アプリ デリゲートのapplication(_:didFinishLaunchingWithOptions:)メソッドでFirebaseApp共有インスタンスを構成します。

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    迅速

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. SwiftUI を使用している場合は、アプリケーション デリゲートを作成し、それをUIApplicationDelegateAdaptorまたはNSApplicationDelegateAdaptorを介してApp構造体にアタッチする必要があります。アプリ デリゲート スウィズリングも無効にする必要があります。詳細については、 SwiftUI の説明を参照してください。

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  7. 次に、 application:continueUserActivity:restorationHandler:メソッドで、アプリが既にインストールされている場合にユニバーサル リンクとして受け取ったリンクを処理します。

    迅速

    注:この製品は、macOS、Mac Catalyst、tvOS、または watchOS ターゲットでは使用できません。
    func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
      let handled = DynamicLinks.dynamicLinks()
        .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in
          // ...
        }
    
      return handled
    }
    

    Objective-C

    注:この製品は、macOS、Mac Catalyst、tvOS、または watchOS ターゲットでは使用できません。
    - (BOOL)application:(UIApplication *)application
    continueUserActivity:(nonnull NSUserActivity *)userActivity
     restorationHandler:
    #if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
    (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler {
    #else
        (nonnull void (^)(NSArray *_Nullable))restorationHandler {
    #endif  // __IPHONE_12_0
      BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
                                                              completion:^(FIRDynamicLink * _Nullable dynamicLink,
                                                                           NSError * _Nullable error) {
                                                                // ...
                                                              }];
      return handled;
    }
  8. 最後に、 application:openURL:options:で、アプリのカスタム URL スキームを介して受信したリンクを処理します。このメソッドは、インストール後に初めてアプリを開いたときに呼び出されます。

    アプリの初回起動時にダイナミック リンクが見つからない場合、このメソッドはDynamicLinkurlnilに設定して呼び出され、SDK が一致する保留中のダイナミック リンクを見つけられなかったことを示します。

    迅速

    注:この製品は、macOS、Mac Catalyst、tvOS、または watchOS ターゲットでは使用できません。
    @available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
      return application(app, open: url,
                         sourceApplication: options[UIApplication.OpenURLOptionsKey
                           .sourceApplication] as? String,
                         annotation: "")
    }
    
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
                     annotation: Any) -> Bool {
      if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
        // Handle the deep link. For example, show the deep-linked content or
        // apply a promotional offer to the user's account.
        // ...
        return true
      }
      return false
    }
    

    Objective-C

    注:この製品は、macOS、Mac Catalyst、tvOS、または watchOS ターゲットでは使用できません。
    - (BOOL)application:(UIApplication *)app
                openURL:(NSURL *)url
                options:(NSDictionary<NSString *, id> *)options {
      return [self application:app
                       openURL:url
             sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }
    
    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
      FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
    
      if (dynamicLink) {
        if (dynamicLink.url) {
          // Handle the deep link. For example, show the deep-linked content,
          // apply a promotional offer to the user's account or show customized onboarding view.
          // ...
        } else {
          // Dynamic link has empty deep link. This situation will happens if
          // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link,
          // but pending link is not available for this device/App combination.
          // At this point you may display default onboarding view.
        }
        return YES;
      }
      return NO;
    }

作成した Firebase Dynamic Links を受け取るには、Dynamic Links SDK をアプリにhandleUniversalLink: 、アプリの読み込み時に handleUniversalLink: メソッドとdynamicLinkFromCustomSchemeURL:メソッドを呼び出して、Dynamic Link で渡されたデータを取得する必要があります。

前提条件

開始する前に、必ずFirebase を iOS プロジェクトに追加してください

Swift Package Manager を使用して、Firebase の依存関係をインストールおよび管理します。

  1. Xcode で、アプリ プロジェクトを開いた状態で、 File > Add Packagesに移動します。
  2. プロンプトが表示されたら、Firebase Apple プラットフォーム SDK リポジトリを追加します。
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Dynamic Links ライブラリを選択します。
  5. Dynamic Links で最適なエクスペリエンスを得るには、Firebase プロジェクトでGoogle アナリティクスを有効にし、Google アナリティクス用の Firebase SDK をアプリに追加することをお勧めします。 IDFA コレクションのないライブラリまたは IDFA コレクションのあるライブラリのいずれかを選択できます。
  6. 完了すると、Xcode はバックグラウンドで依存関係の解決とダウンロードを自動的に開始します。

ここで、いくつかの構成手順を実行します。

  1. Firebase コンソールで、[ Dynamic Links]セクションを開きます。プロンプトが表示されたら、利用規約に同意します。
  2. アプリの App Store ID とアプリ ID プレフィックスがアプリの設定で指定されていることを確認してください。アプリの設定を表示および編集するには、Firebase プロジェクトの[設定] ページに移動し、iOS アプリを選択します。

    次の URL を開くと、iOS アプリで Dynamic Links を使用するように Firebase プロジェクトが適切に構成されていることを確認できます。

    https://your_dynamic_links_domain/apple-app-site-association

    アプリが接続されている場合、 apple-app-site-associationファイルには、アプリのアプリ ID プレフィックスとバンドル ID への参照が含まれています。例えば:

    {"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["NOT /_/*","/*"]}]}}

    detailsフィールドが空の場合は、App ID プレフィックスを指定したことを再確認してください。アプリ ID プレフィックスは、チーム ID と同じではない場合があることに注意してください。

  3. オプション: Dynamic Links SDK による iOS ペーストボードの使用を無効にします。

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

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

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

  1. アプリの Xcode プロジェクトの [情報] タブで、ダイナミック リンクに使用する新しい URL タイプを作成します。識別子フィールドを一意の値に設定し、 URL スキームフィールドをバンドル ID に設定します。これは、Dynamic Links で使用されるデフォルトの URL スキームです。
  2. アプリの Xcode プロジェクトの [機能] タブで、関連付けられたドメインを有効にし、関連付けられたドメインのリストに次を追加します:
    applinks:your_dynamic_links_domain
  3. フルカスタム ドメインでダイナミック リンクを受け取りたい場合は、Xcode プロジェクトのInfo.plistファイルで、 FirebaseDynamicLinksCustomDomainsというキーを作成し、アプリのダイナミック リンク URL プレフィックスに設定します。例:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. UIApplicationDelegateFirebaseCoreモジュールをインポートし、アプリ デリゲートが使用する他のすべてのFirebase モジュールをインポートします。たとえば、Cloud Firestore と認証を使用するには:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    迅速

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. アプリ デリゲートのapplication(_:didFinishLaunchingWithOptions:)メソッドでFirebaseApp共有インスタンスを構成します。

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    迅速

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. SwiftUI を使用している場合は、アプリケーション デリゲートを作成し、それをUIApplicationDelegateAdaptorまたはNSApplicationDelegateAdaptorを介してApp構造体にアタッチする必要があります。アプリ デリゲート スウィズリングも無効にする必要があります。詳細については、 SwiftUI の説明を参照してください。

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  7. 次に、 application:continueUserActivity:restorationHandler:メソッドで、アプリが既にインストールされている場合にユニバーサル リンクとして受け取ったリンクを処理します。

    迅速

    注:この製品は、macOS、Mac Catalyst、tvOS、または watchOS ターゲットでは使用できません。
    func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
      let handled = DynamicLinks.dynamicLinks()
        .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in
          // ...
        }
    
      return handled
    }
    

    Objective-C

    注:この製品は、macOS、Mac Catalyst、tvOS、または watchOS ターゲットでは使用できません。
    - (BOOL)application:(UIApplication *)application
    continueUserActivity:(nonnull NSUserActivity *)userActivity
     restorationHandler:
    #if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
    (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler {
    #else
        (nonnull void (^)(NSArray *_Nullable))restorationHandler {
    #endif  // __IPHONE_12_0
      BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
                                                              completion:^(FIRDynamicLink * _Nullable dynamicLink,
                                                                           NSError * _Nullable error) {
                                                                // ...
                                                              }];
      return handled;
    }
  8. 最後に、 application:openURL:options:で、アプリのカスタム URL スキームを介して受信したリンクを処理します。このメソッドは、インストール後に初めてアプリを開いたときに呼び出されます。

    アプリの初回起動時にダイナミック リンクが見つからない場合、このメソッドはDynamicLinkurlnilに設定して呼び出され、SDK が一致する保留中のダイナミック リンクを見つけられなかったことを示します。

    迅速

    注:この製品は、macOS、Mac Catalyst、tvOS、または watchOS ターゲットでは使用できません。
    @available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
      return application(app, open: url,
                         sourceApplication: options[UIApplication.OpenURLOptionsKey
                           .sourceApplication] as? String,
                         annotation: "")
    }
    
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
                     annotation: Any) -> Bool {
      if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
        // Handle the deep link. For example, show the deep-linked content or
        // apply a promotional offer to the user's account.
        // ...
        return true
      }
      return false
    }
    

    Objective-C

    注:この製品は、macOS、Mac Catalyst、tvOS、または watchOS ターゲットでは使用できません。
    - (BOOL)application:(UIApplication *)app
                openURL:(NSURL *)url
                options:(NSDictionary<NSString *, id> *)options {
      return [self application:app
                       openURL:url
             sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }
    
    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
      FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
    
      if (dynamicLink) {
        if (dynamicLink.url) {
          // Handle the deep link. For example, show the deep-linked content,
          // apply a promotional offer to the user's account or show customized onboarding view.
          // ...
        } else {
          // Dynamic link has empty deep link. This situation will happens if
          // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link,
          // but pending link is not available for this device/App combination.
          // At this point you may display default onboarding view.
        }
        return YES;
      }
      return NO;
    }