Lewati ke konten
Chandler Nguyen
AI10 menit baca

AI

Native Itu Bukan Sekadar Pelapis: Membangun Ulang App iOS DIALØGUE

Saya merilis app iOS DIALØGUE sebagai port dari produk web, lalu membangunnya ulang secara native — tiga tab, audio di layar kunci, transkrip yang tersinkron, offline yang tahan banting, dan Siri — karena app web yang dikecilkan ke ukuran ponsel tetap saja app web.

Beberapa bulan lalu saya merilis app iOS DIALØGUE sebagai port dari produk web. Lalu saya membangun ulang hampir semuanya sebagai app native.

Sekarang sudah tayang di App Store — kalau penasaran, silakan coba-coba sendiri. Sisa tulisan ini soal apa yang berubah, dan kenapa.

Bedanya terdengar seperti soal istilah belaka sampai Anda memegang kedua versi itu di tangan. Yang pertama adalah app web yang dikecilkan supaya muat di ponsel: tab yang sama, wizard pembuatan yang sama, dashboard yang sama. Bisa di-compile, bisa jalan, lolos review Apple. Dan rasanya seperti website yang memakai kostum app.

App web yang dikecilkan ke ukuran ponsel tetap saja app web. Native itu bukan lapisan cat di atas layout web Anda — ini kontrak yang berbeda dengan perangkat. Kontrak itulah yang dulu saya lewati, dan membangun ulang untuk menghormatinya mengubah tab-nya, audionya, permukaan mendengarkannya, perilaku offline-nya, dan cara app itu dibuka. Inilah apa artinya itu sebenarnya, layar per layar.

Port itu cuma dashboard

Versi pertama berasumsi bahwa tugas app adalah memajang generatornya. DIALØGUE membuat podcast dengan AI, jadi alurnya begini: taruh setiap permukaan web di layar, lalu selesai.

Yang Anda dapat dari situ adalah dashboard. Lima tab, wizard banyak langkah, panel untuk segala hal. Tidak ada yang membuka app podcast untuk mengoperasikan dashboard. Orang membukanya untuk mengubah ide jadi audio, untuk mendengarkan sesuatu yang mereka buat, atau untuk memulai program yang sudah pernah mereka jalankan. Antarmuka hasil port itu melindungi layout app web. Ia tidak melindungi tiga tugas itu.

Jadi proses bangun ulang dimulai dari hal pertama yang Anda lihat.

Tiga tab, karena ponsel menghukum tab

App lama membuka dengan lima tab: Library, Studio, Create, Credits, Profile. Begitulah hasilnya kalau Anda mem-port app web — setiap permukaan web layak dapat satu tab.

App hasil bangun ulang punya tiga: Listen, Create, You.

Dua tab tidak selamat. Credits berhenti jadi tujuan — tidak ada yang membuka app cuma untuk menatap saldo. Ia pindah ke dalam "You", dan satu-satunya momen yang benar-benar penting, yaitu kehabisan kredit tepat saat Anda mau generate, sekarang memunculkan sheet pembelian persis di situ. Studio berhenti jadi sebuah tempat. Ia menjadi Series — sebuah setup tersimpan (host, tone, format, bahasa, pola sumber) yang tinggal di dalam Create dan muncul di Listen sebagai sebuah koleksi, bukan tab yang berpura-pura jadi ruang kontrol. Library dan Profile menjadi "Listen" dan "You" yang lebih sederhana.

Di desktop, satu tab tambahan itu gratis. Di ponsel, setiap tab adalah pajak atas perhatian. Proses bangun ulang ini melunasi sebagian pajak itu.

Layar Series DIALØGUE di iOS untuk menyimpan setup podcast yang bisa dipakai ulang
Series — sebuah setup tersimpan di dalam Create, bukan ruang kontrol dengan tab sendiri.

Audio dengan cara yang diharapkan iOS

Di sinilah "native itu sebuah kontrak" berhenti jadi abstrak.

App hasil port itu bukannya buta soal audio. Ia sudah muncul di layar kunci dengan play, pause, dan skip, berhenti sejenak saat ada telepon, dan berhenti saat Anda mencabut headphone. Itu semua hal dasar, dan memang sudah ada.

Yang tidak bisa ia lakukan adalah bersikap seperti app audio sungguhan begitu layar terkunci. Anda tidak bisa menyeret playhead dari layar kunci. Tidak ada cover art di sana — cuma teks. Tidak ada tombol AirPlay, tidak ada sleep timer, dan skip-nya terpaku di lima belas detik, suka atau tidak suka.

