Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

iOS でダイナミック リンクを受信する

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

前提条件

作業を開始する前に、iOS プロジェクトに Firebase を追加していることを確認してください。

  1. Firebase を iOS プロジェクトに追加します
  2. Podfile で次の Pod をインクルードします。
    pod 'Firebase/Analytics'
    pod 'Firebase/DynamicLinks'
  3. pod install を実行し、作成された .xcworkspace ファイルを開きます。
  4. Firebase コンソールで [Dynamic Links] セクションを開きます。利用規約に同意するための画面が表示された場合は、同意します。
  5. アプリの App Store ID と App ID Prefix がアプリの設定で指定されていることを確認します。アプリの設定を表示して編集するには、Firebase プロジェクトの [設定] ページに移動して iOS アプリを選択します。

    次の URL を開くと、iOS アプリでダイナミック リンクを使用するよう Firebase プロジェクトが正しく構成されているか確認できます。

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

    アプリが接続されている場合、apple-app-site-association ファイルにはアプリの App ID Prefix とバンドル ID への参照が含まれます。次に例を示します。

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

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

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

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

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

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

  1. アプリの Xcode プロジェクトの [Info] タブで、ダイナミック リンクに使用する新しい URL タイプを作成します。[Identifier] フィールドに一意の値を設定し、[URL scheme] フィールドにはバンドル ID を設定します。バンドル ID は、ダイナミック リンクにより使用されるデフォルトの URL スキームです。
  2. アプリの Xcode プロジェクトの [Capabilities] タブで関連ドメインを有効にし、[Associated Domains] リストに次のドメインを追加します。
    applinks:your_dynamic_links_domain
  3. 完全なカスタム ドメインを含むダイナミック リンクを受信する場合は、Xcode プロジェクトの Info.plist ファイル内で FirebaseDynamicLinksCustomDomains というキーを作成し、アプリの Dynamic Links URL 接頭辞に追加します。次に例を示します。
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. Firebase モジュールを UIApplicationDelegate にインポートします。

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  5. FirebaseApp 共有インスタンスを構成します。通常はアプリの application:didFinishLaunchingWithOptions: メソッドで行います。

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. 次に、application:continueUserActivity:restorationHandler: メソッドで、アプリがすでにインストールされている場合にユニバーサル リンクとして受信されるリンクを処理します(iOS 9 以降)。

    Swift

    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

    - (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;
    }
  7. 最後に、application:openURL:sourceApplication:annotation: メソッド(iOS 8 以前)と application:openURL:options: メソッド(iOS 9 以降)で、アプリのカスタム URL スキームを通して受信したリンクを処理します。これらのメソッドが呼び出されるのは、アプリが iOS 8 以前でリンクを受信したときと、iOS(バージョンを問わず)にアプリをインストールした後にアプリが初めて開かれたときです。

    (iOS のすべてのバージョンに該当)アプリの最初の起動時にダイナミック リンクが見つからなかった場合、このメソッドは FIRDynamicLinkurlnil が設定された状態で呼び出されます。これは、対応する保留中のダイナミック リンクを SDK が見つけることができなかったことを示します。

    Swift

    @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

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