Skip to content
··11 menit baca

App Store Bilang Ya

Dua minggu lalu saya nulis "Masih membangun. Masih belum selesai." Hari ini DIALØGUE sudah live di App Store. Inilah tampilan 40% terakhir itu sebenarnya.

Dua minggu lalu saya mengakhiri sebuah blog post dengan: "Masih membangun. Masih belum selesai. Masih mencari tahu apa yang harus dibilang ke putri saya."

Saya berjanji akan menulis lanjutannya ketika app masuk App Store. Atau ketika ditolak. Saya bilang cerita penolakannya mungkin lebih menarik.

DIALØGUE - AI Podcast Studio sekarang sudah live di App Store — app iOS native SwiftUI yang mengubah topik apa pun atau PDF menjadi episode podcast yang diproduksi penuh, dibangun dengan Claude Code oleh seseorang yang sebelumnya tidak pernah menulis Swift. Kamu bisa mendownloadnya sekarang.

Tapi bukan pada percobaan pertama. Saya harus mengakui — saya sudah menduga cerita penolakan mungkin lebih menarik daripada cerita penerimaan. Ternyata saya benar.


Apa yang Terjadi Ketika Apple Menolak Submission Pertama?

Submission pertama saya ditolak. Guideline 2.1 — Performance: App Completeness. In-app purchase-nya rusak.

Pesan review Apple cukup sopan — mereka mencatat bahwa ini submission pertama saya, mengucapkan selamat karena bergabung dengan developer program, dan menjelaskan masalahnya dengan jelas. Produk IAP melempar error ketika reviewer mereka mencoba melakukan pembelian.

Yang bikin heran: alur pembelian berfungsi sempurna di testing saya. Masalahnya ada di sandbox environment Apple, yang berperilaku berbeda dari development maupun production. Konfigurasi StoreKit harus sinkron persis dengan App Store Connect — dan punya saya tidak sinkron. Saya testing dengan file konfigurasi StoreKit lokal, sementara reviewer menghantam sandbox yang sesungguhnya.

Saya memperbaikinya di hari yang sama, resubmit, dan lolos. Lalu tidak lama kemudian saya mengirimkan update bug fix v1.0.1, yang juga langsung lolos.

Total tiga submission. Satu penolakan. Penolakan itu mengajarkan saya lebih banyak tentang proses App Store daripada kedua penerimaan gabungan. Itulah polanya, bukan? Kegagalan selalu lebih mendidik daripada keberhasilan.


Seperti Apa Sebenarnya "40% Terakhir" Itu?

Di post sebelumnya, saya bilang AI membawa kamu 60% perjalanan dan 40% sisanya sepenuhnya pekerjaan manusia. Saya ingin lebih spesifik sekarang, karena saya punya git log untuk membuktikannya.

16 commit. 57 file berubah. 4.886 baris ditambahkan. App tumbuh dari 69 file Swift menjadi 88, dari 7.568 baris menjadi 11.459. Hampir 4.000 baris "polish."

Inilah yang sebenarnya ada dalam 16 commit itu — kurang lebih sesuai urutan kejadiannya:

Test Suite yang Seharusnya Ada Sejak Hari Pertama

Scaffold awal punya nol test. Nol. Claude membangun 69 file production code tanpa satu pun test. Commit sungguhan pertama saya setelah post asli menambahkan 176 unit test dan 19 integration test yang berjalan terhadap instance Supabase lokal.

Menulis test-test itu langsung menemukan bug nyata: kegagalan decode model Show dari kolom database yang tidak ada, AudioPlayer tidak reset di akhir track, race condition library reload, nil UUID guard yang hilang di creation wizard. Setiap satu dari ini pasti crash di production.

Saya pikir ini pola yang layak dinamai: AI menghasilkan kode tanpa infrastruktur test apa pun. Bukan karena tidak bisa menulis test — Claude bagus dalam menulis test kalau kamu minta — tapi karena prompt scaffold awal selalu "bangun app-nya," bukan "bangun app-nya dengan test yang komprehensif." Test-test itu datang dari saya yang memutuskan tidak nyaman mengirimkan tanpa mereka.

DIALØGUE iOS app outline review screen showing 6 podcast segments with Approve and Give Feedback buttons in dark mode
Langkah review outline — tempat kamu menyetujui atau menyempurnakan riset AI sebelum audio dibuat.

Studio: Fitur yang Awalnya Hampir Hanya Placeholder

Fitur "Studio" awal untuk acara berulang hanyalah placeholder. Dua commit kemudian, ia menjadi produk nyata: pembuatan acara dengan template grid, manajemen episode dengan status badge dan action button, alur edit/hapus, konfigurasi jadwal dengan timezone picker, dan voice customization sheet.

Lalu datang Studio Phase 2: redesain detail acara, retry/hapus per episode, pembuatan episode manual dengan pengecekan kredit. Ditambah 8 XCUITest baru untuk memastikan semuanya berfungsi end-to-end.

Inilah maksud saya ketika bilang "AI membangun codebase, bukan produk." Fitur Studio bisa dikompilasi. Ia merender sebuah layar. Tapi kamu tidak bisa benar-benar mengelola acara podcast berulang dengannya.

DIALØGUE iOS app showing 9 podcast format templates including Tech News Analysis, Deep Dive, and Investigative Comedy in a dark-mode grid layout
Sembilan format podcast — dari Tech News Analysis sampai Investigative Comedy.

Audio Player yang Dirancang Ulang

Di post sebelumnya saya menyebutkan sudah menghapus mini-player. Ternyata saya salah — ujung-ujungnya saya membangun mini-player yang lebih baik. Desain akhirnya punya persistent mini-player bar di atas tab bar dengan progress, skip control, dan play/pause. Ketuk dan kamu mendapat expanded "Now Playing" sheet dengan seekable slider, speed selector (0,5x sampai 2x), transport control, dan animasi sound-rings artwork.

Bagian yang rumit adalah state isSeeking — tanpanya, posisi slider dan audio observer saling berkelahi, menciptakan kekacauan yang bergetar-getar. Itu satu baris state yang butuh satu jam untuk didiagnosis.

Saya juga menambahkan offline download dengan UX yang halus: ikon hijau di episode yang sudah didownload di library, completion toast, label "Downloaded" di Now Playing, dan swipe-to-remove-download. DownloadManager punya race condition file sementara di URLSession delegate yang menyebabkan kegagalan diam-diam — perbaikannya adalah synchronous file move di dalam callback. Bukan jenis bug yang muncul di code review.

Security Hardening di Setiap Layer

Yang satu ini cukup membuat saya tersentak. Audit keamanan pada seluruh stack — bukan hanya app iOS — mengungkap kerentanan di berbagai layer: fungsi database yang over-permissioned, edge case autentikasi, celah verifikasi token, dan masalah validasi input di beberapa backend service.

Tidak ada satu pun dari ini di kode Swift iOS. Semuanya ada di backend yang diajak bicara app iOS. Tapi mengirimkan app iOS berarti seluruh stack kamu sekarang ada di saku pengguna. Itu menaikkan taruhan untuk segalanya. Kode yang "berfungsi baik" untuk web app tiba-tiba terasa tidak dapat diterima ketika ia melewati proses review Apple dan masuk ke app native yang orang-orang bawa ke mana-mana.

StoreKit: Pembunuh Submission

Sandbox testing StoreKit adalah alam semestanya sendiri, dan itulah tepatnya yang membuat submission pertama saya ditolak. Sandbox environment berperilaku berbeda dari production. Transaksi kadang tetap "pending" selamanya. File konfigurasi StoreKit Xcode butuh sinkronisasi manual. Saya menghabiskan satu malam penuh mendebug alur pembelian yang berfungsi sempurna dalam kode tapi gagal diam-diam di sandbox — ternyata product ID di App Store Connect punya trailing space. Satu spasi.

Reviewer Apple menabrak sandbox error karena konfigurasi StoreKit saya tidak sinkron dengan App Store Connect. Alur pembelian berfungsi baik di testing lokal saya — tapi reviewer menghantam sandbox yang sesungguhnya, bukan file konfigurasi StoreKit lokal saya. Saya memperbaikinya di hari yang sama, tapi ini contoh sempurna betapa besarnya jarak antara "berfungsi di mesin saya" dan "berfungsi di environment Apple."

Rantai verifikasi pembelian adalah proyeknya sendiri: app iOS mengirimkan representasi JWS (JSON Web Signature) dari transaksi ke server-side function, yang melakukan verifikasi chain kriptografis penuh dari signed receipt Apple. Bukan sekadar decoding — validasi signature yang sesungguhnya. Ini butuh dua commit khusus untuk benar.

Privasi dan Kepatuhan App Store

Privasi dan kepatuhan adalah formulir, keputusan, dan checkbox dengan implikasi hukum — dan tidak ada AI yang bisa mengisinya untuk kamu. Deklarasi App Tracking Transparency, privacy nutrition label, kepatuhan ekspor untuk enkripsi (ya, HTTPS dihitung), hak konten, integrasi Turnstile captcha. Claude Code bisa menulis Swift, tapi tidak bisa memberi tahu kamu apakah praktik pengumpulan data kamu memerlukan label "Data Used to Track You."

MFA Lengkap dan Lokalisasi

Implementasi MFA awal adalah stub yang rusak — empty factor ID, alur verify-only. Saya menulis ulangnya sebagai TOTP lifecycle yang lengkap: enroll, scan QR code (native CoreImage generation), verify, lihat status, disable. Itu MFAView.swift 394 baris yang sebelumnya tidak ada.

Lokalisasi dalam 7 bahasa berarti 253 string UI diterjemahkan ke dalam bahasa Inggris, Spanyol, Prancis, Jepang, Korea, Vietnam, dan Mandarin. Claude melakukan terjemahan, dan hasilnya sebagian besar bagus. Tapi "sebagian besar bagus" dalam bahasa Jepang berarti kamu mungkin punya label tombol yang secara gramatikal benar tapi terdengar seperti ditulis robot. Saya menemukan beberapa di antaranya dengan mengubah bahasa ponsel saya dan benar-benar menggunakan app-nya. Itu jenis testing yang tidak bisa dilakukan AI untuk kamu — setidaknya belum.


Apa yang Bisa Kamu Lakukan dengan App iOS DIALØGUE?

Buat yang belum membaca cerita build aslinya, inilah yang DIALØGUE lakukan:

Kamu memberikan topik — atau upload PDF — dan ia menghasilkan episode podcast yang sudah diriset penuh, ditulis naskahnya, dan disuarakan. Dua host AI bercakap-cakap secara natural tentang topikmu, didukung oleh riset nyata. Tidak perlu mikrofon.

App iOS ini mencakup:

  • Wizard pembuatan 5 langkah — topik, format, kustomisasi, review outline, review naskah
  • 30 suara AI dalam 7 bahasa — Inggris, Spanyol, Prancis, Jepang, Korea, Vietnam, Mandarin
  • 9 format podcast — dari Tech News Analysis sampai Investigative Comedy
  • Pemutaran audio dengan kontrol lock screen — background playback langsung berfungsi
  • Apple Sign-In, Google OAuth, dan email auth
  • In-app purchase — berbasis kredit, tanpa subscription: 4 kredit $4,99, 9 kredit $9,99, 18 kredit $19,99
  • Studio — buat acara berulang yang otomatis menghasilkan episode baru
  • Upload PDF — makalah riset, laporan, buku sebagai sumber materi

Ini app SwiftUI native yang sesungguhnya. Bukan web wrapper. Bukan React Native. Yang awalnya 69 file Swift kini menjadi 88 file dan 11.459 baris kode, didukung oleh 195 test. Saya benar-benar bangga bisa mengirimkannya.

DIALØGUE iOS app library view showing podcast episodes with play buttons, duration, and dark mode UI
Library — episode podcast yang sudah kamu buat, siap diputar.

Seberapa Salah Perkiraan "Fase Polish" Saya?

Saya menulis bahwa app "masih dalam pengembangan, di fase polish akhir." Itu secara teknis benar, tapi saya meremehkan betapa banyaknya "fase polish" yang sebenarnya adalah pekerjaan baru.

