
سلام رفیق! اگه تا حالا شنیدی که یه لینکی رو تو گوشی کلیک میکنی و یهو اپلیکیشن باز میشه و میره دقیقاً همون جایی که میخوای، احتمالاً با Universal Link سروکار داشتی! این ویژگی باحال که اپل از iOS 9 به بعد معرفی کرده، یه جورایی مثل یه پل جادویی بین وبسایت و اپلیکیشن عمل میکنه. تو این مقاله قراره با زبون خودمونی و خیلی دقیق بریم تو عمق ماجرا و ببینیم Universal Link چیه، چطور کار میکنه، چرا باید بهش اهمیت بدی و چطور میتونی تو پروژهت ازش استفاده کنی. پس کمربندات رو ببند که قراره حسابی بترکونیم! 🚀
به زبان ساده، Universal Link یه لینک وب معمولی (مثل https://example.com/product/123) هست که میتونه کاربر رو بسته به شرایط به جاهای مختلف هدایت کنه:
این ویژگی باعث میشه تجربه کاربری (UX) خیلی روانتر بشه، چون کاربر دیگه لازم نیست کلی بگرده تا به چیزی که میخواد برسه. حالا چرا بهش میگن "Universal"؟ چون یه لینک واحد برای همه سناریوها (وب، اپ، اپ استور) کار میکنه و مختص دستگاههای اپل (iOS و macOS) هست.
تفاوت با Deep Link سنتی:
قبلاً برای هدایت کاربر به یه جای خاص تو اپ از Custom URL Scheme (مثل myapp://product/123) استفاده میشد. مشکل این روش این بود که:
Universal Link یه ابزار قدرتمند برای توسعهدهندهها و بازاریابهاست. بیایم چندتا دلیل باحالش رو ببینیم:
برای اینکه Universal Link درست کار کنه، باید یه سری تنظیمات سمت اپ و وبسایت انجام بدی. بیایم یه مرور سریع کنیم که قضیه از چه قراره:
/.well-known/apple-app-site-association) آپلود بشه.https://example.com/product/* به اپت وصل بشن..json) و حداکثر 128 کیلوبایت.{
"applinks": {
"apps": [],
"details": [
{
"appID": "ABCD1234.com.example.myapp",
"paths": ["/product/*", "/news/"]
}
]
}
}
appID: ترکیبی از Team ID (از حساب دولوپر اپل) و Bundle ID اپته.paths: مسیرهایی که میخوای به اپ وصل بشن. * یعنی همه زیرمسیرها.applinks:example.com).AppDelegate یا SceneDelegate با متدهای مثل application:continueUserActivity:restorationHandler: انجام میشه.https://example.com/product/123 باز شد، اپ باید صفحه محصول 123 رو نشون بده.حالا که فهمیدیم Universal Link چیه، بیایم یه راهنمای عملی برای پیادهسازیش بذاریم. فرض کن یه اپ داری که میخوای لینکهای وبسایتت بهش وصل بشن.
ABCD1234 و Bundle IDت com.example.myapp باشه، فایلت اینجوری میشه:{
"applinks": {
"apps": [],
"details": [
{
"appID": "ABCD1234.com.example.myapp",
"paths": ["/product/*", "/profile/*"]
}
]
}
}
https://example.com/.well-known/apple-app-site-association آپلود کن. مطمئن شو سرور HTTPS داره و فایل بدون ریدایرکت در دسترسه.https://example.com/.well-known/apple-app-site-association و چک کن فایل درست لود میشه. میتونی از ابزارهایی مثل Branch Validator هم استفاده کنی.+ Capability کلیک کن و Associated Domains رو اضافه کن.applinks: اضافه کن، مثلاً:applinks:example.com
applinks:www.example.com
برای اینکه اپت بتونه لینکها رو بگیره و به جای درست هدایت کنه، باید کد بنویسی. اگه از Swift استفاده میکنی، اینجوری میتونی پیادهسازیش کنی:
تو AppDelegate.swift یا SceneDelegate.swift:
import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else { return } // URL رو بررسی کن و به جای درست هدایت کن if url.path.hasPrefix("/product") { let productId = url.lastPathComponent // برو به صفحه محصول با productId print("باز کردن محصول با آیدی: \(productId)") } else if url.path.hasPrefix("/profile") { // برو به صفحه پروفایل print("باز کردن پروفایل") } } }
اگه از SwiftUI استفاده میکنی، میتونی از modifier .onOpenURL استفاده کنی:
import SwiftUI @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() .onOpenURL { url in if url.path.hasPrefix("/product") { let productId = url.lastPathComponent print("باز کردن محصول با آیدی: \(productId)") } } } } }
برای تست، این کارها رو انجام بده:
https://example.com/product/123) تو یه اپ مثل Messages یا Notes بفرست و روش کلیک کن.Universal Link یه کم حساسه و ممکنه یه جا گیر کنی. چندتا مشکل رایج و راهحلشون:
/.well-known/apple-app-site-association) باشه و HTTPS بدون ریدایرکت کار کنه.application/json تنظیم کرده.