1 puan yazan GN⁺ 2025-05-24 | 1 yorum | WhatsApp'ta paylaş
  • 2025'te bile iPhone'da MP3 müziği özgürce çalmak hâlâ birçok kısıtla karşılaşıyor
  • Apple ve üçüncü taraf uygulamalar çoğunlukla ücretli hizmetler sunuyor ya da kullanıcı deneyimi açısından yetersiz kalıyor
  • Geliştiricinin yaptığı uygulama tam metin arama, iCloud desteği, önce yerel çalışan yapı gibi özellikler sunuyor
  • React Native gibi çapraz platform yaklaşımları, dosya sistemi kısıtları ve kararlılık sorunları nedeniyle sınırlı kaldı
  • SwiftUI ve SQLite tabanlı tasarım ile bağımsız ve yüksek ölçüde genişletilebilir bir müzik yönetimi deneyimi hayata geçirildi

Genel bakış

2025'te bile iPhone'da kullanıcının bizzat sahip olduğu MP3 dosyalarını özgürce çalmanın zor olması gerçeğinden kaynaklanan rahatsızlığı doğrudan çözmek isteyen geliştirici, kendi müzik çalar uygulamasını yapma sürecini ve sonucunu anlatıyor. Apple'ın müzik hizmetleri ve harici uygulamalar farklı kısıtlamalar ve ücretli modeller sunarken, geliştiricinin kendi uygulaması kullanıcının müzik dosyalarını yönetme ve çalma işine optimize edilmiş bir deneyim sağlıyor.

Müzik oynatıcıyı neden kendim yaptım

  • Apple Music ve iCloud Music Library gibi bulut tabanlı eşitleme özellikleri ancak ücretli abonelik ile çalışıyor
  • Abonelik sonlandırıldığında otomatik eşitleme ve müzik klasörlerine erişim tamamen engelleniyor
  • Mevcut müzik kütüphanesi entegrasyonu ve cihazların genel amaçlı kullanımı konusunda sahiplik hakkının eksikliği hissediliyor
  • "Satın aldığım akıllı telefonda gerçekten ihtiyacım olan işlevleri kendim de yapabilirim" düşüncesiyle öz belirleme yaklaşımı hayata geçirilmek istendi

Apple ve üçüncü taraf müzik oynatma çözümlerinin analizi

Apple'ın varsayılan uygulamaları

  • Files uygulamasıyla iCloud klasörlerindeki müzik dosyaları çalınabiliyor, ancak çalma listesi yönetimi, metadata sıralama, kuyruk düzenleme gibi temel işlevler zayıf kalıyor
  • Müzik dinlemeye optimize edilmemiş bir kullanıcı deneyimi sunuyor

Üçüncü taraf uygulamalar

  • App Store'da çeşitli harici uygulamalar var, ancak abonelik tabanlı ücretlendirme modeli yaygın ve uygulamaların işlev seviyesi değişkenlik gösteriyor
  • Doppler gibi bazı ücretli (tek seferlik satın alma) uygulamalar da var, ancak büyük iCloud klasörlerinde arama ve içe aktarma deneyimi akıcı değil

“Builder mode”a uzanan teknik yolculuk

  • Geliştirici kendi müzik çalar uygulamasını yapmaya karar verdi
  • İstenen özellikler: tüm iCloud klasörlerinde hızlı tam metin arama, resmi müzik uygulaması düzeyinde müzik yönetimi özellikleri (kuyruk, çalma listesi, sıralama vb.) ve sezgisel bir arayüz

İlk React Native denemesi

  • Swift deneyimindeki rahatsızlıklar nedeniyle (eskiden async/await desteği olmaması gibi) React Native/Expo tercih edildi
  • Açık kaynak şablonlar kullanılarak arayüzü oluşturmak sorunsuzdu, ancak dosya sistemi (iCloud klasörleri) erişimi ve eşitleme tarafında uygulama çökmesi ve işlevsel sınırlamalar yaşandı
  • iOS sandbox politikası nedeniyle açık izin olmadan harici klasörlere erişilemediği fark edilince Swift'e geçildi

SwiftUI seçimi ve nedenleri

  • SwiftUI'nin deklaratif UI paradigması ile modern async/await ve Swift Actor desteği kullanıldı
  • UI ile veri mantığının sıkı biçimde ayrılması sayesinde temiz veri akışı ve alan düzeyinde eşzamanlılık yönetimi kuruldu
  • LLM'lerin (OpenAI o1, DeepSeek vb.) kullanımını optimize etme etkisiyle, üretilen UI kodunun bağımlılıkları da azaltıldı

