URL Scheme یک پروتکل URI سفارشی است که برنامه موبایل در سیستم عامل برای باز شدن از طریق لینکهایی به شکل myapp://path ثبت میکند. طبق RFC 3986، طرح URI نحو و معناشناسی تمام اجزای بعدی آدرس را تعریف میکند. هنگام کلیک روی چنین لینکی، سیستم برنامه ثبتشده را با شناسه یکتا شناسایی کرده و آن را با پارامترهای استخراجشده از لینک راهاندازی میکند. Deep link مبتنی بر URL Scheme با وجود ظهور جایگزینهای مدرنتر، همچنان مکانیزم اصلی ناوبری بین برنامهها در پلتفرمهای موبایل باقی مانده است.
نکات اصلی
URL Scheme — یک شناسه پروتکل یکتا است که برنامه در سیستم عامل برای دریافت فراخوانیها از طریق لینکهای سفارشی ثبت میکند. وقتی کاربر روی لینکی مانند myapp://profile/123 کلیک میکند، سیستم برنامهای را که طرح myapp را ثبت کرده شناسایی کرده و کنترل را با URI کامل به آن منتقل میکند. این مکانیزم به برنامهها اجازه میدهد بدون زیرساخت سرور داده تبادل کرده و یکدیگر را باز کنند.
مفهوم URL Scheme مستقیماً از استانداردهای وب RFC 3986 گرفته شده است، جایی که طرح URI اولین مؤلفه هر شناسه منبع جهانی است. در توسعه موبایل، این ایده برای ارتباطات بین برنامهها تطبیق داده شده است، جایی که به جای سرور HTTP، خود برنامه پردازشگر لینک عمل میکند.
بسیاری از برنامههای محبوب URL Schemeهای خود را برای یکپارچهسازی با سرویسهای شخص ثالث ثبت میکنند. برای مثال، Spotify از طرح spotify://، Telegram از tg:// و Instagram از instagram:// استفاده میکند. توسعهدهندگان همچنین اغلب طرحی به شکل appname:// برای ناوبری داخلی و تست صفحهها ایجاد میکنند.
URL Schemeها هنوز هم به طور گسترده در اعلانهای فشاری، کمپینهای ایمیلی و کدهای QR استفاده میشوند، جایی که انتقال فوری به بخش خاصی از برنامه مورد نیاز است. با این حال، از iOS 9 و Android 6 به بعد، مکانیزمهای جایگزینی ظاهر شدهاند که به تدریج طرحهای خام را تکمیل و جایگزین میکنند.
ساختار URI سفارشی تابع مشخصات کلی RFC 3986 است و از چندین مؤلفه تشکیل شده است. طرح ابتدا مشخص میشود و با دونقطه از بقیه آدرس جدا میگردد. پس از طرح میتوانند میزبان، پورت، مسیر، پارامترهای query و بخش (fragment) قرار گیرند که هرکدام اختیاری هستند.
نحو کامل به صورت scheme://host/path?key=value#fragment است. طرح تنها عنصر اجباری است و بقیه بر اساس نیازهای پیادهسازی خاص تعیین میشوند. اسلش دوتایی بعد از طرح از نظر تاریخی از HTTP گرفته شده و طبق مشخصات به شدت اجباری نیست، اما به عنوان یک قرارداد رایج استفاده میشود.
برای نمایش بصری ساختار URI از جدول مؤلفهها استفاده میشود. هر عنصر هدف و سطح الزام خاص خود را دارد.
| مؤلفه | مثال | الزام |
|---|---|---|
| Scheme | myapp | بله |
| Host | profile | خیر |
| Path | /user/42 | خیر |
| Query | ?id=42&tab=main | خیر |
| Fragment | #section2 | خیر |
توسعهدهندگان میتوانند آزادانه ساختار URI را انتخاب کنند که انعطافپذیری ایجاد میکند اما مشکلات سازگاری بین نسخههای مختلف برنامه به وجود میآورد. توصیه میشود فرمت URL Scheme به عنوان بخشی از API عمومی برنامه مستند شده و در هنگام تغییر نسخهبندی شود.
iOS نیاز به ثبت صریح هر URL Scheme در فایل Info.plist پروژه دارد. توسعهدهنده آرایه CFBundleURLTypes را اضافه میکند که هر عنصر آن شامل یک شناسه (CFBundleURLName) و لیست طرحهای پشتیبانیشده (CFBundleURLSchemes) است. پس از ثبت، سیستم به طور خودکار تمام فراخوانیهای ورودی به طرحهای ثبتشده را به برنامه هدایت میکند.
پردازش URL Scheme ورودی در نماینده برنامه از طریق متد application(_:open:options:) انجام میشود. این متد یک شی URL دریافت میکند که مسیر و پارامترهای query برای تصمیمگیری در مورد ناوبری از آن استخراج میشود. پردازش باید یک مقدار Bool برگرداند که موفقیت عملیات را نشان میدهد.
در زیر نمونهای از پیادهسازی پردازشگر URL Scheme به زبان Swift آورده شده است. کد استخراج میزبان و پارامترهای query از URI ورودی را با استفاده از URLComponents نشان میدهد.
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any]
) -> Bool {
let host = url.host
let params = URLComponents(
url: url,
resolvingAgainstBaseURL: false
)?.queryItems
if host == "profile" {
navigateToProfile(params)
}
return true
}
این متد از URLComponents برای تجزیه امن پارامترهای query استفاده میکند. این رویکرد نسبت به تجزیه دستی رشته ترجیح داده میشود، زیرا به طور خودکار کدگذاری درصدی و رمزگشایی کاراکترهای خاص در مقادیر پارامترها را مدیریت میکند.
Android از سیستم Intent Filter برای مسیریابی deep link بر اساس URL Scheme استفاده میکند. توسعهدهنده فیلتر را در AndroidManifest.xml داخل تگ Activity که باید لینک را پردازش کند اعلام میکند. فیلتر شامل action VIEW، دستههای BROWSABLE و DEFAULT و همچنین تگ data با تعیین طرح، میزبان و pathPrefix است.
وقتی کاربر روی لینکی با طرح سفارشی کلیک میکند، سیستم Intent Filter همه برنامههای نصبشده را بررسی میکند. اگر چند برنامه مناسب یافت شود، یک گفتگوی انتخاب به کاربر نشان داده میشود. دسته BROWSABLE امکان پردازش لینک از مرورگر را فراهم میکند.
نمونه اعلام Intent Filter در AndroidManifest.xml برای پردازش طرح myapp در Activity. ترکیب action و category برای مسیریابی صحیح deep link الزامی است.
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile"
android:pathPrefix="/user" />
</intent-filter>
</activity>
پس از تنظیم فیلتر، در Activity باید intent.getData() برای دریافت URI فراخوانی شود. بررسی intent و دادهها از نظر null مهم است، زیرا Activity ممکن است بدون deep link ورودی، مثلاً هنگام راهاندازی استاندارد از لانچر، شروع شود.
پارامترهای query در URL Scheme بعد از علامت سؤال در قالب کلید=مقدار و با جداکننده ampersand منتقل میشوند. این فرمت با درخواستهای HTTP یکسان است و به راحتی توسط ابزارهای استاندارد پلتفرم پردازش میشود. پارامترها باید با استفاده از کدگذاری درصدی برای همه کاراکترهایی که در مجموعه مجاز URI نیستند کدگذاری شوند.
مثال یک لینک کامل با پارامترها: myapp://profile?userId=42&source=email&ref=abc123. پس از استخراج URL، برنامه به ترتیب همه query-items را تجزیه کرده و بر اساس مقادیر آنها در مورد ناوبری به صفحه هدف تصمیم میگیرد.
هنگام انتقال دادههای ترکیبی، مهم است که محدودیت طول URI را در نظر بگیرید. در iOS، حداکثر طول URL Scheme به 2 KB محدود شده است و پس از آن سیستم لینک را قطع میکند. در Android، حد حدود 8 KB است اما مقدار دقیق به نسخه سیستم عامل و تولیدکننده دستگاه بستگی دارد. برای حجم زیاد داده، توصیه میشود فقط شناسه جلسه را از طریق URL Scheme منتقل کرده و بقیه دادهها را از سرور بارگذاری کنید.
عیب اصلی URL Scheme — عدم امکان پردازش لینک در صورت نصب نبودن برنامه روی دستگاه است. مرورگر خطا نشان میدهد و کاربر بافت انتقال را از دست میدهد. برای حل این مشکل، اپل Universal Links را در iOS 9 و گوگل App Links را در Android 6 معرفی کرد. هر دو مکانیزم از طریق دامنه وب متصل به برنامه ثبت میشوند.
Universal Links و App Links مانند لینکهای معمولی HTTPS کار میکنند، اما در صورت نصب بودن برنامه، آن را بدون گفتگوی انتخاب باز میکنند. اگر برنامه نصب نباشد، لینک یک صفحه وب در همان دامنه را باز میکند و تجربه کاربری را حفظ میکند. این آنها را به جایگزین ترجیحی برای محیط تولید تبدیل میکند.
برای URL Scheme در iOS و Android مکانیزم fallback داخلی وجود ندارد. توسعهدهندگان از راهحلهای میانی سرور استفاده میکنند: لینک به صفحه وبی منتهی میشود که نصب برنامه را از طریق JavaScript بررسی کرده و یا به طرح یا به فروشگاه برنامه هدایت میکند. Firebase Dynamic Links و Branch.io راهحلهای آماده این مشکل را با پشتیبانی از deferred deep link ارائه میدهند که به طور خودکار وضعیت نصب را تعیین کرده و کاربر را بدون نیاز به توسعه خط لوله سرور شخصی هدایت میکنند.
پیچیدگی اضافی هنگام استفاده از URL Scheme در iOS 15+ و Android 12+ ایجاد میشود، جایی که قوانین حریم خصوصی سختگیرانهتر شده است. Safari تلاش برای باز کردن طرح ثبتنشده بدون تأیید قبلی را مسدود میکند و Android 12 دید برنامههای نصبشده را از طریق PackageManager محدود میکند. این تغییرات استفاده از URL Scheme برای تعامل بین برنامهها را نسبت به نسخههای قبلی پلتفرمها کمتر قابل اعتماد میکند.
سوالات متداول
URL Scheme از پروتکل سفارشی بدون رمزنگاری استفاده میکند، در حالی که Universal Links از طریق HTTPS با تأیید دامنه کار میکنند. Universal Links گفتگوی انتخاب برنامه را فراخوانی نمیکنند و در صورت نبود برنامه روی دستگاه به درستی پردازش میشوند.
بله، اما همه کاراکترهای غیر ASCII باید از طریق percent-encoding مطابق RFC 3986 کدگذاری شوند. توصیه میشود برای اطمینان از سازگاری با نسخههای قدیمی سیستمعامل و مرورگرها از سیریلیک در URL Scheme خودداری شود.
هیچ محدودیتی برای تعداد طرحها چه در iOS و چه در Android وجود ندارد. در عمل، برنامهها از یک تا پنج طرح استفاده میکنند. برای مثال، Telegram طرحهای tg://، t.me/، telegram:// و telegram.me:// را ثبت میکند.
در iOS از متد canOpenURL(_:) استفاده میشود که در صورت وجود طرح ثبتشده true برمیگرداند. در Android بررسی از طریق PackageManager.queryIntentActivities() انجام میشود. هر دو پلتفرم نیاز به تعیین قبلی طرح در پیکربندی دارند.
خیر، URL Scheme دادهها را رمزنگاری نمیکند. هر برنامهای که همان طرح را ثبت کرده باشد میتواند لینک را رهگیری کند. برای امنیت از Universal Links با HTTPS یا رمزنگاری داده در سطح پروتکل استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید