作成した Firebase Dynamic Links を受信するには、Dynamic Links SDK をアプリに組み込み、アプリが読み込まれるときに handleUniversalLink:
メソッドと dynamicLinkFromCustomSchemeURL:
メソッドを呼び出して、ダイナミック リンクで渡されたデータを取得する必要があります。
前提条件
作業を開始する前に、iOS プロジェクトに Firebase を追加していることを確認してください。
Firebase と Dynamic Links SDK を設定する
Swift Package Manager を使用して Firebase の依存関係のインストールと管理を行います。
- Xcode でアプリのプロジェクトを開いたまま、[File] > [Add Packages] の順に移動します。
- プロンプトが表示されたら、Firebase Apple プラットフォーム SDK リポジトリを追加します。
- Dynamic Links ライブラリを選択します。
- Dynamic Links でのエクスペリエンスを最適化するために、Firebase プロジェクトで Google アナリティクスを有効にして、Google アナリティクス用の Firebase SDK をアプリに追加することをおすすめします。ライブラリで IDFA の収集を行う / 行わないを選択できます。
- 上記の作業が完了すると、Xcode は依存関係の解決とバックグラウンドでのダウンロードを自動的に開始します。
https://github.com/firebase/firebase-ios-sdk
次に、構成ステップを行います。
- Firebase コンソールで [Dynamic Links] セクションを開きます。利用規約に同意するための画面が表示された場合は、同意します。
-
アプリの 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":["NOT /_/*","/*"]}]}}
details
フィールドが空の場合、App ID Prefix を指定したことを再確認してください。App ID Prefix はチーム ID と同じでない場合があるので注意してください。 -
オプション: Dynamic Links SDK による iOS のペーストボードの使用を無効にします。
デフォルトでは、Dynamic Links SDK はペーストボードを使用して、インストール後のディープリンクの信頼性を向上させます。ペーストボードを使用するのは、ユーザーがダイナミック リンクを開く前にアプリをインストールする必要がある場合でも、インストール後に初めてアプリを開いたときに元のリンク先コンテンツがすぐ表示されるようにするためです。
ただし、iOS 14 以降では、ペーストボードを使用すると通知がトリガーされるというデメリットがあります。つまり、ユーザーが最初にアプリを開いたときに、ペーストボードに URL があると、アプリがペーストボードにアクセスしたという通知が表示されます。これはユーザーの混乱を招く可能性があります。
この動作を無効にするには、Xcode プロジェクトの
Info.plist
ファイルを編集し、FirebaseDeepLinkPasteboardRetrievalEnabled
キーをNO
に設定します。
アプリでダイナミック リンクを開く
- アプリの Xcode プロジェクトの [Info] タブで、ダイナミック リンクに使用する新しい URL タイプを作成します。[Identifier] フィールドに一意の値を設定し、[URL scheme] フィールドにはバンドル ID を設定します。バンドル ID は、ダイナミック リンクにより使用されるデフォルトの URL スキームです。
- アプリの Xcode プロジェクトの [Capabilities] タブで関連ドメインを有効にし、[Associated Domains] リストに次のドメインを追加します。
applinks:your_dynamic_links_domain
- 完全なカスタム ドメインを含むダイナミック リンクを受信する場合は、Xcode プロジェクトの
Info.plist
ファイル内でFirebaseDynamicLinksCustomDomains
というキーを作成し、アプリの Dynamic Links URL 接頭辞に追加します。例:FirebaseDynamicLinksCustomDomains https://example.com/promos https://example.com/links/share UIApplicationDelegate
にFirebaseCore
モジュールと、アプリのデリゲートが使用する他の Firebase モジュールをインポートします。たとえば、Cloud Firestore と Authentication を使用するには、次のようにします。SwiftUI
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Swift
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Objective-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- アプリ デリゲートの
application(_:didFinishLaunchingWithOptions:)
メソッドで、FirebaseApp
共有インスタンスを構成します。SwiftUI
// Use Firebase library to configure APIs FirebaseApp.configure()
Swift
// Use Firebase library to configure APIs FirebaseApp.configure()
Objective-C
// Use Firebase library to configure APIs [FIRApp configure];
- 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() } } } }
- 次に、
application:continueUserActivity:restorationHandler:
メソッドで、アプリがすでにインストールされている場合にユニバーサル リンクとして受信されるリンクを処理します。Swift
注: このプロダクトは、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; }
- 最後に、
application:openURL:options:
で、アプリのカスタム URL スキームを通して受信したリンクを処理します。このメソッドは、インストール後にアプリを初めて開いたときに呼び出されます。アプリの最初の起動時にダイナミック リンクが見つからなかった場合、このメソッドは
DynamicLink
のurl
にnil
が設定された状態で呼び出されます。これは、対応する保留中のダイナミック リンクを SDK が見つけることができなかったことを示します。Swift
注: このプロダクトは、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; }