Proses bangun ulang menutup celah itu bersama platform, bukan dengan mengakalinya. Layar kunci sekarang membawa artwork episode yang dinamis dan scrubber yang bisa Anda seret ke titik mana pun. Ada AirPlay, sleep timer yang memudarkan volume pelan-pelan alih-alih memotongnya mendadak, dan interval skip yang bisa Anda atur dari sepuluh sampai enam puluh detik — yang lalu juga menggerakkan tombol di layar kunci, karena kontrol sistem seharusnya selaras dengan kontrol app. Sesi audionya mendeklarasikan dirinya sebagai spoken audio, jadi OS memperlakukannya seperti ucapan, bukan musik.

Tidak ada satu pun dari ini yang glamor. Justru itu intinya. Di ponsel, audio yang mengabaikan layar kunci dan AirPlay itu bukan "minimalis". Ia rusak persis di momen-momen ketika orang benar-benar mendengarkan — sambil jalan kaki, menyetir, dengan ponsel di saku.

Transkrip yang hanya bisa dibangun oleh podcast AI

Ini bagian yang benar-benar milik kami, bukan sekadar kebersihan iOS yang bagus.

Saat sebuah episode diputar, app menampilkan transkrip yang tersinkron: baris yang sedang berjalan ter-highlight, tampilannya auto-scroll supaya tetap di tengah, dan Anda bisa mengetuk baris mana pun untuk langsung melompat ke momen itu. App podcast biasa tidak benar-benar bisa melakukan ini, karena ia tidak tahu apa yang diucapkan kapan. DIALØGUE tahu — ia yang men-generate skripnya, jadi ia sudah tahu struktur episode itu.

Detail engineering yang jujur adalah: sebuah baris baru bisa diketuk kalau audionya punya timing yang persis per segmen. Ketika timing-nya cuma perkiraan, barisnya tetap muncul, hanya saja tidak bisa di-seek, dan app tidak berpura-pura sebaliknya. Timing per segmen yang sama itu menggambar tanda bab langsung di scrubber, jadi Anda bisa menyusuri sebuah episode seperti audio tapi dengan peta tentang apa yang dibuat sistem. Transkripnya bahkan menunjukkan host mana yang mengucapkan baris mana, karena skripnya ditulis sebagai dialog dua host.

Inilah bedanya antara menempelkan transkrip ke sebuah player dan memperlakukan skrip hasil generate sebagai sumber kebenaran untuk seluruh pengalaman mendengarkan.

Dua hal membuat itu berjalan, dan keduanya tidak muncul di layar. Backend menstempel setiap segmen dengan waktu mulai dan selesainya serta menandai apakah timing-nya persis atau cuma perkiraan — jadi app bisa membiarkan Anda mengetuk baris yang timing-nya persis dan diam-diam menolak berpura-pura pada baris yang cuma perkiraan. Dan posisi pemutaran Anda disimpan di server, bukan cuma di perangkat, jadi "lanjut dari tempat terakhir" tetap berlaku bahkan saat Anda memulai episode di web dan menyelesaikannya di ponsel.

Layar transkrip tersinkron DIALØGUE di iOS dengan kartu transkrip yang bisa diketuk untuk seek
Transkrip tersinkron — ketuk satu baris untuk seek. Mungkin hanya karena app yang men-generate skripnya dan tahu timing-nya.

Offline yang bertahan di perjalanan beneran

App sudah bisa men-download episode sejak awal. Itu bukan hal baru, dan saya mau jujur soal itu. Yang ditambahkan proses bangun ulang adalah resiliensi — bedanya antara fitur download dan offline yang bisa Anda percaya.

Download yang terputus sekarang melanjutkan dari titik berhentinya alih-alih mulai dari nol, karena app menyimpan resume data dari sistem per episode dan memulai ulang dari situ. Ada opsi WiFi-only yang sungguh-sungguh melarang seluler, jadi download yang di-antre menunggu WiFi alih-alih diam-diam menghabiskan kuota Anda. Download berjalan paling banyak tiga sekaligus dalam antrean FIFO alih-alih menyerbu jaringan. Ada tampilan penyimpanan untuk melihat dan menghapus apa yang ada di perangkat. Dan fetch sementara yang gagal di koneksi labil dicoba ulang dengan backoff — tiga percobaan, setengah detik yang membesar sampai batas tertentu, tanpa pernah mengulang pembatalan oleh pengguna.

