از نسخه ۱.۲.۰، «پیمایش ۳» از پیوند عمیق به
مقصدها در برنامهتان بااستفاده از کلاسهای DeepLinkRequest و
DeepLinkMatcher پشتیبانی میکند.
برای پشتیبانی از پیوندهای عمیق در برنامهتان، مراحل زیر را تکمیل کنید:
- در
AndroidManifest.xmlخود فیلترهای هدف را تعریف کنید تا مشخص کنید برنامهتان میتواند کدام نشانیهای وب را مدیریت کند. DeepLinkMatcherنمونه ایجاد کنید تا درخواستهای ورودی را به کلیدهای پیمایش خود نگاشت کنید.- درخواستهای ورودی را در
onCreateیاonNewIntentروش فعالیتتان مطابقت دهید و پشته برگشت را براساس آن بهروز کنید.
ایجاد DeepLinkRequest
DeepLinkRequest نشاندهنده پیوند عمیق ورودی است. این عنصر حاوی
DeepLinkUri و RequestExtras اختیاری با اطلاعات
اضافی، مانند کنش هدف یا نوع MIME است.
// Create a request with a String URI val request = DeepLinkRequest(uri = "https://www.example.com/home") // Create a request from a DeepLinkUri val deepLinkUri = DeepLinkUri("https://www.example.com/home") val requestFromUri = DeepLinkRequest(uri = deepLinkUri) // Create a request with a URI and action val requestWithAction = DeepLinkRequest( uri = "https://www.example.com/home", extras = DeepLinkRequest.actionExtra("android.intent.action.VIEW") ) // Create a request with URI, action and mimeType val requestWithMimeType = DeepLinkRequest( uri = "https://www.example.com/image", extras = requestExtras { put(DeepLinkRequest.ActionExtrasKey, "android.intent.action.VIEW") put(DeepLinkRequest.Companion.MimeTypeExtrasKey, "image/png") } )
ارائه DeepLinkRequest هدیه
برای ذخیره کردن اطلاعات تکمیلی مربوط به پیوند عمیق، از کلاس
RequestExtras استفاده کنید. برای اینکه تعریف و نمونهسازی کردن موارد اضافی ازنظر نوع ایمن باشد،
کتابخانه رابط RequestExtrasKey و
requestExtras DSL را ارائه میدهد.
علاوهبراین، کتابخانه دو کلید اضافی و یاریرسانهای مرتبط را ارائه میدهد:
MimeTypeExtrasKey: برای ذخیره کردن نوع MIMEStringاستفاده میشود.ActionExtrasKey(فقط Android): برای ذخیره کردن کنشIntentStringاستفاده میشود.
val extras: RequestExtras = requestExtras { put(DeepLinkRequest.Companion.MimeTypeExtrasKey, "application/json") put(DeepLinkRequest.ActionExtrasKey, Intent.ACTION_VIEW) } // Access typed values using the get operator val mimeType: String? = extras[DeepLinkRequest.Companion.MimeTypeExtrasKey] val action: String? = extras[DeepLinkRequest.ActionExtrasKey] // Create extras using helper functions and combine them val mimeTypeExtras: RequestExtras = DeepLinkRequest.mimeTypeExtra("application/json") val combinedExtras: RequestExtras = extras + DeepLinkRequest.actionExtra(Intent.ACTION_VIEW)
برای تعریف کردن افزونههای سفارشی خودتان، RequestExtrasKey
واسط را با نوع عمومی پیادهسازی کنید:
// Define a custom typed key: object CampaignIdExtrasKey : RequestExtrasKey<String> val customExtras: RequestExtras = requestExtras { put(CampaignIdExtrasKey, "123") } val campaignId: String? = customExtras[CampaignIdExtrasKey]
همچنین میتوانید از emptyRequestExtras() برای ساختن نمونه خالی استفاده کنید، یا
بااستفاده از عملگرهای + (plus) و - (minus) موارد اضافی را ترکیب کنید.
ایجاد DeepLinkRequest از Intent
در Android، میتوانید DeepLinkRequest را مستقیماً از Intent ایجاد کنید. وقتی
به این روش ساخته میشود، DeepLinkRequest به این صورت ساخته میشود:
-
uriاز فیلدdataهدف کپی شده است. - اگر null نباشد، نوع MIME و کنش اضافهها از فیلدهای هدف مربوطه تنظیم میشوند.
- همه
intent.extrasبا مقادیر غیرتهی بهعنوانSavedStateدرDeepLinkRequest.IntentExtrasKeyذخیره میشوند. - هرگونه افزودنی اضافی که بااستفاده از پارامتر
extrasارائه میشود اضافه میشود.
object CampaignIdExtrasKey : RequestExtrasKey<String> val intent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse("https://www.example.com/item/42") type = "application/json" putExtra("user_id", "123") } val request = DeepLinkRequest( intent = intent, extras = requestExtras { put(CampaignIdExtrasKey, "spring_promo") } ) // The resulting DeepLinkRequest contains: val uri = request.uri // "https://www.example.com/item/42" val action = request.extras[DeepLinkRequest.ActionExtrasKey] // "android.intent.action.VIEW" val mimeType = request.extras[DeepLinkRequest.Companion.MimeTypeExtrasKey] // "application/json" val intentExtras: SavedState? = request.extras[DeepLinkRequest.IntentExtrasKey] val userId: String? = intentExtras?.read { getStringOrNull("user_id") } // "123" val campaignId: String? = request.extras[CampaignIdExtrasKey] // "spring_promo"
ایجاد DeepLinkMatcher نمونه
DeepLinkMatcher نمونههای ورودی DeepLinkRequest را به
کلیدهای پیمایش که میتوانند به پشته برگشت برنامه شما اضافه شوند نگاشت میکند. «پیمایش ۳» سه مطابقتدهنده داخلی ارائه میدهد: UriDeepLinkMatcher برای مطابقت URI مبتنی بر الگو، StaticKeyDeepLinkMatcher برای پیوندهای پایه، و BackStackMatcher برای ساختن پشتههای برگشت مصنوعی. این کتابخانه همچنین از تطبیقدهندههای سفارشی برای موارد استفادهای که توسط تطبیقدهندههای داخلی پوشش داده نمیشوند پشتیبانی میکند.
برای اطلاعات بیشتر، ایجاد DeepLinkMatchers را ببینید.
افزودن فیلترهای هدف
برای فعال کردن پیوند عمیق برای شروع فعالیتتان، باید عناصر تطبیق
<intent-filter> را در AndroidManifest.xml برنامه خود تعریف کنید. برای اطلاعات بیشتر، افزودن فیلترهای هدف برای پیوندهای ورودی را ببینید.
مطابقت دادن درخواست ورودی
پساز اینکه نمونههای DeepLinkMatcher خود را ایجاد کردید، میتوانید
درخواستهای ورودی را در فعالیتتان مطابقت دهید.
برای مطابقت دادن درخواست ورودی، مراحل زیر را تکمیل کنید:
- نمونههای
DeepLinkMatcherخود را نمونهسازی کنید. - همه نمونههای
DeepLinkMatcherرا، چه بهصورت صریح و چه بااستفاده از چند اتصال، گردآوری کنید. - ایجاد
DeepLinkRequestازIntentورودی. - درخواست را با همه مطابقتدهندهها مطابقت دهید و بهترین مطابقت را پیدا کنید.
- پشته برگشت را از نتیجه مطابقت ایجاد کنید.
// 1. Instantiate your DeepLinkMatcher instances. val homeMatcher = StaticKeyDeepLinkMatcher(HomeKey, listOf(DeepLinkMatcher.actionFilter(Intent.ACTION_VIEW))) val userProfileMatcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/users/{id}"), serializer<UserProfileKey>() ).withBackStack { matchResult -> listOf(HomeKey, matchResult.key) } val telMatcher = TelDeepLinkMatcher() // 2. Collate all of your DeepLinkMatcher instances. // Note: Collating matchers with different generic types requires wildcards, // erasing the specific generic types. val deepLinkMatchers: List<DeepLinkMatcher<*, *>> = listOf( homeMatcher, userProfileMatcher, telMatcher ) class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... // 3. Create a DeepLinkRequest from the incoming Intent val request = DeepLinkRequest(intent = intent) // 4. Match the request against all matchers and find the best match. // Because DeepLinkMatcher.MatchResult implements Comparable, you can // use maxOrNull() to find the best match. val matchResult = deepLinkMatchers .mapNotNull { it.match(request) } // List<DeepLinkMatcher.MatchResult<*>> .maxOrNull() // DeepLinkMatcher.MatchResult<*>? // 5. Create the back stack from the match result (or fall back to a default). val backStack: List<NavKey> = when (matchResult) { // If no match is found, use the default back stack (e.g., HomeKey) null -> listOf(HomeKey) // If a BackStackMatchResult is found, use the back stack from the result is BackStackMatchResult<*, *> -> { // Because star-projected matchers erase the key type, cast the back stack to List<NavKey>. @Suppress("UNCHECKED_CAST") matchResult.backStack as List<NavKey> } // Otherwise, use the key from the match result to make a single-item back stack else -> listOf(matchResult.key as NavKey) } } }