1 poin oleh GN⁺ 2025-05-24 | 1 komentar | Bagikan ke WhatsApp
  • 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:

    1. Impor pustaka: menyimpan jalur file audio dari tiap folder iCloud ke DB secara massal untuk mendukung pencarian dan pengelolaan yang fleksibel
    2. Pengelolaan pustaka: playlist, klasifikasi lagu, pengeditan, dll.
    3. 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 lainnya
  • source_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

 
GN⁺ 2025-05-24
Komentar Hacker News
  • Saya sudah membangun koleksi musik saya dalam format FLAC selama 25 tahun, dan tahun lalu saya membeli ponsel Android serta kartu MicroSD 1TB, jadi saya sangat puas akhirnya bisa membawa semua musik saya di saku; saya yakin saya bukan satu-satunya orang yang tidak ingin menyewa musik, kehilangan kendali, melakukan streaming lagu yang didorong industri, atau berurusan dengan iklan; melihat ada orang yang mengembangkan aplikasinya sendiri terasa keren
    • Menurut saya, teknologinya sebenarnya sudah cukup matang sejak beberapa tahun lalu, hanya saja Anda bersikeras memakai format yang kurang cocok; dengan re-encoding yang baik, Anda bisa menyimpan seluruh musik dalam ukuran jauh lebih kecil dengan kualitas yang cukup transparan sampai-sampai perbedaan suara tidak akan terasa, dan saya menyarankan tetap menyimpan file FLAC di desktop untuk cadangan
    • Anda benar-benar seorang kolektor yang serius; koleksi musik saya sekitar 25% terdiri dari format lossless seperti FLAC/APE/ALAC/WavePack dan ukurannya sudah lebih dari 3TB, jadi saya kesulitan mendengarkan musik saat bepergian — sulit memilih dulu lagu mana yang harus dipindahkan ke perangkat mobile
    • Di Android saya terus mengalami masalah sampul album atau informasi judul yang tidak tampil dengan benar atau berubah secara acak; ini terlihat seperti bug Android, jadi saya penasaran apakah ada yang pernah berhasil mengatasinya
    • Saya juga mengumpulkan koleksi pribadi hanya dalam FLAC, meski belum sampai 25 tahun; sekarang sudah lebih dari 1TB, dan saya sangat puas memakai server Navidrome serta klien Symfonium; kartu microSD 2TB mulai bermunculan sekarang, jadi kalau harganya turun lagi saya mungkin akan membelinya
  • Saya sudah mendengarkan musik sejak era winamp, dan sampai sekarang di era streaming pun saya masih memakai pustaka musik lokal yang diatur per folder; seperti komentator lain, saya juga membuat pemutar musik old-school sendiri sebagai hobi untuk mendengarkan musik offline; ini aplikasi html/js satu halaman dengan kontrol keyboard penuh dan fitur queue (daftar putar) sederhana, silakan lihat https://nobsutils.com/mp
    • Saya juga termasuk orang yang sejak 27 tahun lalu merasa UI winamp itu benar-benar luar biasa; kekuatan utamanya ada pada kesederhanaan kumpulan file per folder, putar acak seluruh koleksi, dan memutar hanya direktori tertentu
    • Aplikasi buatan Anda bekerja sangat baik
    • Bagi saya, foobar2000 dulu adalah pemutar musik favorit saya; sekarang saya menggantinya dengan aplikasi Cog
  • Saya membuat web app sendiri dengan fitur untuk mendengarkan album penuh dan melanjutkan dari titik terakhir meskipun berpindah perangkat; saya suka mendengarkan album dari awal sampai akhir, tetapi layanan seperti YouTube Music sering gagal mengingat posisi putar dengan baik atau terasa merepotkan saat berganti perangkat; di web app buatan saya, cukup tempel URL maka yt-dlp akan 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 baik
    • Saya setuju bahwa YouTube Music tidak bisa menyimpan queue dan tidak mulus saat berpindah antarperangkat; saya ingin mencoba sendiri web app yang Anda buat
  • Saya berharap artikelnya juga membahas software untuk mengelola dan memutar musik, bukan hanya perangkat fisiknya; beberapa tahun lalu saya ingin membelikan anak saya yang berusia 10 tahun sebuah mp3 player, dan saya terkejut karena hampir tidak ada produk yang cocok; Apple menghentikan iPod dan meninggalkan celah besar di pasar, tetapi belum ada yang benar-benar mengisinya; iPod shuffle (berbentuk USB stick) adalah mp3 player terbaik yang pernah saya pakai — kecil, model plug-in, dan baterainya tahan lama; konsep tanpa layar yang hanya shuffle justru merupakan kelebihan; perangkat sesederhana ini pun sekarang tidak lagi ditiru oleh pasar hardware; sebagian orang mungkin menganggap ini masalah software/DRM, tetapi saya hanya merasa sayang dan berharap ada perangkat murah, portabel, yang memang hanya untuk memutar musik
    • Saya rasa perubahan utamanya bukan hilangnya iPod, melainkan meluasnya Spotify dan smartphone; keduanya menguasai sebagian besar pasar dan menyingkirkan semua opsi lain
    • Fiio ternyata masih mengeluarkan beberapa produk di kategori itu, contoh1 contoh2
    • Menurut saya ini bukan masalah hardware atau software, melainkan masalah permintaan; produsen Tiongkok menjual perangkat mini seharga $50~$100 seperti Mini iPhone 16 atau Mini S24 yang punya fungsi smartphone sekaligus bisa memutar musik, dan kebanyakan orang tua kemungkinan lebih memilih membelikan perangkat seperti itu daripada mp3 player; tidak banyak orang tua yang benar-benar menunda memberi ponsel sampai anak berusia 14 tahun, jadi permintaan pasar terbentuk mengikuti kenyataan itu
    • Sony masih terus merilis pemutar yang bagus dengan merek "walkman", tautan resmi; untuk anak usia 10 tahun mungkin agak mahal, jadi saya sarankan beli bekas di eBay
    • Ini mengingatkan saya bahwa mungkin ada pemutar mp3 seperti SanDisk Clip tersimpan di suatu sudut rumah
  • Saya menikmati membaca tulisan ini meski belum selesai membacanya; saya suka membaca proses pengembang membuat keputusan-keputusan kecil yang detail beserta alasannya; hampir semua aplikasi musik terasa punya UX dan layout yang mirip, jadi saya selalu merasa seperti sedang 'bertinju' dengan semua aplikasi musik ini; semangat untuk orang-orang yang mencoba pendekatan baru
  • Saya masih memakai aplikasi Apple Music hanya untuk file lokal; layanan streaming Apple Music saya matikan, lalu saya muat semua koleksi musik ke aplikasi Apple Music di macOS, sambungkan ponsel ke laptop, dan sinkronkan seperti tahun 2007; karena musik saya tidak sering berubah, cara ini tidak jadi masalah, dan saya juga menikmati nostalgia dari sinkronisasi lewat kabel
    • Sinkronisasi wi-fi otomatis lewat iTunes juga masih berfungsi dengan baik
  • Menanggapi pertanyaan "mengapa perusahaan IT inovatif justru membuat hambatan bagi pengembangan aplikasi yang demokratis", saya teringat kutipan mantan CEO Disney Michael Eisner: pada akhirnya hakikat perusahaan adalah mengejar keuntungan, dan Apple bukan perusahaan yang inovatif atau demokratis, melainkan perusahaan yang berorientasi pada profit; kecuali ada jaminan pendapatan lebih besar, mempermudah hambatan masuk bagi pengembang atau membuka akses secara demokratis sama saja dengan melepaskan pemasukan 'angsa emas' dari store resminya; intinya logika yang mengutamakan keuntungan
  • Untuk pengguna Android yang punya pustaka musik offline, saya sangat merekomendasikan Musicolet; aplikasinya bekerja dengan sempurna
    • Symfonium juga sangat bagus karena mendukung banyak hal seperti Plex, Jellyfin, WebDAV, dan SMB
  • Saya senang membaca analisis teknis yang mendalam ini, dan saat beralih dari React Native ke SwiftUI saya benar-benar merasakan betapa native code jauh lebih mudah untuk akses iCloud dan optimisasi; trik pencarian SQLite FTS5 juga mengesankan dan ingin saya jadikan referensi untuk aplikasi pustaka saya
  • Awalnya saya menghindari Swift karena terasa sulit, tetapi saya tidak setuju dengan anggapan bahwa setelah async/await ditambahkan, menulis kode konkurensi jadi lebih mudah; async memang 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 pemeliharaan
    • Saya rasa masalahnya bukan pada konsep konkurensinya sendiri, melainkan pada keterbatasan abstraksi async/await; konkurensi yang baik seharusnya membuat kode lebih mudah dipahami dan dikelola saat berkembang, dan enkapsulasi berbasis proses/layanan memberi keuntungan besar
    • Untuk tujuan pemutar musik sederhana seperti milik penulis, peningkatan kompleksitas akibat async tampaknya hampir tidak akan menjadi masalah