Mencoba ulang itu mudah; mencoba ulang tanpa melawan pengguna yang menekan cancel adalah bagian yang membuat offline terasa kokoh di koneksi MRT yang buruk, alih-alih cuma berputar-putar.

Layar mendengarkan offline DIALØGUE di iOS dengan kontrol episode yang sudah di-download
Offline selalu ada dari dulu. Proses bangun ulang membuatnya resilien — resume, WiFi-only, kontrol penyimpanan, antrean berbatas.

Instan, karena spinner terbaca seperti rusak

Di ponsel, latency itu rasa, bukan angka. Spinner saat cold launch terbaca sebagai "app ini rusak", bahkan ketika tidak ada yang salah.

App hasil port men-download ulang setiap cover image setiap kali cold launch, jadi library terbuka sebagai dinding penuh spinner. Proses bangun ulang menambahkan cache memori-dan-disk bersama untuk cover art — lapisan disk bertahan melewati relaunch, lapisan memori menjaga scrolling tetap mulus, dan layar kunci memakai ulang cache yang sama untuk artwork-nya. Membuka ulang episode dulu harus menunggu satu putaran balik ke jaringan; sekarang segmen dan transkripnya di-cache per episode dan langsung muncul, lalu menyegarkan diri diam-diam di latar. Saya juga mencabut tik pemutaran tiap setengah detik itu dari baris-baris list supaya timer berhenti memaksa seluruh library menggambar ulang.

Ini bukan fitur yang bisa Anda screenshot. Ini jarak antara sebuah app dan sebuah website.

Ia memberi tahu Anda saat episode siap

Men-generate podcast butuh menit, bukan detik — ada riset, kerangka, skrip, lalu audio. App hasil port memaksa Anda menonton progress bar sepanjang waktu. App native tidak.

Dengan izin Anda, ia mengirim push notification begitu episode Anda siap, jadi Anda bisa mengunci ponsel, mengerjakan hal lain, dan kembali saat ia bergetar. Token perangkat disimpan di sisi server, hanya job notifikasi yang bisa membacanya, dan Anda bisa mematikan semua itu di settings. Ini cuma sepotong "pipa" — sebuah tabel, sebuah worker, layanan push milik Apple — tapi ia mengubah bentuk produk yang terasa, dari "tunggu di layar ini" jadi "nanti saya kabari kalau sudah jadi".

Alur bisa dimulai dari luar app

App native tidak hanya tinggal di dalam jendelanya sendiri. Proses bangun ulang menambahkan dukungan Siri dan Shortcuts lewat App Intents, jadi "buatkan podcast", "lanjutkan mendengarkan", dan "buka podcast saya" bisa jadi frasa yang diucapkan, di app Shortcuts, dan di Spotlight — tanpa perlu entitlement khusus. Keputusan tentang apa yang seharusnya dilakukan "lanjutkan" (meneruskan episode saat ini, atau membuka library kalau tidak ada yang sedang dimuat) adalah sebuah fungsi murni kecil yang bisa saya unit-test sendiri, dan itulah jenis hal yang menjaga perilaku Siri agar tidak melenceng.

Ada juga sambutan tiga halaman yang ringkas saat pertama dijalankan — create, voices, listen anywhere — ditampilkan sekali, dan deep link supaya link yang diketuk membuka layar yang benar alih-alih menjatuhkan Anda di tab beranda. Hal-hal kecil. Itulah bedanya antara app yang sekadar duduk di ponsel dan app yang menjadi milik ponsel itu.

Satu catatan soal di mana saya berhenti: belum ada widget di home screen, belum ada Live Activities, dan belum ada CarPlay — masing-masing butuh extension sendiri atau entitlement yang diberikan Apple, dan saya memilih merilis inti pengalaman mendengarkan dulu. "Native" di sini adalah arah, bukan daftar tugas yang sudah selesai.

Pelajaran yang saya bawa dari ini

Kalau Anda sedang mem-port sesuatu ke platform baru, langkah yang menggoda adalah membuatnya jalan di sana lalu bilang selesai. Ia akan jalan. Tapi ia juga akan terasa seperti pinjaman.

Native itu kontrak dengan perangkat: hormati layar kunci, perubahan output audio, kenyataan offline, dan permukaan sistem yang sudah dipakai orang. Sebuah port menghormati layout lama Anda. App native menghormati konvensi platform, bahkan ketika itu berarti menghapus tab dan menulis ulang layar yang sudah Anda rilis.

