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

برای دریافت Firebase Dynamic Links که ایجاد کرده‌اید ، باید SDK Dynamic Links در برنامه خود بگنجانید و هنگام بارگذاری برنامه، متدهای handleUniversalLink: و dynamicLinkFromCustomSchemeURL: را فراخوانی کنید تا داده‌های ارسالی در Dynamic Link را دریافت کنید.

پیش‌نیازها

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

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

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

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

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

    با باز کردن URL زیر می‌توانید تأیید کنید که پروژه 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 SDK از فایل اجرایی iOS را غیرفعال کنید.

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

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

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

  1. در تب Info پروژه Xcode برنامه خود، یک نوع URL جدید برای استفاده در Dynamic Links ایجاد کنید. فیلد Identifier را روی یک مقدار منحصر به فرد تنظیم کنید و فیلد URL scheme را به عنوان شناسه بسته خود تنظیم کنید، که طرح URL پیش‌فرض مورد استفاده Dynamic Links است.
  2. در تب «قابلیت‌ها» (Capabilities) پروژه Xcode برنامه خود، گزینه «دامنه‌های مرتبط» (Associated Domains) را فعال کنید و موارد زیر را به لیست «دامنه‌های مرتبط» (Associated Domains) اضافه کنید:
    applinks:your_dynamic_links_domain
  3. اگر می‌خواهید Dynamic Links با یک دامنه کاملاً سفارشی دریافت کنید، در فایل Info.plist پروژه Xcode خود، یک کلید به نام FirebaseDynamicLinksCustomDomains ایجاد کنید و آن را روی پیشوندهای URL Dynamic Links برنامه خود تنظیم کنید. برای مثال:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. ماژول FirebaseCore را در UIApplicationDelegate خود وارد کنید، و همچنین هر ماژول Firebase دیگری که app delegate شما از آن استفاده می‌کند. به عنوان مثال، برای استفاده از Cloud Firestore و Authentication :

    سویفت‌یو‌آی

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

    سویفت

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    هدف-سی

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. یک نمونه اشتراکی FirebaseApp در متد application application(_:didFinishLaunchingWithOptions:) از نماینده برنامه خود پیکربندی کنید:

    سویفت‌یو‌آی

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

    سویفت

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

    هدف-سی

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. اگر از SwiftUI استفاده می‌کنید، باید یک نماینده برنامه ایجاد کنید و آن را از طریق UIApplicationDelegateAdaptor یا NSApplicationDelegateAdaptor به ساختار App خود پیوست کنید. همچنین باید swizzling نماینده برنامه را غیرفعال کنید. برای اطلاعات بیشتر، به دستورالعمل‌های 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: لینک‌های دریافتی را به عنوان لینک‌های جهانی (Universal Links) در صورت نصب بودن برنامه، مدیریت کنید:

    سویفت

    توجه: این محصول برای سیستم‌عامل‌های 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
    }

    هدف-سی

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

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

    سویفت

    توجه: این محصول برای سیستم‌عامل‌های 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
    }

    هدف-سی

    توجه: این محصول برای سیستم‌عامل‌های 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;
    }