Uygulama mimarisi ve veri modeli

  • Veri deposu olarak SQLite kullanıldı; tam metin arama (FTS5) özelliği doğrudan kullanılabildiği için CoreData yerine tercih edildi

  • Uygulamanın 3 ana ekranı/modu:

    1. Kütüphane içe aktarma: iCloud klasörlerindeki ses dosyası yollarını topluca veritabanına kaydederek esnek arama ve yönetim sağlıyor
    2. Kütüphane yönetimi: çalma listeleri, parça sınıflandırma, düzenleme vb.
    3. Müzik çalma: kuyruk yönetimi (tekrar, karıştırma vb.) ve temel parça kontrolleri
  • Kütüphane içe aktarma sırasında kullanıcı akışı:

    • Başlangıçtaki boş durumda "Add iCloud Source" ile klasör seçiliyor ve ağaç yapısı taranıyor
    • İndeksleme tamamlanınca kütüphane sekmesine geçiliyor; anahtar kelimeye göre liste ve mini oynatıcı sunuluyor
    • Yeni parçalar eklendiğinde arka planda otomatik olarak birleştiriliyor

Backend tarzı mantık katmanı

  • Web/bulut tabanlı startup geliştirme deneyimi temel alınarak, mantık katmanı ile UI/ViewModel sıkı biçimde ayrıldı
  • Alan katmanı (Swift actors) temel iş mantığını (içe aktarma, arama, kuyruk vb.) üstlenerek thread safety sağlıyor
  • UI güncellemeleri ViewModel üzerinden temiz biçimde ayrılıyor; dosya eşitleme, oynatma ve UI arasındaki bağımlılık azaltılarak bakım kolaylaştırılıyor

SQLite ile tam metin arama uygulaması

  • iOS 11 ve sonrasında ek ayar olmadan FTS5 destekli SQLite kullanılabiliyor
  • Harici arama indeksi veya sunucu gerektirmeden hızlı arama sunuyor
  • Genel sorgular için SQLite.swift kütüphanesi, FTS sorguları için ise doğrudan SQL kullanıldı

FTS tablo yapısı

  • songs_fts: parçaların artist, title, album, albumArtist gibi alanlarını indeksliyor
  • source_paths_fts: dosya yolları ve dosya adlarını indeksliyor
  • Ana tablolarla yan yana bulunuyor ve UI tarafında yalnızca arama (READ) amaçlı kullanılıyor
  • İndeks güncellemeleri veritabanı transaction'ları ile işlenerek veri tutarlılığı korunuyor

Bulanık (Fuzzy) arama ve sıralama

  • Girilen değerin sonuna otomatik wildcard ekleniyor, BM25 tabanlı ilgililik sırasına göre sıralama yapılıyor
  • Genel olarak ağa bağımlı olmayan, öngörülebilir veri yapısı ve güçlü bir yerel arama ortamı sağlanmış oluyor

iOS dosya sistemi ve bookmarks kullanımı

  • iOS, macOS'un aksine security-scoped bookmarks desteklemediği için harici dosya erişiminin sürekliliği zayıf
  • Yalnızca yol bilgisi saklandığından, yeniden erişimde kullanıcının tekrar izin vermesi gerekiyor
  • Çözüm olarak erişim izni verildiği anda dosyanın kendisi uygulama sandbox'ına kopyalanıyor
  • Arka planda otomatik kopyalama ile dosya indeksleme hızı iyileştirildi
  • Cihaz yeniden başlatıldıktan sonra harici dosyaları doğrudan çalmak hâlâ zor, bu da iOS'un dosya erişim kısıtlarının ne kadar ağır olduğunu gösteriyor

AVFoundation tabanlı oynatma ve arayüz tasarımı

  • Ses dosyası metadata'sını analiz etmek için AVFoundation framework'ü ve AVURLAsset kullanıldı
  • Track number gibi bazı alanlar elle parse edildi (ID3 etiketleri kullanılarak)
  • Ses oynatma için AVAudioPlayer, Control Center entegrasyonu için ise MPRemoteCommandCenter ve Delegate protokolleri kullanıldı

Geliştirme sonrasında hissedilenler ve Apple politikalarına dair değerlendirme

