ویرگول
ورودثبت نام
Sedali
Sedaliیه پسری که کل عمرش دنبال این بود که یه Div رو center کنه:)
Sedali
Sedali
خواندن ۷ دقیقه·۳ سال پیش

آشنایی با Universal Link و چطور کار می‌کنه؟



سلام رفیق! اگه تا حالا شنیدی که یه لینکی رو تو گوشی کلیک می‌کنی و یهو اپلیکیشن باز می‌شه و می‌ره دقیقاً همون جایی که می‌خوای، احتمالاً با Universal Link سروکار داشتی! این ویژگی باحال که اپل از iOS 9 به بعد معرفی کرده، یه جورایی مثل یه پل جادویی بین وب‌سایت و اپلیکیشن عمل می‌کنه. تو این مقاله قراره با زبون خودمونی و خیلی دقیق بریم تو عمق ماجرا و ببینیم Universal Link چیه، چطور کار می‌کنه، چرا باید بهش اهمیت بدی و چطور می‌تونی تو پروژه‌ت ازش استفاده کنی. پس کمربندات رو ببند که قراره حسابی بترکونیم! 🚀

Universal Link چیه؟

به زبان ساده، Universal Link یه لینک وب معمولی (مثل https://example.com/product/123) هست که می‌تونه کاربر رو بسته به شرایط به جاهای مختلف هدایت کنه:

  • اگه اپلیکیشن مرتبط روی گوشی نصب باشه، لینک مستقیم اپ رو باز می‌کنه و می‌ره به یه جای خاص تو اپ (مثلاً صفحه یه محصول).
  • اگه اپ نصب نباشه، همون لینک تو مرورگر باز می‌شه و کاربر رو به وب‌سایت می‌بره.
  • اگه اپ نصب نباشه و بخوای کاربر اپ رو دانلود کنه، می‌تونی کاربر رو به اپ استور هدایت کنی.

این ویژگی باعث می‌شه تجربه کاربری (UX) خیلی روان‌تر بشه، چون کاربر دیگه لازم نیست کلی بگرده تا به چیزی که می‌خواد برسه. حالا چرا بهش می‌گن "Universal"؟ چون یه لینک واحد برای همه سناریوها (وب، اپ، اپ استور) کار می‌کنه و مختص دستگاه‌های اپل (iOS و macOS) هست.

تفاوت با Deep Link سنتی:
قبلاً برای هدایت کاربر به یه جای خاص تو اپ از Custom URL Scheme (مثل myapp://product/123) استفاده می‌شد. مشکل این روش این بود که:

  • اگه اپ نصب نبود، کاربر با یه خطای زشت تو مرورگر روبرو می‌شد.
  • چندتا اپ می‌تونستن یه URL Scheme رو ادعا کنن و این باعث سردرگمی یا حتی مشکلات امنیتی می‌شد.
    Universal Link این مشکلات رو حل کرده و به جاش یه روش امن‌تر و کاربرپسندتر آورده.

چرا Universal Link مهمه؟

Universal Link یه ابزار قدرتمند برای توسعه‌دهنده‌ها و بازاریاب‌هاست. بیایم چندتا دلیل باحالش رو ببینیم:

  • تجربه کاربری بهتر: کاربرا مستقیم به محتوای موردنظرشون می‌رسن، چه تو اپ، چه تو وب. مثلاً یه ایمیل تبلیغاتی برای یه محصول می‌فرستی، کاربر کلیک می‌کنه و مستقیم می‌ره به صفحه محصول تو اپ.
  • افزایش تعامل با اپ: چون کاربرا راحت‌تر به اپ هدایت می‌شن، احتمال استفاده از اپ و ماندگاریشون بیشتر می‌شه.
  • امنیت بالاتر: Universal Link از یه فایل خاص (Apple App Site Association) برای تأیید ارتباط بین اپ و وب‌سایت استفاده می‌کنه، پس هکرا نمی‌تونن لینک رو بدزدن.
  • آنالیتیکس بهتر: می‌تونی رفتار کاربرا رو با ابزارهای آنالیتیکس track کنی و ببینی چطور با لینک‌ها تعامل می‌کنن.
  • چندپلتفرمی: هرچند Universal Link مختص اپله، اما مفهومش (مثل Android App Links) روی اندروید هم پیاده‌سازی شده و می‌تونی تجربه مشابهی رو همه‌جا داشته باشی.

Universal Link چطور کار می‌کنه؟

برای اینکه Universal Link درست کار کنه، باید یه سری تنظیمات سمت اپ و وب‌سایت انجام بدی. بیایم یه مرور سریع کنیم که قضیه از چه قراره:

  1. فایل Apple App Site Association (AASA):این یه فایل JSON هست که باید تو سرور وب‌سایتت (تو مسیر /.well-known/apple-app-site-association) آپلود بشه.
    تو این فایل مشخص می‌کنی که کدوم لینک‌ها باید به اپت وصل بشن.
    مثلاً می‌تونی بگی لینک‌های https://example.com/product/* به اپت وصل بشن.
    فایل باید HTTPS باشه، بدون پسوند (نه .json) و حداکثر 128 کیلوبایت.
    نمونه فایل AASA:{
    "applinks": {
    "apps": [],
    "details": [
    {
    "appID": "ABCD1234.com.example.myapp",
    "paths": ["/product/*", "/news/"]
    }
    ]
    }
    }
    appID
    : ترکیبی از Team ID (از حساب دولوپر اپل) و Bundle ID اپته.
    paths: مسیرهایی که می‌خوای به اپ وصل بشن. * یعنی همه زیرمسیرها.
  2. تنظیمات اپ (Associated Domains):تو Xcode باید قابلیت Associated Domains رو فعال کنی و دامین‌هایی که می‌خوای پشتیبانی کنن رو وارد کنی (مثل applinks:example.com).
    این کار باعث می‌شه iOS بدونه کدوم دامین‌ها به اپت وصلن.
  3. هندل کردن لینک تو اپ:تو کد اپت باید مشخص کنی که وقتی Universal Link باز شد، کجا بره. این کار معمولاً تو AppDelegate یا SceneDelegate با متدهای مثل application:continueUserActivity:restorationHandler: انجام می‌شه.
    مثلاً اگه لینک https://example.com/product/123 باز شد، اپ باید صفحه محصول 123 رو نشون بده.
  4. رفتار سیستم:وقتی کاربر روی یه Universal Link کلیک می‌کنه، iOS اول فایل AASA رو از سرور می‌خونه.
    اگه اپ نصب باشه و لینک تو AASA تعریف شده باشه، اپ باز می‌شه.
    اگه اپ نصب نباشه، لینک تو Safari یا مرورگر پیش‌فرض باز می‌شه.
    اگه کاربر اپ رو نصب کنه و دوباره روی لینک کلیک کنه، مستقیم به اپ هدایت می‌شه.

قدم به قدم راه‌اندازی Universal Link

حالا که فهمیدیم Universal Link چیه، بیایم یه راهنمای عملی برای پیاده‌سازیش بذاریم. فرض کن یه اپ داری که می‌خوای لینک‌های وب‌سایتت بهش وصل بشن.

۱. آماده‌سازی وب‌سایت

  • ایجاد فایل AASA:
    یه فایل JSON مثل نمونه بالا بساز. مثلاً اگه Team IDت 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 هم استفاده کنی.

۲. تنظیمات اپ تو Xcode

  • تو Xcode، به پروژه‌ت برو و تو Target اپت، بخش Signing & Capabilities رو باز کن.
  • روی + Capability کلیک کن و Associated Domains رو اضافه کن.
  • دامین‌هایی که می‌خوای پشتیبانی کنی رو با پیشوند applinks: اضافه کن، مثلاً:applinks:example.com
    applinks:www.example.com
  • اگه چندتا ساب‌دامین داری، برای هر کدوم یه ورودی جدا بذار.

۳. هندل کردن Universal Link تو اپ

برای اینکه اپت بتونه لینک‌ها رو بگیره و به جای درست هدایت کنه، باید کد بنویسی. اگه از 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(&quot/product&quot) { let productId = url.lastPathComponent // برو به صفحه محصول با productId print(&quotباز کردن محصول با آیدی: \(productId)&quot) } else if url.path.hasPrefix(&quot/profile&quot) { // برو به صفحه پروفایل print(&quotباز کردن پروفایل&quot) } } }

اگه از SwiftUI استفاده می‌کنی، می‌تونی از modifier .onOpenURL استفاده کنی:

import SwiftUI @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() .onOpenURL { url in if url.path.hasPrefix(&quot/product&quot) { let productId = url.lastPathComponent print(&quotباز کردن محصول با آیدی: \(productId)&quot) } } } } }

۴. تست Universal Link

برای تست، این کارها رو انجام بده:

  • اپت رو روی یه دستگاه واقعی یا شبیه‌ساز نصب کن.
  • یه لینک Universal Link (مثل https://example.com/product/123) تو یه اپ مثل Messages یا Notes بفرست و روش کلیک کن.
  • اگه اپ نصب باشه، باید مستقیم باز بشه. اگه نه، باید بره به وب‌سایت.
  • برای تست راحت‌تر، می‌تونی از ابزار RocketSim استفاده کنی که لینک‌ها رو کنار شبیه‌ساز نشون می‌ده.
  • اگه مشکلی پیش اومد، از دیباگر اپل استفاده کن.

مشکلات رایج و راه‌حل‌ها

Universal Link یه کم حساسه و ممکنه یه جا گیر کنی. چندتا مشکل رایج و راه‌حلشون:

  • فایل AASA درست لود نمی‌شه:چک کن فایل تو مسیر درست (/.well-known/apple-app-site-association) باشه و HTTPS بدون ریدایرکت کار کنه.
    مطمئن شو سرور Content-Type رو application/json تنظیم کرده.
  • لینک تو اپ باز نمی‌شه:چک کن Associated Domains تو Xcode درست تنظیم شده باشه.
    مطمئن شو Team ID و Bundle ID تو فایل AASA درستن.
  • لینک تو اپ‌های خاص (مثل فیسبوک) کار نمی‌کنه:بعضی اپ‌ها مثل فیسبوک یا توییتر لینک‌ها رو تو WebView داخلی باز می‌کنن و Universal Link رو پشتیبانی نمی‌کنن. برای این موارد باید از روش‌های جایگزین مثل Branch یا Firebase Dynamic Links استفاده کنی.
  • کاربر قبلاً انتخاب کرده لینک تو مرورگر باز بشه:کاربر می‌تونه با کلیک روی دکمه کوچیک گوشه صفحه (Override Link) انتخاب کنه که لینک تو مرورگر باز بشه. برای برگردوندن به اپ، باید اپ رو باز کنه و دوباره لینک رو تست کنه.
آموزش برنامه نویسیطراحی اپلیکیشن
۲
۰
Sedali
Sedali
یه پسری که کل عمرش دنبال این بود که یه Div رو center کنه:)
شاید از این پست‌ها خوشتان بیاید