دریافت پیوندهای پویا در iOS

برای دریافت Firebase Dynamic Links که ایجاد کرده‌اید، باید کیت توسعه نرم‌افزار Dynamic Links را در برنامه‌تان اضافه کنید و روش‌های handleUniversalLink: و dynamicLinkFromCustomSchemeURL: را هنگام بار شدن برنامه‌تان فراخوانی کنید تا داده‌های منتقل‌شده در Dynamic Link را دریافت کنید.

پیش‌نیازها

قبل‌از شروع، حتماً Firebase را به پروژه iOS خود اضافه کنید.

از Swift Package Manager برای نصب و مدیریت وابستگی‌های Firebase استفاده کنید.

  1. در Xcode، درحالی‌که پروژه برنامه‌تان باز است، به File (فایل) > Add Packages (افزودن بسته‌ها) بروید.
  2. وقتی خواسته شد، مخزن کیت توسعه نرم‌افزار Firebase برای پلاتفرم‌های Apple را اضافه کنید:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. کتابخانه Dynamic Links را انتخاب کنید.
  5. پرچم -ObjC را به بخش Other Linker Flags (سایر پرچم‌های پیونددهنده) در تنظیمات ساخت هدف اضافه کنید.
  6. برای داشتن تجربه بهینه با Dynamic Links، توصیه می‌کنیم Google Analytics را در پروژه Firebase خود فعال کنید و کیت توسعه نرم‌افزار Firebase برای Google Analytics را به برنامه‌تان اضافه کنید. می‌توانید کتابخانه را با یا بدون مجموعه IDFA انتخاب کنید. پرسشگان ما را درباره آخرین سازمان‌دهی ماژول‌ها در Google Analytics برای کیت توسعه نرم‌افزار Firebase ببینید.
  7. پس‌از اتمام، Xcode به‌طور خودکار شروع به حل و بارگیری وابستگی‌های شما در پس‌زمینه می‌کند.

اکنون، چند مرحله پیکربندی را انجام دهید:

  1. در کنسول Firebase، بخش Dynamic Links را باز کنید. اگر از شما خواسته شد، شرایط خدمات را بپذیرید.
  2. مطمئن شوید که شناسه App Store برنامه و پیشوند شناسه برنامه شما در تنظیمات برنامه‌تان مشخص شده باشد. برای مشاهده و ویرایش تنظیمات برنامه‌تان، به صفحه تنظیمات پروژه Firebase بروید و برنامه iOS خود را انتخاب کنید.

    با باز کردن نشانی وب زیر می‌توانید تأیید کنید که پروژه Firebase شما به‌درستی برای استفاده از Dynamic Links در برنامه iOS شما پیکربندی شده است:

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

    اگر برنامه‌تان متصل باشد، فایل apple-app-site-association حاوی ارجاعی به پیشوند شناسه برنامه و شناسه دسته نرم‌افزاری برنامه‌تان است. برای مثال:

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

    اگر فیلد details خالی است، دوباره بررسی کنید که پیشوند شناسه برنامه‌تان را مشخص کرده باشید. توجه داشته باشید که پیشوند شناسه برنامه شما ممکن است با شناسه تیم شما یکسان نباشد.

  3. اختیاری: استفاده «کیت توسعه نرم‌افزار» Dynamic Links از تخته‌چسباندن iOS را غیرفعال کنید.

    به‌طور پیش‌فرض، کیت توسعه نرم‌افزار Dynamic Links از تخته‌چسباندن برای بهبود قابلیت اطمینان پیوندهای عمیق پس‌از نصب استفاده می‌کند. بااستفاده از تخته‌چسب، Dynamic Links می‌تواند مطمئن شود که وقتی کاربر Dynamic Link را باز می‌کند اما ابتدا باید برنامه‌تان را نصب کند، کاربر می‌تواند بلافاصله پس‌از نصب و هنگام باز کردن برنامه برای اولین‌بار، به محتوای پیوندشده اصلی برود.

    نکته منفی این است که استفاده از تخته‌چسباندن باعث فعال شدن اعلان در iOS 14 و نسخه‌های جدیدتر می‌شود. بنابراین، اولین باری که کاربران برنامه‌تان را باز می‌کنند، اگر تخته‌چسبان حاوی نشانی وب باشد، اعلانی خواهند دید که برنامه‌تان به تخته‌چسبان دسترسی پیدا کرده است، که می‌تواند باعث سردرگمی شود.

    برای غیرفعال کردن این رفتار، فایل Info.plist پروژه Xcode را ویرایش کنید و کلید FirebaseDeepLinkPasteboardRetrievalEnabled را روی NO تنظیم کنید.

  1. در برگه اطلاعات پروژه Xcode برنامه‌تان، نوع نشانی وب جدیدی ایجاد کنید تا برای Dynamic Links استفاده شود. فیلد شناسه را روی مقدار منحصربه‌فرد و فیلد طرح‌واره نشانی وب را روی شناسه دسته نرم‌افزاری‌تان تنظیم کنید که طرح‌واره نشانی وب پیش‌فرض مورداستفاده Dynamic Links است.
  2. در برگه قابلیت‌ها پروژه Xcode برنامه‌تان، «دامنه‌های مرتبط» را فعال کنید و موارد زیر را به فهرست دامنه‌های مرتبط اضافه کنید:
    applinks:your_dynamic_links_domain
  3. اگر می‌خواهید Dynamic Links را با دامنه کاملاً سفارشی دریافت کنید، در فایل Info.plist پروژه Xcode، کلیدی به‌نام FirebaseDynamicLinksCustomDomains ایجاد کنید و آن را روی پیشوندهای نشانی وب Dynamic Links برنامه‌تان تنظیم کنید. برای مثال:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. واحد FirebaseCore را در UIApplicationDelegate و همچنین هر واحد 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;
    // ...
          
  5. یک FirebaseApp نمونه مشترک را در application(_:didFinishLaunchingWithOptions:) روش نماینده برنامه‌تان پیکربندی کنید:

    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];
  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: ، پیوندهای دریافتی را به‌عنوان پیوندهای جامع در زمانی که برنامه ازقبل نصب شده است مدیریت کنید:

    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> *_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: پیوندهای دسته دریافت‌شده ازطریق طرح‌واره نشانی وب سفارشی برنامه‌تان. این روش زمانی فراخوانی می‌شود که برنامه شما برای اولین‌بار پس‌از نصب باز شود.

    اگر Dynamic Link در اولین راه‌اندازی برنامه‌تان پیدا نشود، این روش با DynamicLink url تنظیم‌شده روی nil فراخوانی می‌شود که نشان می‌دهد کیت توسعه نرم‌افزار نتوانسته است Dynamic Link معلق منطبقی پیدا کند.

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