Zorlayıcı noktalar

  • Xcode'un kısıtlayıcı ortamı: SwiftUI canlı önizleme gelişmiş olsa da VSCode ve Flutter'ın rahatlığına ulaşamıyor
  • Editör esnekliğinin azlığı: Neovim ve VSCode'da Swift LSP kullanmak için ek ayarlar gerekiyor ve olgunluk seviyesi düşük
  • SDK'nın bazı köşeleri hâlâ Objective-C ağırlıklı: metadata arama gibi yerlerde modern Swift dostu API'ler eksik
  • iCloud entegrasyonu için debug süreci zahmetli: SwiftUI preview içinde bulut özelliklerini tam uygulamak mümkün değil, elle mock kurmak gerekiyor

Olumlu noktalar

  • Async/await sayesinde I/O bound eşzamanlılık kodu yazmak belirgin şekilde kolaylaştı
  • Zengin native kütüphaneler: açık kaynak binding'lerin sınırlarının ötesine geçip daha çeşitli özellikler geliştirilebiliyor
  • SwiftUI'nin deklaratif UI tasarımı: React tarzı yaklaşımın güçlü yanları ve yüksek üretkenlik net biçimde hissediliyor

Sonuç: geliştirme daha kolay olmalı, değil mi?

  • 1,5 haftalık geliştirme ile yerel/çevrimdışı müzik çalar hedefi gerçekleştirildi
  • Ancak gerçekte uygulamanın kendisini dağıtmakta da kısıtlar var: geliştirici sertifikası olmadan 7 gün sonra kullanılamıyor, yıllık $99 geliştirici kaydı gerekiyor
  • AB DMA Act sonrasında bile sideloading tamamen serbest değil; bireysel ve hobi amaçlı geliştiriciler için kısıtlar sürüyor
  • PWA'ler de iOS'ta önemli API'lerde destek eksikliği gibi kısıtlarla karşılaşıyor (Web Bluetooth/USB/NFC, Background Sync vb.)
  • Yapay zeka geliştirme bariyerlerini düşürmüş olsa da, özellikle iOS'ta yapay kurallar giriş eşiğini yüksek tutuyor
  • Bağımsız geliştiricilerin ve kullanıcıların yetkilerinin sınırlandırılması sürüyor; iOS'un kapalılığı hâlâ inovasyonun önünde bir engel

