Sparround

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
  • NavControllernavigate(action), popBackStack() — back stack-i o idarə edir
  • Safe Args — arqumentlər üçün type-safe generasiya olunmuş Directions class-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-graph elementi; 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.

kotlin
// 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-safe

Safe 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