Saya tidak punya angka instal atau retensi yang dramatis untuk dipamerkan — versi sekarang tayang di App Store, dan itulah keadaan jujurnya. Ujian sebenarnya tidak pernah soal apakah screenshot-nya terlihat native. Tapi soal apakah seseorang membuat sebuah episode, mendengarkannya sambil jalan kaki dengan ponsel terkunci, lalu kembali untuk membuat satu lagi.

Kalau Anda membangun untuk mobile, saya penasaran di mana Anda menarik garisnya: kapan "jalan di ponsel" itu sudah cukup, dan kapan kontrak platform memaksa Anda membangun ulang?

Pertanyaan yang Sering Diajukan

Apa yang berubah dalam bangun ulang app iOS DIALØGUE?

App berpindah dari port produk web ke bangun ulang native. Information architecture-nya turun dari lima tab jadi tiga (Listen, Create, You). Pengalaman mendengarkan dapat transkrip tersinkron yang bisa diketuk untuk seek, penanda bab, scrubbing dan artwork di layar kunci, AirPlay, sleep timer, dan interval skip yang bisa diatur. Download offline jadi resilien, app meng-cache cover art dan segmen untuk rasa instan, Siri/Shortcuts membuat aksi inti bisa dimulai dari luar app, dan push notification memberi tahu saat episode siap.

Kenapa lima tab jadi tiga?

Karena ponsel menghukum setiap tab tambahan. Credits bukan tempat yang ingin dikunjungi siapa pun, jadi ia melebur ke "You" plus sheet pembelian yang muncul saat Anda benar-benar kehabisan kredit. Studio jadi Series — sebuah setup tersimpan di dalam Create alih-alih tab sendiri. Library dan Profile jadi "Listen" dan "You" yang lebih sederhana.

Fitur native iOS apa yang ditambahkan oleh bangun ulang ini?

Scrubbing dan artwork dinamis di layar kunci, AirPlay, sleep timer dengan volume yang memudar, interval skip yang bisa diatur (10–60 detik) yang juga menggerakkan kontrol layar kunci, tanda bab di scrubber, transkrip tersinkron yang bisa diketuk untuk seek, download offline yang resilien (resume, WiFi-only, manajemen penyimpanan, antrean berbatas), cache cover art dan segmen bersama untuk rendering instan, intent Siri/Shortcuts, push notification "episode siap", posisi pemutaran sisi server yang lanjut antara web dan ponsel, deep link, dan onboarding saat pertama dijalankan.

Apakah transkrip tersinkron bekerja untuk semua episode?

Sebuah baris transkrip bisa diketuk untuk seek hanya kalau audionya punya timing persis per segmen. Ketika timing-nya cuma perkiraan, barisnya tetap tampil tapi tidak bisa di-seek, dan app tidak berpura-pura sebaliknya. Transkrip ini mungkin karena DIALØGUE yang men-generate skripnya, jadi ia tahu strukturnya dan siapa mengucapkan apa.

Apa bedanya Studio dan Series?

Studio terkesan ruang kontrol penuh tombol. Series cuma sebuah setup tersimpan — host, tone, format, bahasa, dan pola sumber — yang membuat Anda bisa memulai episode berikutnya tanpa mengonfigurasi ulang semuanya. Ia preset di dalam Create, bukan tab tersendiri.

Bedanya dengan audio overview NotebookLM apa?

NotebookLM benar-benar berguna, dan gratis, untuk mengubah sumber Anda jadi audio overview yang cepat. DIALØGUE berusaha menjadi produk mendengarkan native yang lengkap di atas proses generate: review kerangka dan skrip sebelum ada audio, pemilihan suara, transkrip tersinkron yang bisa diketuk untuk seek, bab, kontrol layar kunci dan AirPlay, download offline, Siri, dan Series untuk program yang dipakai ulang. Bedanya yang jujur lebih sedikit soal "siapa yang men-generate audio lebih bagus" dan lebih banyak soal "apa yang terjadi pada episode setelah ia ada".

Apakah bangun ulang menambahkan mendengarkan offline?

Download offline sudah ada sebelumnya. Proses bangun ulang membuatnya resilien: download yang terputus melanjutkan alih-alih memulai ulang, ada opsi WiFi-only dan tampilan penyimpanan, download berjalan paling banyak tiga sekaligus, dan kegagalan jaringan sementara dicoba ulang dengan backoff tanpa melawan pengguna yang membatalkan.

Sekian dulu dari saya.

Salam, Chandler