- Incluso en 2025, sigue habiendo muchas limitaciones para reproducir libremente música MP3 en el iPhone
- La mayoría de las apps de Apple y de terceros son servicios de pago o tienen una experiencia de usuario deficiente
- La app que hice ofrece búsqueda de texto completo, soporte para iCloud y un entorno local-first, entre otras cosas
- Los enfoques multiplataforma como React Native tenían límites por las restricciones del sistema de archivos y problemas de estabilidad
- Con SwiftUI y un diseño basado en SQLite, logré una experiencia de gestión musical independiente y altamente extensible
Resumen general
Para resolver por cuenta propia la molestia de que incluso en 2025 siga siendo difícil reproducir libremente archivos MP3 que el usuario posee en un iPhone, el desarrollador presenta el proceso y el resultado de haber creado su propia app de reproducción musical. Mientras que tanto los servicios musicales de Apple como las apps externas tienen varias restricciones y modelos de pago, la app hecha por él ofrece una experiencia optimizada para gestionar y reproducir archivos musicales del usuario.
Por qué decidió crear su propio reproductor de música
- Las funciones de sincronización basadas en la nube, como Apple Music e iCloud Music Library, solo funcionan si se paga una suscripción
- Si se cancela la suscripción, se bloquea por completo la sincronización automática y el acceso a la carpeta de música
- Se hizo evidente la falta de derechos reales del propietario sobre la integración de la biblioteca musical existente y el uso general del dispositivo
- Quería materializar la autodeterminación de que “si compraste un smartphone, también puedes crear por ti mismo las funciones que realmente necesitas”
Análisis de las soluciones de reproducción musical de Apple y terceros
App predeterminada de Apple
- Es posible reproducir archivos de música desde una carpeta de iCloud usando la app Files, pero funciones básicas como gestión de playlists, ordenamiento por metadatos y manipulación de la cola son deficientes
- Ofrece una experiencia de usuario no optimizada para escuchar música
Apps de terceros
- En la App Store hay muchas apps externas, pero abundan los modelos de cobro por suscripción y el nivel funcional varía mucho entre apps
- También existen apps de pago único como Doppler, pero la experiencia de búsqueda e importación en carpetas grandes de iCloud no resulta fluida
El recorrido técnico hacia el “modo builder”
- Decidió que tenía que crear directamente su propia app de reproducción musical
- Funciones requeridas: búsqueda rápida de texto completo sobre carpetas completas de iCloud, además de funciones de gestión musical al nivel de una app oficial de música (cola, playlists, ordenamiento, etc.) y una interfaz intuitiva
Primer intento con React Native
- Debido a incomodidades previas con Swift (por ejemplo, antes no soportaba async/await), prefería React Native/Expo
- Aunque la implementación de la UI fue razonable usando plantillas open source, encontró crashes y límites funcionales al manejar el acceso y la sincronización del sistema de archivos (carpetas de iCloud)
- Al darse cuenta de que, por la política de sandbox de iOS, no era posible acceder a carpetas externas sin permisos explícitos, cambió a Swift
Por qué eligió SwiftUI
- Aprovechó el paradigma declarativo de UI de SwiftUI, así como el soporte moderno de async/await y Swift Actor
- Mediante una separación estricta entre UI y lógica de datos, implementó un flujo de datos limpio y manejo de concurrencia en el dominio
- También ayudó a optimizar el uso de LLM (OpenAI o1, DeepSeek, etc.), contribuyendo a minimizar dependencias en el código de UI generado
Arquitectura de la app y modelo de datos
-
Usa SQLite como almacén de datos y lo eligió en lugar de CoreData porque permite usar directamente búsqueda de texto completo (FTS5)
-
Los 3 principales pantallas/modos de la app:
- Importación de biblioteca: guarda en lote en la DB las rutas de archivos de audio por carpeta de iCloud, para permitir búsqueda y gestión flexibles
- Gestión de biblioteca: playlists, clasificación de canciones, edición, etc.
- Reproducción musical: gestión de cola (repetir, shuffle, etc.) y controles básicos de canciones
-
Flujo del usuario al importar la biblioteca:
- Desde un estado inicial vacío, selecciona una carpeta y escanea el árbol mediante "Add iCloud Source"
- Cuando termina la indexación, pasa a la pestaña de biblioteca, donde hay listas por palabra clave y un mini reproductor
- Si se agregan nuevas canciones, se fusionan automáticamente en segundo plano
Capa lógica estilo backend
- Basándose en su experiencia desarrollando startups web/cloud, separó rigurosamente la capa lógica de la UI/ViewModel
- La capa de dominio (Swift actors) contiene la lógica principal de negocio (importación, búsqueda, cola, etc.) y asegura la seguridad de hilos
- Las actualizaciones de UI se dividen limpiamente a través del ViewModel, mejorando el mantenimiento al minimizar dependencias entre sincronización de archivos, reproducción y UI
Implementación de búsqueda de texto completo con SQLite
- Desde iOS 11 en adelante se puede usar SQLite con soporte FTS5 sin configuración adicional
- Ofrece búsqueda rápida sin necesidad de índices o servidores externos
- Usa la librería SQLite.swift para consultas generales y sentencias SQL directas para consultas FTS
Estructura de tablas FTS
songs_fts: indexa artist, title, album, albumArtist, etc. de las cancionessource_paths_fts: indexa rutas de archivos y nombres de archivo- Existen en paralelo con las tablas principales y en la UI se usan solo para búsqueda (READ)
- La actualización de índices se maneja con transacciones de DB para mantener la consistencia de los datos
Búsqueda difusa y ranking
- Agrega automáticamente un wildcard al final de la entrada y ordena por relevancia basada en BM25
- En conjunto, se logra una estructura de datos predecible sin dependencia de red y un potente entorno de búsqueda local
Uso del sistema de archivos de iOS y Bookmarks
- A diferencia de macOS, iOS no soporta security-scoped bookmarks, por lo que carece de persistencia sólida para ampliar el acceso a archivos externos
- Como solo se guarda la información de la ruta, cuando se vuelve a acceder el usuario debe aprobar otra vez el permiso
- Solución: en el momento en que se concede acceso, guardar una copia del archivo dentro del sandbox de la app
- La copia automática en segundo plano mejora la velocidad de indexación de archivos
- Incluso después de reiniciar el dispositivo sigue siendo difícil reproducir directamente archivos externos, lo que muestra lo severas que son las restricciones de acceso a archivos en iOS
Reproducción con AVFoundation y diseño de interfaz
- Usa el framework AVFoundation y AVURLAsset para analizar metadatos de archivos de audio
- Algunos campos, como el número de pista, se parsean manualmente usando etiquetas ID3
- Para la reproducción de audio usa AVAudioPlayer, e implementa MPRemoteCommandCenter y protocolos Delegate para integrarse con el Centro de control
Reflexiones tras el desarrollo y sobre las políticas de Apple
Aspectos incómodos
- Entorno restrictivo de Xcode: aunque las vistas previas en tiempo real de SwiftUI han mejorado, no alcanzan la comodidad de VSCode o Flutter
- Poca flexibilidad del editor: para usar Swift LSP en Neovim o VSCode se necesita configuración adicional y el acabado sigue siendo limitado
- Algunas zonas del SDK siguen centradas en Objective-C: faltan APIs modernas realmente amigables con Swift para tareas como búsqueda de metadatos
- Depurar la integración con iCloud es engorroso: en las vistas previas de SwiftUI no se pueden implementar completamente las funciones cloud y hay que armar mocks manualmente
Aspectos positivos
- Con async/await, escribir código de concurrencia orientado a I/O se volvió notablemente más fácil
- Ricas librerías nativas: permite desarrollar funciones más variadas al salir de las limitaciones de los bindings open source
- Diseño declarativo de UI en SwiftUI: se perciben tanto las fortalezas del enfoque tipo React como una alta productividad
Conclusión: ¿no debería ser más fácil desarrollar?
- En 1.5 semanas logró el objetivo de un reproductor de música local/offline
- En la práctica, incluso la distribución de la propia app tiene restricciones: sin certificado de desarrollador deja de funcionar a los 7 días, y se requiere el registro anual de desarrollador de $99
- Incluso después de la EU DMA Act, el sideloading no está completamente abierto, y las restricciones siguen para desarrolladores individuales o de hobby
- Las PWA también siguen limitadas en iOS por la falta de soporte de APIs importantes (Web Bluetooth/USB/NFC, Background Sync, etc.)
- Aunque la IA ha bajado la barrera de desarrollo, iOS mantiene una barrera de entrada alta por regulaciones artificiales
- Las limitaciones a los desarrolladores independientes y a los derechos del usuario siguen presentes, y el carácter cerrado de iOS continúa siendo un obstáculo para la innovación
1 comentarios
Comentarios de Hacker News