Kendim yaptığım ses oynatıcı
(nexo.sh)- 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:
- 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
- Kütüphane yönetimi: çalma listeleri, parça sınıflandırma, düzenleme vb.
- 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ı indeksliyorsource_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
Hacker News görüşleri