Universal Link مکانیزمی از Apple (iOS 9+) است که به لینکهای وب اجازه میدهد مستقیماً در برنامه باز شوند و Safari را دور بزنند. اگر برنامه نصب نباشد، لینک بدون مشکل در مرورگر باز میشود. این اصطلاح توسط Apple در سال ۲۰۱۵ در WWDC به عنوان بخشی از Handoff و اکوسیستم Continuity معرفی شد. به گفته Apple Developer، Universal Link تجربه کاربری یکپارچه بین وب و برنامه بومی را بدون دیالوگهای انتخاب فراهم میکند.
نکات اصلی
Universal Link یک لینک استاندارد HTTPS به شکل https://example.com/page است که هنگام کلیک از دستگاه iOS به جای Safari برنامه نصب شده را باز میکند. تفاوت اصلی با Custom URL Scheme: Universal Link نیازی به ثبت طرح سفارشی (myapp://) ندارد — از دامنه معمولی استفاده میکند. این کار مشکل URL Scheme hijacking را برطرف میکند، جایی که هر برنامهای میتواند همان طرح را ثبت کند.
Apple Universal Link را در WWDC 2015 در چارچوب iOS 9 معرفی کرد. این مکانیزم بخشی از اکوسیستم Handoff و Spotlight شد: Universal Link نه تنها در مرورگر، بلکه در نتایج جستجوی Spotlight، Mail، Messages و سایر برنامههای سیستمی کار میکند. علاوه بر این، Universal Link در watchOS و macOS پشتیبانی میشود — کاربر میتواند برنامه را روی iPhone از طریق لینک در Mac باز کند.
مزیت کلیدی: URL یکتا. توسعهدهنده دو لینک مختلف (یکی برای وب، دیگری برای برنامه) مدیریت نمیکند. Universal Link همان لینک https است. اگر برنامه نصب باشد — آن باز میشود. اگر نه — همان لینک در Safari به عنوان یک صفحه وب معمولی باز میشود. این یک fallback ایدهآل بدون از دست دادن ترافیک فراهم میکند.
مکانیزم Universal Link از سه مرحله تشکیل شده است: بررسی ارتباط، پردازش لینک و fallback به مرورگر. هر مرحله برای عملکرد صحیح حیاتی است. اگر ارتباط پیکربندی نشده باشد، iOS لینک را به عنوان یک انتقال معمولی به Safari پردازش میکند. بیایید هر مرحله را به طور دقیق بررسی کنیم.
در اولین کلیک روی لینک، iOS فایل apple-app-site-association را از سرور در آدرس https://example.com/.well-known/apple-app-site-association دانلود میکند. فایل شامل JSON با شناسه Team ID و Bundle ID برنامه و همچنین لیست مسیرهایی که برنامه باید باز کند است. iOS این فایل را کش میکند و به طور دورهای بهروزرسانی آن را بررسی میکند (در هنگام بهروزرسانی برنامه، راهاندازی مجدد دستگاه).
فایل JSON apple-app-site-association باید از طریق HTTPS بدون تغییر مسیر در دسترس باشد. سرور باید Content-Type: application/json را برگرداند. مهم: فایل پسوند .json ندارد — iOS آن را دقیقاً در مسیر /.well-known/apple-app-site-association جستجو میکند. Apple همچنین توصیه میکند پشتیبانی از Universal Link را در CDN اضافه کنید و بررسی کنید که فایل توسط robots.txt مسدود نشده است.
// apple-app-site-association — حداقل پیکربندی
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.example.app",
"paths": ["/product/*", "/profile/*", "/search"]
}
]
}
}
appID به صورت Team ID + Bundle ID (TEAMID.com.example.app) تشکیل میشود. paths — آرایهای از الگوهای URL که برنامه باید پردازش کند. میتوان از *، ? و نماد NOT استفاده کرد: ["NOT /admin/*", "/product/*"]. مسیرها به ترتیب شمارش بررسی میشوند: اولین تطابق رفتار را تعیین میکند. اگر مسیر مطابقت نداشته باشد — لینک در Safari باز میشود.
پس از تأیید موفقیتآمیز ارتباط، iOS لینک را به برنامه منتقل میکند. پردازش در AppDelegate از طریق متد application(_:continue:restorationHandler:) برای NSUserActivity یا در SceneDelegate از طریق scene(_:continue:) انجام میشود. توسعهدهنده یک شی NSUserActivity با نوع NSUserActivityTypeBrowsingWeb دریافت میکند، URL را استخراج میکند و به صفحه مربوطه هدایت میکند.
// پردازش Universal Link در AppDelegate
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping UIUserActivityRestorationHandler
) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL
else { return false }
// ناوبری به صفحه مطابق با URL
DeepLinkRouter.navigate(to: url)
return true
}
DeepLinkRouter در مثال بالا یک کلاس سفارشی است که URL را تجزیه میکند و هماهنگکننده ناوبری مربوطه را فراخوانی میکند. برای SwiftUI پردازش از طریق متد onOpenURL یا اصلاحکننده environment(\.openURL) انجام میشود. مهم است که نه تنها راهاندازی foreground، بلکه حالتی که برنامه راهاندازی نشده است (cold start) نیز پردازش شود: Universal Link در این حالت برنامه را از طریق گزینههای راهاندازی باز میکند.
اگر برنامه نصب نباشد، iOS به طور خودکار Universal Link را در Safari باز میکند. این تفاوت اصلی با Custom URL Scheme است: کاربر خطا نمیبیند. Fallback یک صفحه وب استاندارد از همان دامنه است. توسعهدهنده میتواند در این صفحه لینک App Store، اطلاعات محصول یا محتوای جایگزین قرار دهد.
مهم: fallback در سطح iOS قابل سفارشیسازی نیست. iOS به سادگی URL را در Safari باز میکند. برای نمایش محتوای متفاوت برای کاربران دارای برنامه نصب شده و نشده، از Smart App Banner (متا-تگ برای Safari که پیشنهاد باز کردن برنامه را میدهد) یا تشخیص نصب برنامه از طریق JavaScript استفاده کنید. Apple همچنین SKAdNetwork را برای انتساب نصبها از طریق Universal Link فراهم میکند.
Universal Link و Deep Link سنتی (Custom URL Scheme) یک کار را حل میکنند، اما از نظر معماری و امنیت تفاوت اساسی دارند. Custom URL Scheme — یک پروتکل سفارشی (myapp://) است که در Info.plist ثبت میشود. هر برنامهای میتواند همان طرح (myapp://) را ثبت کند و iOS نمیتواند تشخیص دهد کدام یک «واقعی» است. این URL Scheme hijacking نامیده میشود.
Universal Link مشکل hijacking را از طریق تأیید دامنه حل میکند. فقط صاحب دامنه میتواند apple-app-site-association را روی سرور خود قرار دهد و ارتباط با Bundle ID خاص را تأیید کند. دو برنامه نمیتوانند یک Universal Link را ثبت کنند: اگر تعارض رخ دهد، iOS به برنامهای که آخرین بار نصب شده اولویت میدهد یا Safari را باز میکند.
تفاوت دیگر: Fallback. Custom URL Scheme fallback ندارد — اگر برنامه نصب نباشد، مرورگر خطا نشان میدهد. Universal Link سایت را باز میکند. URL یکتا به این معنی است که ارزش SEO لینک حفظ میشود (لینک توسط Google ایندکس میشود) و کاربر با هر دستگاهی محتوای مرتبط دریافت میکند. Universal Link یک گام تکاملی از deep link به unified link است.
| ویژگی | Custom URL Scheme | Universal Link |
|---|---|---|
| فرمت | myapp://path | https://domain/path |
| تأیید | خیر | apple-app-site-association |
| امنیت | آسیبپذیر به hijacking | فقط صاحب دامنه |
| Fallback | خطا | سایت در Safari |
| نسخه iOS | iOS 3+ | iOS 9+ |
تنظیمات Universal Link شامل بخش سرور و بخش مشتری است. بخش سرور — قرار دادن فایل apple-app-site-association در آدرس https://domain/.well-known/apple-app-site-association. بخش مشتری — ثبت دامنه در Associated Domains در Xcode (Capabilities → Associated Domains → applinks:example.com). پس از آن برنامه به طور خودکار تمام Universal Link را برای دامنه مشخص شده دریافت میکند.
مراحل تنظیمات:
اشکالزدایی Universal Link — سردرد رایج توسعهدهندگان iOS. دلایل اصلی لینکهای کار نکرده: فایل apple-app-site-association از طریق HTTPS در دسترس نیست، appID نادرست، Content-Type غیر application/json، تغییر مسیر از مسیر /.well-known، کش شدن نسخه قدیمی فایل (بازنشانی از طریق Settings → Developer → Associated Domains Development). Apple ابزار «Validation Checker» را در Apple Developer Console برای تست ارتباط فراهم میکند.
Branch و سایر پلتفرمهای MMP تنظیمات Universal Link را ساده میکنند: آنها apple-app-site-association را به طور خودکار تولید و در دامنه خود میزبانی میکنند. توسعهدهنده فقط باید دامنه Branch را به Associated Domains اضافه کند و SDK را یکپارچه کند. این مخصوصاً برای استارتاپهایی که زیرساخت سرور خود را برای میزبانی فایل AASA ندارند مفید است.
Universal Link چند محدودیت دارد. اول: فایل apple-app-site-association باید دقیقاً از طریق HTTPS در دسترس باشد (HTTP پشتیبانی نمیشود). دوم: لینک باید به همان دامنهای اشاره کند که در Associated Domains مشخص شده است. Universal Link بین دامنهای کار نمیکند — برای هر دامنه یک ورودی جداگانه در Capabilities و یک فایل AASA جداگانه نیاز است. سوم: Universal Link در WKWebView کار نمیکند — فقط در Safari و اجزای سیستمی.
سازگاری: iOS 9.0+ (Universal Link)، watchOS 6.0+ (Handoff Universal Link)، macOS 10.15+ (برنامههای Catalyst و Mac). در نسخههای قدیمیتر iOS لینک در Safari باز میشود. این به این معنی است که در iOS 8 (کمتر از ۱٪ دستگاهها) Universal Link کار نخواهد کرد. توصیه میشود برای دستگاههای قدیمی از Custom URL Scheme به عنوان fallback پشتیبانی کنید، اگر مخاطب شامل کاربران با نسخههای قدیمی است.
تغییرات iOS 16+: Apple پردازش Universal Link را برای SwiftUI بهبود بخشید. یک اصلاحکننده جدید environment(\.openURL) با امکان پردازش تأخیری ظاهر شد. iOS 16 همچنین اجازه میدهد Universal Link حتی از طریق SFSafariViewController در برنامه باز شود. برای کاربران iOS 16 توصیه میشود به طور کامل به پردازش Universal Link در SwiftUI مهاجرت کنند و کد AppDelegate را فقط برای سازگاری معکوس نگه دارند.
سوالات متداول
Universal Link از HTTPS-URL استاندارد استفاده میکند و از طریق فایل روی سرور تأیید میشود. Custom URL Scheme از پروتکل سفارشی (myapp://) بدون تأیید استفاده میکند که آن را در برابر ربودن توسط برنامه دیگری که همان طرح را ثبت کرده آسیبپذیر میکند.
فایل در ریشه سرور HTTPS در مسیر /.well-known/apple-app-site-association (بدون پسوند .json) قرار میگیرد. سرور باید Content-Type: application/json را برگرداند. مهم: هیچ تغییر مسیری، فایل باید مستقیماً در دسترس باشد.
دلایل اصلی: Team ID یا Bundle ID نادرست در فایل AASA، فایل از طریق HTTPS در دسترس نیست، تغییر مسیر، Content-Type نادرست، کش شدن نسخه قدیمی. از طریق Developer → Associated Domains Development بررسی کنید و با راهاندازی مجدد دستگاه کش را بازنشانی کنید.
خیر — Universal Link به سرور HTTPS نیاز دارد که apple-app-site-association روی آن قرار گیرد. بدون دامنه Universal Link کار نمیکند. جایگزین: Custom URL Scheme (امنیت کمتر) یا سرویسهای شخص ثالث (Branch, Firebase) با دامنه خود.
خیر — Universal Link فناوری اختصاصی Apple برای iOS، iPadOS، watchOS و macOS است. در Android معادل آن App Link (Android 6.0+) نام دارد که به جای apple-app-site-association از Digital Asset Links (assetlinks.json) استفاده میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید