Pemutar audio yang saya buat sendiri
(nexo.sh)- Bahkan pada 2025, masih banyak batasan untuk memutar musik MP3 secara bebas di iPhone
- Apple dan aplikasi pihak ketiga kebanyakan memakai layanan berbayar atau kurang nyaman digunakan
- Aplikasi yang dibuat sendiri menyediakan pencarian full-text, dukungan iCloud, dan lingkungan yang mengutamakan lokal
- Pendekatan lintas platform seperti React Native memiliki keterbatasan karena pembatasan sistem file dan masalah stabilitas
- Dengan desain berbasis SwiftUI dan SQLite, pengalaman pengelolaan musik yang mandiri dan mudah dikembangkan berhasil diwujudkan
Gambaran umum
Untuk mengatasi sendiri ketidaknyamanan karena pada 2025 pun pengguna masih sulit memutar file MP3 milik mereka sendiri secara bebas di iPhone, penulis memperkenalkan proses dan hasil pembuatan aplikasi pemutar musik buatannya sendiri. Sementara layanan musik Apple dan aplikasi eksternal sama-sama memiliki berbagai batasan dan model berbayar, aplikasi yang diimplementasikan sendiri memberikan pengalaman yang dioptimalkan untuk mengelola dan memutar file musik pengguna.
Alasan membuat pemutar musik sendiri
- Fitur sinkronisasi berbasis cloud seperti Apple Music dan iCloud Music Library hanya berfungsi jika berlangganan layanan berbayar
- Jika langganan dihentikan, sinkronisasi otomatis dan akses ke folder musik ikut diblokir sepenuhnya
- Penulis merasakan tidak adanya hak sebagai pemilik atas integrasi perpustakaan musik yang ada dan pemanfaatan perangkat secara umum
- Penulis ingin mewujudkan kemandirian dalam menentukan sendiri bahwa “fitur yang benar-benar dibutuhkan bisa dibuat sendiri di smartphone yang sudah dibeli”
Analisis solusi pemutaran musik dari Apple dan pihak ketiga
Aplikasi bawaan Apple
- File musik di folder iCloud memang bisa diputar lewat aplikasi Files, tetapi fitur dasar seperti pengelolaan playlist, pengurutan metadata, dan manipulasi antrean masih lemah
- Pengalaman pengguna yang diberikan tidak dioptimalkan untuk menikmati musik
Aplikasi pihak ketiga
- Di App Store ada berbagai aplikasi eksternal, tetapi banyak yang memakai model pembayaran berbasis langganan, dan tingkat fitur tiap aplikasi berbeda-beda
- Ada juga aplikasi berbayar sekali beli seperti Doppler, tetapi pengalaman pencarian dan impor pada folder iCloud berukuran besar masih kurang mulus
Perjalanan teknis menuju “builder mode”
- Penulis memutuskan untuk membuat sendiri aplikasi pemutar musik
- Fitur yang dibutuhkan: pencarian full-text cepat untuk seluruh folder iCloud, fitur pengelolaan musik setara aplikasi musik resmi (antrean, playlist, pengurutan, dll.), serta antarmuka yang intuitif
Percobaan pertama dengan React Native
- Karena pengalaman yang kurang nyaman dengan Swift di masa lalu (dulu belum mendukung async/await, dll.), penulis lebih memilih React Native/Expo
- Dengan memanfaatkan template open source, implementasi UI berjalan cukup mulus, tetapi penulis merasakan crash aplikasi dan keterbatasan fungsional saat menangani akses dan sinkronisasi sistem file (folder iCloud)
- Setelah menyadari bahwa menurut kebijakan sandbox iOS, akses ke folder eksternal tidak mungkin tanpa izin eksplisit, penulis pun beralih ke Swift
Memilih SwiftUI dan alasannya
- Memanfaatkan paradigma UI deklaratif SwiftUI, serta dukungan async/await modern dan Swift Actor
- Dengan pemisahan tegas antara UI dan logika data, penulis mewujudkan alur data yang rapi dan penanganan konkurensi domain
- Juga membantu mengoptimalkan pemanfaatan LLM (OpenAI o1, DeepSeek, dll.) dan meminimalkan dependensi pada kode UI yang dihasilkan
Arsitektur aplikasi dan model data
-
Menggunakan SQLite sebagai penyimpanan data, dan memilihnya alih-alih CoreData karena bisa langsung memakai fitur full-text search (FTS5)
-
Tiga layar/mode utama aplikasi:
- Impor pustaka: menyimpan jalur file audio dari tiap folder iCloud ke DB secara massal untuk mendukung pencarian dan pengelolaan yang fleksibel
- Pengelolaan pustaka: playlist, klasifikasi lagu, pengeditan, dll.
- Pemutaran musik: pengelolaan antrean (repeat, shuffle, dll.) dan kontrol lagu dasar
-
Alur pengguna saat impor pustaka:
- Dari kondisi awal kosong, pengguna memilih folder dan memindai tree melalui "Add iCloud Source"
- Setelah pengindeksan selesai, pengguna berpindah ke tab pustaka dan mendapatkan daftar per kata kunci serta mini player
- Saat lagu baru ditambahkan, penggabungan dilakukan otomatis di latar belakang
Lapisan logika bergaya backend
- Berdasarkan pengalaman pengembangan startup berbasis web/cloud, penulis memisahkan dengan tegas lapisan logika dari UI/ViewModel
- Lapisan domain (Swift actors) menyimpan logika bisnis utama seperti impor, pencarian, dan antrean, sehingga keamanan thread terjaga
- Pembaruan UI dipisahkan rapi melalui ViewModel, sehingga dependensi antara sinkronisasi file, pemutaran, dan UI diminimalkan untuk meningkatkan kemudahan pemeliharaan
Implementasi full-text search dengan SQLite
- Mulai iOS 11, SQLite dengan dukungan FTS5 bisa digunakan tanpa konfigurasi tambahan
- Menyediakan pencarian cepat tanpa memerlukan indeks atau server pencarian eksternal
- Library SQLite.swift dipakai untuk query umum, sedangkan query FTS menggunakan pernyataan SQL secara langsung
Struktur tabel FTS
songs_fts: mengindeks artist, title, album, albumArtist, dan lainnyasource_paths_fts: mengindeks jalur file dan nama file- Berada berdampingan dengan tabel utama, dan di UI hanya digunakan khusus untuk pencarian (READ)
- Pembaruan indeks ditangani melalui transaksi DB untuk menjaga konsistensi data
Pencarian fuzzy dan pemeringkatan
- Wildcard ditambahkan otomatis di belakang input, lalu hasil diurutkan berdasarkan relevansi berbasis BM25
- Secara keseluruhan, tercapai struktur data yang dapat diprediksi tanpa ketergantungan jaringan dan lingkungan pencarian lokal yang kuat
Memanfaatkan sistem file iOS dan bookmark
- Berbeda dari macOS, iOS tidak mendukung security-scoped bookmarks, sehingga kesinambungan akses ekstensi file eksternal kurang memadai
- Karena yang disimpan hanya informasi jalur, saat mengakses ulang pengguna harus kembali menyetujui izin
- Solusinya: saat akses diizinkan, file itu sendiri disalin ke sandbox aplikasi
- Penyalinan otomatis di latar belakang mempercepat pengindeksan file
- Setelah perangkat reboot, memutar langsung file eksternal tetap sulit, yang menunjukkan bahwa batasan akses file di iOS sangat ketat
Desain pemutaran dan antarmuka berbasis AVFoundation
- Menggunakan framework AVFoundation dan AVURLAsset untuk menganalisis metadata file audio
- Beberapa field seperti track number diparsing secara manual (memanfaatkan tag ID3)
- Untuk pemutaran audio, digunakan AVAudioPlayer, dan untuk integrasi dengan Control Center diimplementasikan MPRemoteCommandCenter serta protokol Delegate
Hal yang dirasakan setelah pengembangan dan refleksi atas kebijakan Apple
Hal yang menyulitkan
- Lingkungan Xcode yang membatasi: preview real-time SwiftUI sudah berkembang, tetapi masih kalah nyaman dibanding VSCode atau Flutter
- Kurangnya fleksibilitas editor: untuk memakai Swift LSP di Neovim atau VSCode perlu pengaturan tambahan dan hasilnya masih kurang matang
- Sebagian sudut SDK masih berpusat pada Objective-C: untuk pencarian metadata dan sejenisnya, API yang ramah Swift modern masih kurang
- Debugging integrasi iCloud merepotkan: fitur cloud tidak bisa diimplementasikan sepenuhnya di preview SwiftUI, sehingga perlu menyiapkan mockup sendiri
Hal yang positif
- Dengan async/await, penulisan kode konkurensi yang I/O-bound menjadi jauh lebih mudah
- Library native yang kaya: bisa mengembangkan fitur yang lebih beragam tanpa terhalang keterbatasan binding open source
- Desain UI deklaratif SwiftUI: terasa keunggulan pendekatan ala React sekaligus produktivitas yang tinggi
Kesimpulan: bukankah seharusnya pengembangan dibuat lebih mudah?
- Dalam 1,5 minggu pengembangan, tujuan membuat pemutar musik lokal/offline berhasil dicapai
- Namun pada praktiknya, distribusi aplikasi itu sendiri juga dibatasi: tanpa sertifikat developer aplikasi tidak bisa dipakai setelah 7 hari, dan perlu pendaftaran developer $99 per tahun
- Bahkan setelah EU DMA Act, sideloading belum sepenuhnya dibuka, sehingga pembatasan bagi developer individu dan hobi masih tetap ada
- PWA di iOS juga masih dibatasi karena API utama belum didukung (Web Bluetooth/USB/NFC, Background Sync, dll.)
- Meski AI menurunkan hambatan pengembangan, khusus iOS hambatan masuk tetap tinggi karena aturan yang dibuat secara artifisial
- Pembatasan terhadap developer independen dan hak pengguna masih ada, dan sifat tertutup iOS tetap menjadi penghambat inovasi
1 komentar
Komentar Hacker News
yt-dlpakan mengunduhnya ke server dan dari sana bisa di-streaming; aplikasi itu selalu mengingat posisi putar, jadi posisi yang saya dengarkan di mobil bisa langsung saya lanjutkan di laptop kantor; menambahkan mix dari sumber lain seperti NTS Radio juga berjalan sangat baikasync/awaitditambahkan, menulis kode konkurensi jadi lebih mudah;asyncmemang membuat penulisan kode lebih nyaman, tetapi ketika skala membesar justru jauh lebih sulit memahami alur kode dan konkurensinya; ketika ada masalah yang belum terpecahkan, saya rasa alternatif seperti green lightweight threads bisa dipertimbangkan; dalam jangka panjang, pendekatan berbasis async malah bisa menaikkan biaya pemeliharaanasync/await; konkurensi yang baik seharusnya membuat kode lebih mudah dipahami dan dikelola saat berkembang, dan enkapsulasi berbasis proses/layanan memberi keuntungan besar