Melihat git log sekarang, 16 commit tidak terdengar seperti "polish." Kedengarannya seperti fase kedua pengembangan. Test suite saja — 176 unit test dan 19 integration test — adalah satu proyek tersendiri. Studio berubah dari stub menjadi fitur penuh. Audio player dirancang ulang dua kali. Security hardening menyentuh lebih dari 40 fungsi backend. MFA ditulis ulang dari nol.

Saya juga bilang saya sudah menghapus mini-player. Saya salah soal itu juga — ujung-ujungnya saya membangun yang lebih baik, dengan Now Playing sheet, speed control, dan download indicator. Naluri awal untuk "hapus saja" itu benar — mini-player pertama memang jelek. Tapi konsepnya benar. Tinggal perlu dibangun dengan benar.

Saya pikir pembagian yang jujur, sekarang setelah bisa melihat gambaran penuhnya, adalah: AI membangun fondasi (60%), manusia membangun produk (30%), dan proses submission App Store mengajarkan 10% sisanya.


Apakah DIALØGUE Tersedia di EU?

DIALØGUE tersedia di seluruh dunia, tapi ketersediaan di EU masih sedang diproses Apple. Digital Markets Act EU memerlukan langkah kepatuhan tambahan — pengungkapan pembayaran alternatif, dokumentasi privasi spesifik, detail registrasi bisnis. Saya sudah menyerahkan semuanya, dan Apple sedang meninjaunya. Seharusnya segera tersedia di negara-negara EU.

Kalau kamu di EU dan tidak mau menunggu, web app-nya berfungsi di mana saja dan punya fitur yang sama.


Seberapa Cepat Pengembangan iOS Berbantuan AI?

App iOS DIALØGUE butuh sekitar dua minggu dari commit pertama ke App Store — satu malam AI scaffolding dan dua minggu pekerjaan produk manusia. Saya terus memperbarui tabel ini karena ia terus mengajarkan sesuatu:

ProyekKompleksitasWaktu Membangun
DIALØGUE v1MVP podcast generator~6 bulan
STRAŦUM10 agen AI, 11 framework, multi-tenant75 hari
Redesain situsOverhaul frontend WordPress3 hari
DIALØGUE v2Rebuild app web lengkap14 hari
Migrasi blogWordPress → Next.js, 490 postingan, Sydney RAG4 hari
DIALØGUE iOSApp iOS native, pertama kali menggunakan Swift~2 minggu (scaffold: satu malam)

Jarak dari scaffold ke rilis untuk DIALØGUE iOS sekitar dua minggu. Scaffold itu sendiri satu malam. Rasio itu — satu malam pekerjaan AI, dua minggu pekerjaan manusia — menjelaskan segalanya tentang di mana kita berada dengan pengembangan berbantuan AI saat ini.

Bagian AI terus makin cepat. Bagian manusia kurang lebih tetap sama. Saya menulis itu dua minggu lalu dan masih berlaku.


Skill Apa yang Penting Ketika AI Membangun Kode?

Di post sebelumnya, saya masih mencari saran yang tepat. "Belajarlah menjadi orang yang membuka Simulator" adalah yang terbaik yang saya punya.

Sekarang setelah benar-benar mengirimkan barangnya, saya pikir saya bisa sedikit lebih spesifik.

App ini ada karena tiga hal yang tidak bisa dilakukan AI:

  1. Saya menggunakan produknya. Bukan sekadar mengujinya. Menggunakannya. Membuat podcast. Mendengarkannya di perjalanan. Memperhatikan bahwa layar review outline perlu menampilkan sumber riset karena saya ingin tahu dari mana fakta-fakta itu berasal.

  2. Saya membuat judgment call yang tidak punya jawaban benar. Hapus mini-player atau pertahankan? Seberapa banyak kustomisasi yang terlalu banyak di creation wizard? Apakah fitur Studio seharusnya menjadi tab atau bagian? Ini bukan keputusan teknik. Ini keputusan selera. Dan selera datang dari menggunakan banyak produk — yang bagus dan yang buruk — dan mengembangkan insting untuk apa yang terasa benar.

  3. Saya menavigasi sistem yang dirancang untuk manusia. App Store Connect, deklarasi privasi, kepatuhan ekspor, persyaratan screenshot — tidak ada yang bisa diotomasi. Semuanya butuh membaca, memahami konteks, dan membuat judgment call tentang implikasi hukum dan bisnis. Skill itu — menavigasi sistem manusia yang kompleks — tidak akan hilang.

Jadi mungkin saran yang diperbarui adalah: belajarlah menggunakan sesuatu secara mendalam, kembangkan selera dengan peduli pada kualitas, dan biasakan diri menavigasi sistem yang tidak dirancang untuk sederhana.

Itu lebih konkret dari "belajar berpikir kritis." Saya pikir itu lebih mendekati kebenaran. Saya masih tidak yakin itu cukup.


Bagaimana Cara Download DIALØGUE?

App-nya gratis dengan pembelian kredit dalam aplikasi. Tanpa subscription.

Download di App Store

Tersedia di seluruh dunia — ketersediaan EU sedang diproses Apple dan seharusnya segera live. Web app-nya tersedia di mana saja.


Pertanyaan yang Sering Diajukan

Apakah DIALØGUE tersedia di App Store?

Ya! DIALØGUE - AI Podcast Studio sudah live di App Store per Maret 2026. Gratis didownload dengan pembelian kredit dalam app (4 kredit $4,99, 9 kredit $9,99, 18 kredit $19,99). Tersedia di seluruh dunia — ketersediaan EU sudah disubmit dan sedang diproses Apple.

Apakah tersedia di EU?

Sudah disubmit dan sedang diproses Apple. Digital Markets Act EU memerlukan langkah kepatuhan tambahan, dan saya sudah menyelesaikan dokumen-dokumennya — tinggal menunggu review Apple. Seharusnya segera tersedia. Sementara itu, web app-nya berfungsi di mana saja termasuk EU.

Apakah Apple menolaknya?

Ya — submission pertama ditolak karena in-app purchase yang rusak (Guideline 2.1: App Completeness). Konfigurasi sandbox StoreKit tidak sinkron dengan App Store Connect, sehingga pembelian melempar error saat review. Saya memperbaikinya di hari yang sama, resubmit, dan lolos. Lalu v1.0.1 juga lolos. Total tiga submission, satu penolakan. Penolakan itu mengajarkan lebih banyak dari kedua penerimaan gabungan.

Berapa lama keseluruhan prosesnya?

Sekitar dua minggu dari blog post pertama sampai persetujuan App Store. Claude Code meng-scaffold 69 file Swift dalam satu malam. 16 commit berikutnya menambahkan 4.886 baris di 57 file — test, fitur Studio, redesain audio player, penulisan ulang MFA, security hardening, verifikasi StoreKit, lokalisasi, dan proses submission App Store. App dikirim dengan 88 file dan 11.459 baris kode bersama 195 test.

Apa bagian paling sulit dari 40% terakhir?

StoreKit sandbox testing. Jarak antara "ini berfungsi dalam kode" dan "ini berfungsi di sistem transaksi Apple" sangat besar. Transaksi sandbox berperilaku berbeda dari production, product ID harus cocok persis (sampai ke trailing space), dan feedback loop-nya lambat — kamu tidak bisa begitu saja menjalankan unit test.

Bisakah saya tetap menggunakan web app-nya?

Tentu saja. podcast.chandlernguyen.com punya fitur yang sama dan berfungsi di perangkat apa pun. App iOS menambahkan kenyamanan native — Apple Sign-In, kontrol lock screen, offline download — tapi pengalaman inti pembuatan podcast-nya identik.


Masih mencari tahu apa yang harus dibilang ke putri saya. Tapi setidaknya sekarang saya punya app yang sudah dikirim untuk ditunjuk ketika bilang "pekerjaan manusia adalah bagian yang sulit."


Salam hangat, Chandler

Lanjutkan Membaca

Perjalanan Saya
Terhubung
Bahasa
Preferensi