تلقّي الروابط الديناميكية على نظام التشغيل iOS

لتلقي روابط Firebase الديناميكية التي الذي أنشأته، عليك تضمين حزمة تطوير البرامج (SDK) للروابط الديناميكية في تطبيقك واستدعاء handleUniversalLink: وdynamicLinkFromCustomSchemeURL: عند تحميل تطبيقك للحصول على البيانات التي يتم تمريرها في الرابط الديناميكي.

المتطلبات الأساسية

قبل البدء، تأكَّد من إضافة Firebase إلى جهاز iOS مشروعك.

يمكنك استخدام "مدير حزم Swift" لتثبيت اعتماديات Firebase وإدارتها.

  1. في Xcode، انتقِل إلى File (ملف) > بعد فتح مشروع التطبيق الخاص بك. إضافة حِزم
  2. أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Firebase Apple عندما يُطلب منك ذلك:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. اختَر مكتبة "الروابط الديناميكية".
  5. أضِف العلامة -ObjC إلى القسم علامات الروابط الأخرى في إعدادات إصدار هدفك.
  6. للحصول على أفضل تجربة باستخدام الروابط الديناميكية، ننصح تفعيل "إحصاءات Google" في مشروعك على Firebase وإضافة حزمة تطوير البرامج (SDK) لمنصّة Firebase الخاصة بخدمة "إحصاءات Google" إلى تطبيقك. يمكنك اختيار إما المكتبة التي لا تتضمن جمع معرّف المعلِنين (IDFA) أو من خلال جمع معرّف المعلِنين (IDFA).
  7. عند الانتهاء، سيبدأ Xcode تلقائيًا في حل وتنزيل ملف والتبعيات في الخلفية.

والآن، نفِّذ بعض خطوات الضبط:

  1. في وحدة تحكُّم Firebase، افتح الروابط الديناميكية . اقبل بنود الخدمة إذا طُلب منك ذلك.
  2. يُرجى التأكُّد من أنّ رقم تعريف تطبيقك في App Store وبادئة معرّف التطبيق المحدّدة في إعدادات التطبيق. لعرض إعدادات تطبيقك وتعديلها، يُرجى الانتقال إلى بمشروعك على Firebase صفحة الإعدادات واختر تطبيق iOS.

    يمكنك التأكّد من ضبط مشروع Firebase بشكل صحيح لاستخدامه. الروابط الديناميكية في تطبيق iOS من خلال فتح عنوان URL التالي:

    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. اختياري: إيقاف استخدام حزمة تطوير البرامج (SDK) للروابط الديناميكية لنظام التشغيل iOS اللصق.

    بشكلٍ افتراضي، تستخدم حزمة تطوير البرامج (SDK) للروابط الديناميكية لوحة اللصق لتحسين موثوقية الروابط لمواضع معيّنة بعد التثبيت. باستخدام لوحة اللصق، تتيح لك "الروابط الديناميكية" التأكد من أنه عندما يفتح المستخدم رابطًا ديناميكيًا ولكنه يحتاج إلى تثبيت التطبيق أولاً، يمكن للمستخدم الانتقال على الفور إلى المحتوى المرتبط الأصلي عند فتح التطبيق لأول مرة بعد التثبيت.

    والجانب السلبي لهذا الخيار هو أن استخدام لوحة اللصق يؤدي إلى على نظام التشغيل iOS 14 والإصدارات الأحدث. لذلك، عند فتح المستخدمين لتطبيقك لأول مرة، إذا احتوت لوحة اللصق على عنوان URL، فسوف ترى إشعارًا يفيد بأن وصول التطبيق إلى اللوحة الملصقة، مما قد يتسبب في حدوث ارتباك.

    لإيقاف هذا السلوك، عدِّل ملف Info.plist وضبط إعدادات مفتاح FirebaseDeepLinkPasteboardRetrievalEnabled من أجل NO

  1. في علامة التبويب المعلومات ضِمن مشروع Xcode لتطبيقك، أنشئ خريطة جديدة. نوع عنوان URL المُستخدم للروابط الديناميكية. ضبط المعرِّف إلى قيمة فريدة وحقل مخطط عنوان URL إلى معرف الحزمة، وهو مخطط عنوان URL التلقائي الذي تستخدمه الروابط الديناميكية.
  2. في علامة التبويب الإمكانات ضمن مشروع Xcode لتطبيقك، يُرجى اتّباع الخطوات التالية: لتفعيل "النطاقات المرتبطة" وإضافة ما يلي إلى الحقل مرتبط قائمة النطاقات:
    applinks:your_dynamic_links_domain
  3. إذا كنت ترغب في تلقي روابط ديناميكية مع نطاق خاص بالكامل، في ملف Info.plist لمشروع Xcode، أنشئ مفتاحًا يسمى FirebaseDynamicLinksCustomDomains وضبطه على مستوى بادئات عناوين URL للروابط الديناميكية مثل:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. استيراد وحدة FirebaseCore في UIApplicationDelegate بالإضافة إلى أي تطبيق آخر وحدات Firebase التي يستخدمها تطبيقك المفوَّض على سبيل المثال، لاستخدام Cloud Firestore والمصادقة:

    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، عليك إنشاء تفويض تطبيق وإرفاقه. إلى بنية App عبر UIApplicationDelegateAdaptor أو NSApplicationDelegateAdaptor ويجب أيضًا إيقاف إيماءة تفويض التطبيق. بالنسبة لمزيد من المعلومات، يُرجى الاطّلاع على تعليمات 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<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 المخصص لتطبيقك. ويتم استدعاء هذه الطريقة عندما فتح تطبيقك لأول مرة بعد التثبيت.

    إذا لم يتم العثور على الرابط الديناميكي في أول تشغيل لتطبيقك، سيتم استدعاء هذه الطريقة مع تم ضبط url في DynamicLink على 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;
    }