كيفية التعامل مع الروابط العميقة في UIKit

يتضمن التعامل مع الروابط العميقة في UIKit آليتين رئيسيتين: **مخططات عناوين URL المخصصة** (Custom URL Schemes) و **الروابط العالمية** (Universal Links). بينما يسمح كلاهما للمستخدمين بالتنقل مباشرة إلى محتوى محدد داخل تطبيقك، فإن الروابط العالمية مفضلة بشكل عام لتجربة المستخدم السلسة وسلوك الاسترجاع ا

Intermediate

يتضمن التعامل مع الروابط العميقة في UIKit آليتين رئيسيتين: مخططات عناوين URL المخصصة (Custom URL Schemes) و الروابط العالمية (Universal Links). بينما يسمح كلاهما للمستخدمين بالتنقل مباشرة إلى محتوى محدد داخل تطبيقك، فإن الروابط العالمية مفضلة بشكل عام لتجربة المستخدم السلسة وسلوك الاسترجاع الأفضل.

1. مخططات عناوين URL المخصصة

تسمح لك مخططات عناوين URL المخصصة بتعريف بادئة فريدة لعناوين URL الخاصة بتطبيقك (على سبيل المثال، myapp://product/123). عندما ينقر المستخدم على رابط بهذا المخطط، يقوم iOS بتشغيل تطبيقك.

الإعداد:

  1. تسجيل مخطط URL في Xcode:

    • افتح مشروعك في Xcode.
    • حدد مشروعك في "Project Navigator"، ثم حدد هدفك.
    • انتقل إلى علامة التبويب "Info".
    • ضمن قسم "URL Types"، انقر فوق الزر "+" لإضافة نوع URL جديد.
    • بالنسبة لـ "Identifier"، يمكنك استخدام معرف الحزمة الخاص بتطبيقك (على سبيل المثال، com.yourcompany.yourapp).
    • بالنسبة لـ "URL Schemes"، أدخل مخططك المخصص المطلوب (على سبيل المثال، myapp).
  2. التعامل مع عنوان URL الوارد في AppDelegate أو SceneDelegate:

    • للتطبيقات التي تستخدم AppDelegate (التطبيقات القديمة أو تلك التي لا تستخدم Scene Delegates): قم بتنفيذ الدالة application(_:open:options:).

      swift func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { // Parse the URL and navigate to the appropriate content print("Received URL: \(url)") handleDeepLink(url) return true }

    • للتطبيقات التي تستخدم SceneDelegate (iOS 13 والإصدارات الأحدث): قم بتنفيذ scene(_:openURLContexts:) أو scene(_:continue:).

      ```swift func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { guard let url = URLContexts.first?.url else { return } print("Received URL: (url)") handleDeepLink(url) }

      // For Universal Links, you'll also use this method func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else { return } print("Received Universal Link: (url)") handleDeepLink(url) } ```

2. الروابط العالمية

الروابط العالمية هي روابط HTTPS قياسية تعمل لكل من موقعك على الويب وتطبيقك. إذا كان تطبيقك مثبتًا، يفتح الرابط مباشرة في تطبيقك؛ وإلا، فإنه يفتح في Safari. هذا يوفر تجربة مستخدم أكثر سلاسة.

الإعداد:

  1. إنشاء ملف apple-app-site-association:

    • يخبر ملف JSON هذا نظام iOS عناوين URL التي يمكن لتطبيقك التعامل معها.
    • استضف هذا الملف في جذر خادم الويب الخاص بك أو في الدليل الفرعي .well-known (على سبيل المثال، https://yourdomain.com/apple-app-site-association).
    • مثال للمحتوى: json { "applinks": { "apps": [], "details": [ { "appID": "TEAM_ID.com.yourcompany.yourapp", "paths": [ "/product/*", "/settings/*" ] } ] } } استبدل TEAM_ID و com.yourcompany.yourapp بقيمك الفعلية.
  2. تمكين قدرة "Associated Domains" في Xcode:

    • في Xcode، حدد مشروعك وهدفك.
    • انتقل إلى علامة التبويب "Signing & Capabilities".
    • انقر فوق "+ Capability" وحدد "Associated Domains".
    • أضف إدخالًا لكل نطاق يجب أن يتعامل معه تطبيقك، مسبوقًا بـ applinks: (على سبيل المثال، applinks:yourdomain.com).
  3. التعامل مع عنوان URL الوارد في AppDelegate أو SceneDelegate:

    • يتم التعامل مع الروابط العالمية باستخدام كائن NSUserActivity.
    • لـ AppDelegate: قم بتنفيذ application(_:continue:restorationHandler:).

      swift func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else { return false } print("Received Universal Link: \(url)") handleDeepLink(url) return true }

    • لـ SceneDelegate: استخدم الدالة scene(_:continue:) كما هو موضح في قسم مخططات عناوين URL المخصصة أعلاه.

3. منطق التعامل العام مع الروابط العميقة (دالة handleDeepLink)

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

func handleDeepLink(_ url: URL) {
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else {
        return
    }

    // Example: myapp://product/123?color=red
    // Example: https://yourdomain.com/product/123?color=red

    if components.host == "product" {
        // Extract product ID from path components or query parameters
        let productID = components.path.replacingOccurrences(of: "/", with: "")
        let color = components.queryItems?.first(where: { $0.name == "color" })?.value

        // Navigate to product detail screen
        // (e.g., using a UINavigationController or presenting a new view controller)
        if let rootViewController = UIApplication.shared.windows.first?.rootViewController as? UINavigationController {
            let productViewController = ProductDetailViewController() // Your custom VC
            productViewController.productID = productID
            productViewController.selectedColor = color
            rootViewController.pushViewController(productViewController, animated: true)
        }
    } else if components.host == "settings" {
        // Navigate to settings screen
        if let rootViewController = UIApplication.shared.windows.first?.rootViewController as? UINavigationController {
            let settingsViewController = SettingsViewController() // Your custom VC
            rootViewController.pushViewController(settingsViewController, animated: true)
        }
    }
    // Add more conditions for different paths/hosts
}

4. اعتبارات الأمان

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

5. اختبار الروابط العميقة

يمكنك اختبار الروابط العميقة عن طريق: * إدخال مخطط URL المخصص في Safari (على سبيل المثال، myapp://product/123). * استخدام الأمر xcrun simctl openurl booted <URL> في الطرفية الخاصة بك لفتح عناوين URL في محاكي iOS. * النقر على الروابط العالمية من صفحة ويب في Safari.