Navigation Component və deep link-lər
Navigation Component fragment tranzaksiyalarının əl ilə idarəsini əvəz edir:
- Nav graph — ekranlar (destination) və keçidlər (action) bir XML/Kotlin qrafında
- NavController —
navigate(action),popBackStack()— back stack-i o idarə edir - Safe Args — arqumentlər üçün type-safe generasiya olunmuş
Directionsclass-ları: Bundle açarlarının string xətaları compile vaxtı tutulur
Deep link-lər — URL-dən birbaşa ekrana keçid:
- Explicit deep link — PendingIntent ilə (notification-dan)
- Implicit deep link — nav graph-da
<deepLink app:uri="bank://transfer/{id}"/>+ manifest-dənav-graphelementi; sistem URI-ni destination-a map edir və synthetic back stack qurur - App Links — https URL-lərin verified sahibliyi (
assetlinks.json): link tətbiqdə açılır, chooser çıxmır
Bank tətbiqində deep link-lər giriş nöqtəsi kimi risklidir: hədəf ekran auth tələb edirsə, link auth-dan keçməli, birbaşa content-ə tullanmamalıdır.
// nav_graph.xml-də:
// <fragment android:id="@+id/transactionDetail" ...>
// <argument android:name="txId" app:argType="string"/>
// <deepLink app:uri="bank://tx/{txId}"/>
// </fragment>
// Göndərən tərəf — string açar yox, generasiya olunmuş Directions:
findNavController().navigate(
FeedFragmentDirections.actionFeedToTransactionDetail(txId = tx.id)
)
// Qəbul edən tərəf:
private val args: TransactionDetailFragmentArgs by navArgs()
// args.txId — tipli, null-safeSafe Args ilə type-safe keçid
Auth-qapılı deep link pattern-i: link gələndə istifadəçi login deyilsə, hədəf route yadda saxlanılır → login ekranına yönləndirilir → uğurlu auth-dan sonra saxlanmış route-a davam. Compose Navigation-da da eyni prinsip. Əlavə qayda: deep link parametrlərinə etibar etmə — tranzaksiya id-si gəlirsə, onun bu istifadəçiyə aid olduğunu server yoxlamalıdır (IDOR-un mobil təzahürü).
🛠 Tapşırıq
Navigation Component ilə 3 ekranlı qraf qur və Safe Args ilə arqument ötür.
- Bir destination-a deep link əlavə et (
app://demo/tx/{id}) vəadb shell am start -a android.intent.action.VIEW -d "app://demo/tx/42"ilə aç. - Geri düyməsinə bas — synthetic back stack-in necə işlədiyini gör.
- Sonra "login tələb olunur" qapısı əlavə et: hədəf route-u saxla, login-dən sonra davam et.
Bitdi sayılır: deep link auth-ı keçə bilmirsə və geri düyməsi məntiqli davranırsa.
📚 Mənbələr və sənədlər
- Navigation Componentrəsmideveloper.android.com
- Deep link-lər üçün navigasiyarəsmideveloper.android.com
- Android App Linksrəsmideveloper.android.com