- Auch 2025 gibt es noch viele Einschränkungen beim freien Abspielen von MP3-Musik auf dem iPhone
- Apple- und Drittanbieter-Apps sind meist kostenpflichtige Dienste oder bieten nur geringe Benutzerfreundlichkeit
- Die selbst entwickelte App bietet Volltextsuche, iCloud-Unterstützung und eine Local-First-Umgebung
- Cross-Platform-Ansätze wie React Native stießen wegen Dateisystembeschränkungen und Stabilitätsproblemen an Grenzen
- Mit SwiftUI und einem SQLite-basierten Design wurde eine unabhängige und hoch skalierbare Musikverwaltung umgesetzt
Überblick
Der Beitrag stellt den Prozess und das Ergebnis vor, wie der Entwickler aus dem Unbehagen heraus selbst eine Musik-Player-App gebaut hat, weil es selbst 2025 auf dem iPhone noch schwierig ist, selbst besessene MP3-Dateien frei abzuspielen. Während sowohl Apples Musikdienste als auch externe Apps verschiedene Einschränkungen und Bezahlmodelle haben, bietet die Eigenentwicklung eine auf Verwaltung und Wiedergabe eigener Musikdateien optimierte Nutzererfahrung.
Warum ich den Musik-Player selbst gebaut habe
- Cloud-basierte Synchronisierungsfunktionen wie Apple Music und die iCloud Music Library funktionieren nur mit einem kostenpflichtigen Abonnement
- Wird das Abo beendet, werden automatische Synchronisierung und der Zugriff auf Musikordner vollständig blockiert
- Es wurde spürbar, dass bei bestehender Integration in Musikbibliotheken und der allgemeinen Nutzbarkeit über Geräte hinweg die Rechte des Eigentümers fehlen
- Es sollte die Selbstbestimmung umgesetzt werden, dass man „mit einem gekauften Smartphone notwendige Funktionen auch selbst bauen kann“
Analyse der Musiklösungen von Apple und Drittanbietern
Apples Standard-Apps
- Über die Files-App lassen sich Musikdateien aus iCloud-Ordnern abspielen, aber Playlist-Verwaltung, Sortierung nach Metadaten und Queue-Steuerung sind nur unzureichend vorhanden
- Die Nutzererfahrung ist nicht für Musikhören optimiert
Drittanbieter-Apps
- Im App Store gibt es verschiedene externe Apps, aber viele setzen auf Abo-basierte Bezahlmodelle, und der Funktionsumfang unterscheidet sich stark
- Es gibt auch einige kostenpflichtige Apps mit Einmalkauf wie Doppler, doch die Such- und Importerfahrung in großen iCloud-Ordnern ist nicht reibungslos
Der technische Weg in den „Builder Mode“
- Es fiel die Entscheidung, selbst eine Musik-Player-App zu bauen
- Gewünschte Funktionen: schnelle Volltextsuche über komplette iCloud-Ordner, Musikverwaltungsfunktionen auf dem Niveau offizieller Musik-Apps (Queue, Playlists, Sortierung usw.) sowie eine intuitive Oberfläche
Erster Versuch mit React Native
- Wegen früherer Unannehmlichkeiten mit Swift (früher etwa ohne async/await-Unterstützung) wurde React Native/Expo bevorzugt
- Mit Open-Source-Templates ließ sich die UI problemlos umsetzen, aber bei Dateisystemzugriff und Synchronisierung von iCloud-Ordnern traten App-Abstürze und funktionale Grenzen auf
- Wegen der iOS-Sandbox-Regeln wurde klar, dass ohne explizite Berechtigung kein Zugriff auf externe Ordner möglich ist, daher erfolgte der Wechsel zu Swift
Warum SwiftUI gewählt wurde
- Nutzung des deklarativen UI-Paradigmas von SwiftUI sowie von modernem async/await und Swift Actor-Support
- Durch die strikte Trennung von UI und Datenlogik konnten ein sauberer Datenfluss und Domänen-Parallelität umgesetzt werden
- Außerdem half es bei der Optimierung der Nutzung von LLMs (OpenAI o1, DeepSeek usw.) und verringerte Abhängigkeiten im erzeugten UI-Code
App-Architektur und Datenmodell
-
Als Datenspeicher wurde SQLite verwendet; weil sich Volltextsuche (FTS5) direkt nutzen ließ, wurde es statt CoreData gewählt
-
Die App hat 3 Hauptbildschirme bzw. Modi:
- Bibliotheksimport: Audio-Dateipfade aus iCloud-Ordnern werden gesammelt in der DB gespeichert, um flexible Suche und Verwaltung zu unterstützen
- Bibliotheksverwaltung: Playlists, Kategorisierung von Songs, Bearbeitung usw.
- Musikwiedergabe: Queue-Verwaltung (Wiederholen, Shuffle usw.) und grundlegende Song-Steuerung
-
Nutzerfluss beim Bibliotheksimport:
- Im anfänglich leeren Zustand wird über „Add iCloud Source“ ein Ordner gewählt und der Verzeichnisbaum gescannt
- Sobald die Indizierung abgeschlossen ist, wechselt man zum Bibliotheks-Tab, wo keywordbasierte Listen und ein Mini-Player bereitstehen
- Werden neue Songs hinzugefügt, werden sie im Hintergrund automatisch zusammengeführt
Backend-artige Logikschicht
- Basierend auf Entwicklungserfahrung in Web-/Cloud-basierten Startups wurden Logikschicht und UI/ViewModel strikt getrennt
- Die Domänenschicht (Swift actors) enthält die zentrale Business-Logik (Import, Suche, Queue usw.) und sorgt für Thread-Sicherheit
- UI-Updates werden über ViewModels sauber aufgeteilt, wodurch Abhängigkeiten zwischen Dateisynchronisierung, Wiedergabe und UI minimiert und die Wartbarkeit verbessert werden
Volltextsuche mit SQLite implementieren
- Ab iOS 11 kann SQLite mit FTS5-Unterstützung ohne zusätzliche Konfiguration verwendet werden
- Dadurch ist schnelle Suche ohne externen Suchindex oder Server möglich
- Für normale Queries wurde die Bibliothek SQLite.swift genutzt, für FTS-Abfragen direkt SQL
Struktur der FTS-Tabellen
songs_fts: indexiert artist, title, album, albumArtist usw.source_paths_fts: indexiert Dateipfade und Dateinamen- Sie existieren parallel zu den Haupttabellen und werden in der UI nur für die Suche (READ) verwendet
- Index-Updates werden über DB-Transaktionen verarbeitet, um Datenkonsistenz zu gewährleisten
Fuzzy Search und Ranking
- Hinter Eingaben wird automatisch ein Wildcard angehängt, sortiert wird nach Relevanz auf Basis von BM25
- Insgesamt entstand so eine vorhersagbare Datenstruktur ohne Netzwerkabhängigkeit und eine leistungsfähige lokale Suchumgebung
iOS-Dateisystem und Nutzung von Bookmarks
- Anders als macOS unterstützt iOS keine security-scoped bookmarks, weshalb die dauerhafte Erweiterung des Zugriffs auf externe Dateien fehlt
- Da nur Pfadinformationen gespeichert werden, muss der Nutzer beim erneuten Zugriff die Berechtigung erneut erteilen
- Als Lösung wird die Datei selbst zum Zeitpunkt der Zugriffsfreigabe in die App-Sandbox kopiert
- Die automatische Kopie im Hintergrund verbessert die Geschwindigkeit der Dateiindizierung
- Auch nach einem Geräte-Neustart bleibt direktes Abspielen externer Dateien schwierig, was zeigt, wie stark die Dateizugriffsbeschränkungen von iOS sind
Wiedergabe auf Basis von AVFoundation und Interface-Design
- Mit dem AVFoundation-Framework und AVURLAsset werden Metadaten von Audiodateien analysiert
- Einige Felder wie die Track-Nummer werden manuell geparst (unter Nutzung von ID3-Tags)
- Für die Audiowiedergabe wird AVAudioPlayer verwendet, und für die Anbindung an das Control Center werden MPRemoteCommandCenter und Delegate-Protokolle implementiert
Eindrücke nach der Entwicklung und Gedanken zu Apples Richtlinien
Was unbequem war
- Die eingeschränkte Umgebung von Xcode: SwiftUI-Live-Previews sind zwar fortschrittlich, reichen aber nicht an den Komfort von VSCode oder Flutter heran
- Mangelnde Flexibilität des Editors: Wer Swift LSP in Neovim oder VSCode nutzen will, braucht zusätzliche Einrichtung, und die Umsetzung ist noch unausgereift
- Einige Ecken des SDK sind noch stark Objective-C-zentriert: etwa bei der Metadatensuche fehlen moderne, Swift-freundliche APIs
- Umständliches Debugging der iCloud-Integration: In SwiftUI-Previews lassen sich Cloud-Funktionen nicht vollständig umsetzen, daher mussten Mocks direkt gebaut werden
Positive Aspekte
- Mit async/await lässt sich I/O-gebundener nebenläufiger Code deutlich einfacher schreiben
- Reichhaltige native Bibliotheken: Dadurch sind vielfältigere Funktionen möglich als mit den Grenzen von Open-Source-Bindings
- Deklaratives UI-Design in SwiftUI: Die Stärken des React-Ansatzes und die hohe Produktivität waren deutlich spürbar
Fazit: Sollte Entwicklung nicht einfacher sein?
- In 1,5 Wochen wurde das Ziel eines lokalen/offline Musik-Players erreicht
- In der Praxis gibt es jedoch sogar bei der Verteilung der App selbst Einschränkungen: Ohne Entwicklerzertifikat ist sie nach 7 Tagen nicht mehr nutzbar, außerdem ist eine jährliche Entwicklerregistrierung für 99 US-Dollar nötig
- Auch nach dem EU DMA Act ist Sideloading nicht vollständig geöffnet, und für Einzelentwickler und Hobbyentwickler bestehen weiterhin Hürden
- Auch PWAs sind unter iOS eingeschränkt, etwa durch fehlende Unterstützung wichtiger APIs (Web Bluetooth/USB/NFC, Background Sync usw.)
- AI hat zwar die Entwicklungshürden gesenkt, aber gerade iOS hält sie durch künstliche Vorgaben hoch
- Einschränkungen für unabhängige Entwickler und Nutzerrechte bestehen weiter, und die Geschlossenheit von iOS bleibt ein Hindernis für Innovation
1 Kommentare
Hacker-News-Kommentare
yt-dlpsie auf den Server herunter und man kann sie von dort streamen. Die App merkt sich immer die Wiedergabeposition, sodass ich die Stelle aus dem Auto nahtlos am Arbeitslaptop fortsetzen kann. Auch das Hinzufügen von Mixes aus anderen Quellen wie NTS Radio funktioniert sehr gut.asyncmacht das Schreiben zwar bequemer, aber mit wachsender Größe wird es viel schwieriger, den Codefluss und die Nebenläufigkeit zu überblicken. Wenn Probleme ungelöst bleiben, gibt es aus meiner Sicht Alternativen wie green lightweight threads. Langfristig könnte ein async-basierter Ansatz die Wartungskosten sogar erhöhen.