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

تعرف على كيفية تنفيذ ومعالجة مخططات URL المخصصة والروابط العالمية │ في تطبيق SwiftUI الخاص بك لتوجيه المستخدمين إلى محتوى معين.

Intermediate

يتضمن التعامل مع الروابط العميقة في SwiftUI تكوين تطبيقك للاستجابة لعناوين URL محددة ثم تحليل تلك العناوين للانتقال إلى المحتوى المناسب داخل تطبيقك. هناك نوعان أساسيان من الروابط العميقة: مخططات عناوين URL المخصصة والروابط العالمية.

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

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

التكوين:

  1. أضف نوع عنوان URL في Xcode:
    • في مشروع Xcode الخاص بك، حدد هدفك.
    • انتقل إلى علامة التبويب "معلومات".
    • ضمن "أنواع عناوين URL"، انقر فوق الزر "+" لإضافة نوع عنوان URL جديد.
    • قم بتعيين "المعرف" (على سبيل المثال، com.yourcompany.yourapp). من الأفضل استخدام معرف حزمة التطبيق كبادئة.
    • اضبط "أنظمة URL" على النظام الذي تريده (على سبيل المثال، myapp).

المعالجة في SwiftUI:

يمكنك استخدام معدل العرض .onOpenURL لمعالجة عناوين URL الواردة. هذا المعدل متاح منذ iOS 14.

import SwiftUI struct ContentView: View {  @State private var receivedURL: URL?  var body: some View {
 VStack {  Text("Deep Link Handler")
 if let url = receivedURL {  Text("Received URL: \(url.absoluteString)")  // تحليل عنوان URL والتنقل وفقًا لذلك  // مثال: myapp://product?id=123  if url.host == "product",  let components = URLComponents(url: url, resolvingAgainstBaseURL: false),  let id = components.queryItems?.first(حيث: { $0.name == "id" })?.القيمة {  النص("معرف المنتج: \(id)")  }  } else {  نص("لم يتم استلام أي رابط عميق حتى الآن.")  }  }  .onOpenURL { url in  receivedURL = url
 print("تم استلام مخطط URL مخصص: \(url)")  }
 } } 

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

الروابط العالمية هي روابط HTTPS قياسية (على سبيل المثال، https://yourwebsite.com/path) يمكنها فتح تطبيقك مباشرةً إذا كان مثبتًا، أو الرجوع إلى موقعك الإلكتروني إذا لم يكن مثبتًا. وهي توفر تجربة مستخدم سلسة.

التكوين:

  1. حقوق النطاقات المرتبطة:

    • في مشروع Xcode الخاص بك، حدد هدفك.
    • انتقل إلى علامة التبويب "التوقيع والقدرات".
    • انقر على "+ قدرة" وأضف "المجالات المرتبطة".
    • أضف إدخالًا بالصيغة applinks:yourwebsite.com (على سبيل المثال، applinks:example.com).
  2. apple-app-site-association الملف:

    • أنشئ ملف JSON باسم apple-app-site-association (بدون امتداد .json).
    • استضف هذا الملف على موقع الويب الخاص بك في الجذر أو في دليل .well-known (على سبيل المثال، https://yourwebsite.com/apple-app-site-association أو https://yourwebsite.com/.well-known/apple-app-site-association).
    • يحدد الملف المسارات على موقع الويب الخاص بك التي يجب أن تفتح تطبيقك. ستحتاج إلى معرف فريقك ومعرف الحزمة لهذا الملف.

    مثال على ملف apple-app-site-association:

    json { "applinks": { "details": [ { "appIDs": [ "YOUR_TEAM_ID.com.yourcompany.yourapp" ], "components": [ { "/": "/products/*", "comment": "يتطابق مع أي عنوان URL في مسار /products/" }, { "/": "/profile/*", "comment": "يتطابق مع أي عنوان URL في مسار /profile/" } ] } ] } }

التعامل في SwiftUI:

على غرار مخططات عناوين URL المخصصة، يمكنك استخدام المعدل .onOpenURL.

import SwiftUI

struct ContentView: View {
 @State private var receivedUniversalLink: URL?

 var body: some View {  VStack {  Text("معالج الارتباط الشامل")  if let url = receivedUniversalLink {  نص("Received Universal Link: \(url.absoluteString)")  // تحليل عنوان URL والتنقل  // مثال: https://yourwebsite.com/products/123  if url.pathComponents.contains("products"),
 let productId = url.lastPathComponent {
 نص("معرف المنتج من الرابط العام: \(productId)")
 }
 } else {  نص("لم يتم استلام رابط عالمي بعد.")  }  }
 .onOpenURL { url in
 receivedUniversalLink = url  print("Received universal link: \(url)")  }
 } } 

3. التحليل والتصفح

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

import SwiftUI enum AppRoute: Hashable {  case home  case product(id: String)  الحالة الملف الشخصي(id: سلسلة)
 case settings } class DeepLinkManager: ObservableObject {  @Published var navigationPath = NavigationPath()  func handleURL(_ url: URL) {  guard let host = url.host else { return }  // مثال لنظام URL مخصص: myapp://product?id=123  // مثال للرابط الشامل: https://yourwebsite.com/products/123   if host == "product" || url.pathComponents.contains("products") {  if let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
 let id = components.queryItems؟.span>first(حيث: { $0. == "id" })?.value ?? url.lastPathComponent {  navigationPath.append(AppRoute.product(id: id))  }
 } else if host == "profile" || url.pathComponents.يحتوي("الملف الشخصي") {  إذا let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
 let id = components.queryItems?.first(where: { $0.name == "id" })?.قيمة ؟ url.lastPathComponent {  navigationPath.append(AppRoute.profile(id: id))  }  }
 // إضافة المزيد من منطق التوجيه للمسارات الأخرى  } }