1 yorum

 
GN⁺ 2025-05-24
Hacker News görüşleri
  • 25 yıldır müzik koleksiyonunu FLAC formatında kuran biri olarak, geçen yıl bir Android telefon ve 1TB MicroSD kart alıp tüm müziğini cebinde taşıyabilmekten büyük memnuniyet duyduğunu söylüyor; müziği kiralamak, kontrolü kaybetmek, sektörün öne ittiği parçaları stream etmek ya da reklamlarla uğraşmak istemeyen tek kişinin kendisi olmadığını düşündüğünü ve insanların kendi uygulamalarını geliştirdiğini görmenin harika olduğunu belirtiyor
    • Teknolojinin aslında yıllardır yeterli seviyede olduğunu, sadece kendisinin uygun olmayan bir formatta ısrar ettiğini söyleyen bir görüş var; iyi bir yeniden kodlama ile fark edilemeyecek kadar şeffaf ses kalitesinde tüm müziği çok daha küçük boyutta saklamanın mümkün olduğu, FLAC dosyalarını masaüstünde yedek olarak tutmanın önerildiği belirtiliyor
    • Gerçekten iyi bir arşivci olduğu yönünde övgü geliyor; kendi müzik koleksiyonunun yaklaşık %25’inin FLAC/APE/ALAC/WavePack gibi kayıpsız formatlarda olduğu ve toplam boyutun 3TB’ı aştığı, bu yüzden hareket halindeyken müzik dinlemenin zorlaştığı, hangi müziği mobil cihaza önceden aktaracağını seçmenin güç olduğu paylaşılıyor
    • Android’de albüm kapaklarının ya da başlık bilgilerinin doğru yansımaması veya rastgele değişmesi sorununu sürekli yaşadığını, bunun Android kaynaklı bir hata gibi göründüğünü ve bunu çözen olup olmadığını soruyor
    • Kendisinin de kişisel koleksiyonunu sadece FLAC ile tuttuğunu ama henüz 25 yıl olmadığını, 1TB’ı geçtiğini ve Navidrome sunucusu ile Symfonium istemcisini kullanmaktan çok memnun olduğunu söylüyor; 2TB microSD kartlar yeni yeni çıkmaya başladığı için fiyatlar biraz daha düşünce muhtemelen alacağını ekliyor
  • Winamp döneminden beri müzik dinlediğini ve bugün de streaming çağında olmasına rağmen yerel müzik kütüphanesini klasör klasör düzenleyerek kullandığını söylüyor; diğer yorumcular gibi çevrimdışı müzik dinlemek için eski usul bir müzik çaları hobi olarak kendisinin de yaptığını, bunun tek sayfalık bir html/js uygulaması olduğunu, tam klavye kontrolü ve basit bir kuyruk (çalma listesi) işlevi sunduğunu ve https://nobsutils.com/mp adresine bakılmasını öneriyor
    • Bir başkası da 27 yıl önce bile Winamp arayüzünün gerçekten mükemmel olduğunu düşündüğünü, klasör bazlı dosya koleksiyonu, tümünü rastgele çalma ve yalnızca belirli dizinleri çalabilme gibi basit özelliklerin asıl gücü oluşturduğunu vurguluyor
    • Yapılan uygulamanın gerçekten çok iyi çalıştığı yönünde geri bildirim veriliyor
    • Kendisi için foobar2000’in favori müzik çalar olduğunu, şu anda ise onun yerine Cog uygulamasını kullandığını söylüyor
  • Tüm albümü dinlerken cihaz değiştirip kaldığı yerden devam etmeyi sağlayan bir web uygulamasını kendisinin geliştirdiğini anlatıyor; albümleri baştan sona dinlemeyi sevmesine rağmen YouTube Music gibi hizmetlerin oynatma konumunu düzgün hatırlayamadığını ya da cihaz geçişini rahatsız edici hale getirdiğini, kendi yaptığı web uygulamasında ise sadece URL yapıştırmanın yeterli olduğunu, içeriğin yt-dlp ile sunucuya indirildiğini ve oradan stream edilebildiğini söylüyor; uygulamanın oynatma konumunu her zaman hatırladığını, arabada dinlediği noktadan işteki dizüstünde devam edebildiğini ve NTS Radio gibi başka kaynaklardan miks eklemenin de çok iyi çalıştığını belirtiyor
    • YouTube Music’te kuyruğun kaydedilmemesi ve cihazlar arası geçişin sorunsuz olmamasına katıldığını, geliştiricinin yaptığı web uygulamasını denemek istediğini söylüyor
  • Yazının sadece fiziksel cihazlardan değil, bunları yöneten ve çalan yazılımlardan da söz etmesini istediğini söylüyor; birkaç yıl önce 10 yaşındaki oğluna bir mp3 çalar almak istediğinde uygun ürün neredeyse hiç olmamasının kendisini şaşırttığını, Apple’ın iPod’u sonlandırmasıyla pazarda büyük bir boşluk oluştuğunu ama bunun hâlâ doğru dürüst doldurulmadığını belirtiyor; USB bellek biçimindeki iPod shuffle’ın şimdiye kadar kullandığı en iyi mp3 çalar olduğunu, küçük, tak-çalıştır tarzında ve uzun pil ömürlü olması nedeniyle çok beğendiğini, ekransız ve sadece shuffle çalışan konseptin hatta avantaj olduğunu söylüyor; buna benzer basit cihazların bugün donanım pazarında yeniden üretilmediğini, bazılarının bunu yazılım/DRM sorununa bağladığını ama kendisinin yalnızca müzik çalan, ucuz ve taşınabilir bir cihazın hâlâ olmasını istediğini ifade ediyor
    • Asıl büyük değişimin iPod’un ortadan kalkması değil, Spotify ve akıllı telefonların yaygınlaşması olduğunu; bu ikisinin pazarın çoğunu kaplayıp diğer tüm seçenekleri dışarı ittiğini düşünüyor
    • Fiio’nun bu kategoride çeşitli ürünler sunduğu bilgisi paylaşılıyor, örnek1 örnek2
    • Sorunun donanım ya da yazılım değil, talep meselesi olduğunu düşünüyor; Çinli üreticilerin Mini iPhone 16, Mini S24 gibi, akıllı telefon özellikleri de sunan ve müzik çalabilen mini cihazları $50~$100 aralığında sattığını, çoğu ebeveynin çocuklarına mp3 çalar yerine bunları alma ihtimalinin daha yüksek olduğunu ve 14 yaşına kadar telefon vermemeye çalışan ebeveyn sayısının çok fazla olmaması nedeniyle pazar talebinin buna göre şekillendiğini belirtiyor
    • Sony’nin hâlâ "walkman" markası altında iyi çalarlar çıkarmaya devam ettiğini, resmî bağlantıyı paylaşıyor; 10 yaşındaki bir çocuk için biraz pahalı olabileceğinden eBay’den ikinci el almayı öneriyor
    • SanDisk Clip gibi mp3 çalarların evin bir yerlerinde duruyor olabileceğini söyleyerek nostalji yapıyor
  • Bu yazıyı keyifle okuduğunu ve henüz tamamlamadığını, geliştiricinin küçük ve ayrıntılı kararları nasıl aldığını ve bunların arka planını okumanın hoşuna gittiğini söylüyor; neredeyse tüm müzik uygulamalarında UX ve yerleşimin birbirine benzediğini, bu yüzden bu uygulamaların hepsiyle adeta “boks yapıyormuş” gibi hissettiğini ve yeni denemelere girişen insanları desteklediğini belirtiyor
  • Hâlâ Apple Music uygulamasında yalnızca yerel dosyaları kullandığını, Apple Music streaming hizmetini kapattığını, tüm müziğini macOS’teki Apple Music uygulamasına yüklediğini ve sonra telefonunu dizüstüne bağlayıp 2007’deki gibi senkronize ettiğini söylüyor; müziğinin çok sık değişmemesi nedeniyle bunun sorun olmadığını ve kablolu senkronizasyonda hissettiği nostaljiyi de sevdiğini ekliyor
    • iTunes ile otomatik wi-fi senkronizasyonunun da hâlâ gayet iyi çalıştığını belirtiyor
  • "Yenilikçi bir BT şirketi neden demokratik uygulama geliştirmeye tam tersine engeller koyar" sorusuna yanıt olarak, eski Disney CEO’su Michael Eisner’dan bir alıntı üzerinden şirketlerin özünde kâr peşinde koştuğunu, Apple’ın yenilikçi ya da demokratik değil, kâr odaklı bir şirket olduğunu savunuyor; geliştiriciler için giriş engellerini azaltmanın ya da daha demokratik bir açıklığın, daha fazla gelir getirmediği sürece resmî mağazanın "altın yumurtlayan kaz" gelirinden vazgeçmek anlamına geleceğini, yani kârın her şeyin önünde tutulduğunu vurguluyor
  • Çevrimdışı müzik kütüphanesi olan Android kullanıcıları için Musicolet uygulamasını güçlü biçimde tavsiye ediyor; kusursuz çalıştığını söylüyor
    • Plex, Jellyfin, WebDAV, SMB gibi geniş destek sunabilen Symfonium’un da çok iyi olduğunu özellikle vurguluyor
  • Derinlikli teknik analizi keyifle okuduğunu ve React Native’den SwiftUI’a geçerken yerel kodun iCloud erişimi ve optimizasyonunda ne kadar daha kolay hale geldiğini fark ettiğini söylüyor; SQLite FTS5 arama numarasının da çok etkileyici olduğunu ve bunu kendi kütüphane uygulamasında kullanmayı düşündüğünü belirtiyor
  • Swift’ten ilk başta zor olduğu için kaçındığını ama sonradan async/await eklendiğinde eşzamanlı kod yazmanın kolaylaştığı iddiasına katılmadığını söylüyor; async’in kod yazarken rahatlık sağladığını ama ölçek büyüdüğünde kod akışını ve eşzamanlılığı anlamayı çok daha zorlaştırdığını deneyimlediğini, çözülmemiş sorunlar varken green lightweight threads gibi alternatiflerin olduğunu düşündüğünü ve uzun vadede async tabanlı yaklaşımın bakım maliyetini artırabileceğinden endişe ettiğini belirtiyor
    • Sorunun eşzamanlılık kavramının kendisinden çok async/await soyutlamasının sınırları olduğunu düşünüyor; iyi bir eşzamanlılık modelinin kod ölçeklendikçe daha anlaşılır ve daha yönetilebilir olması gerektiğini, süreç/hizmet merkezli kapsüllemenin büyük avantaj sağladığını söylüyor
    • Kendi basit müzik çalar kullanım amacı için async’ten kaynaklanan karmaşıklık artışının neredeyse hiç sorun olmayacağını ekliyor