يتضمن التعامل مع الروابط العميقة في SwiftUI تكوين تطبيقك للاستجابة لعناوين URL محددة ثم تحليل تلك العناوين للانتقال إلى المحتوى المناسب داخل تطبيقك. هناك نوعان أساسيان من الروابط العميقة: مخططات عناوين URL المخصصة والروابط العالمية.
1. مخططات عناوين URL المخصصة
تسمح لك مخططات عناوين URL المخصصة بتحديد بادئة فريدة (على سبيل المثال، myapp://) والتي عند النقر عليها، ستفتح تطبيقك.
التكوين:
- أضف نوع عنوان 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) يمكنها فتح تطبيقك مباشرةً إذا كان مثبتًا، أو الرجوع إلى موقعك الإلكتروني إذا لم يكن مثبتًا. وهي توفر تجربة مستخدم سلسة.
التكوين:
-
حقوق النطاقات المرتبطة:
- في مشروع Xcode الخاص بك، حدد هدفك.
- انتقل إلى علامة التبويب "التوقيع والقدرات".
- انقر على "+ قدرة" وأضف "المجالات المرتبطة".
- أضف إدخالًا بالصيغة
applinks:yourwebsite.com(على سبيل المثال،applinks:example.com).
-
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/" } ] } ] } } - أنشئ ملف JSON باسم
التعامل في 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)) } }
// إضافة المزيد من منطق التوجيه للمسارات الأخرى } }