Saltar al contenido
Volver al blog

7 min de lectura

Exportador: las fotos del iPhone al Mac, originales y verificadas

Una app gratuita para Mac que copia las fotos y videos del iPhone por cable directo a una carpeta, sin la app Fotos ni iCloud: originales byte a byte y cada archivo verificado antes de darlo por listo.

  • Tauri
  • Rust
  • macOS
  • ImageCaptureCore
  • BLAKE3
Read it in EnglishDescargar historia

Link copiado: en Instagram, pégalo con el sticker «Enlace».

Portada de Exportador: un iPhone con su grilla de fotos, algunas seleccionadas, que vuelan en arco hacia una carpeta con un visto bueno de verificación BLAKE3.

El problema

Respaldar las fotos del iPhone en un Mac debería ser lo más simple del mundo, pero cada vez me costaba más de lo debido. El camino que ofrece macOS es la app Fotos: la abres, creas una fototeca e importas, y todo queda guardado dentro de ella. Si lo que quieres son los archivos en una carpeta propia, en un disco externo o junto a tus otros respaldos, tienes que exportarlos otra vez desde Fotos. Y más de una vez esa exportación ni siquiera empezó: sin error, sin aviso.

La otra salida es iCloud, que casi siempre obliga a pagar almacenamiento, depende de la conexión y, con «Optimizar almacenamiento», deja en el teléfono solo versiones reducidas de muchas fotos. Yo no quería otra fototeca ni otra suscripción: quería los archivos originales del iPhone en una carpeta, con la certeza de que llegaron completos.

De ahí nació Exportador, una app de escritorio para Mac que hace una sola cosa: lee el iPhone conectado por cable, muestra sus fotos y videos y copia los que elijas, en su versión original y byte a byte, a la carpeta que quieras.

Un iPhone con su fototeca rodeado de fotos, y el botón azul de exportar

La portada del reel promocional de Exportador.

Los principios

Antes de escribir código redacté un PRD con requisitos medibles. Seis principios guiaron cada decisión:

  • Originales siempre. Nunca se convierte, recomprime ni toca un metadato.
  • Solo cable. No usa iCloud ni la fototeca del Mac.
  • Solo lectura. La app jamás borra ni modifica nada en el iPhone.
  • Tres pasos. Conectar, elegir y exportar; nada más en la pantalla.
  • Minimalista. Una interfaz monocromática donde las fotos son las protagonistas.
  • Local y privada. Las fotos nunca pasan por la red.

Conectar, elegir, exportar

Conectar. Enchufas el cable, desbloqueas el iPhone y tocas «Confiar». No hay botones intermedios: la fototeca aparece sola y las primeras miniaturas llegan en 1,1 segundos. Mientras tanto, un iPhone 3D muestra en su propia pantalla lo que falta hacer: enchufar, desbloquear o confiar.

Elegir. Las fotos se agrupan por día con encabezados fijos, como en Fotos. Se elige con clic, rangos con ⇧, sumas con ⌘, un día completo, todo con ⌘A o con un lazo arrastrando el mouse. La barra espaciadora abre la vista previa, y los videos se reproducen directo desde el iPhone, HEVC incluido, sin copiarlos antes.

Exportar. Eliges la carpeta una vez y Exportador la recuerda. Puedes dejar todo junto o separarlo en carpetas por año y mes. Mientras copia, un círculo de progreso se llena en la barra de menús; si estás en otra app, una notificación avisa cuando termina. Lo que ya exportaste queda marcado en la grilla y no se vuelve a copiar.

Sale exactamente lo que tomaste

La primera sorpresa vino del propio macOS: ImageCaptureCore, el framework de Apple para leer cámaras y teléfonos, entrega por omisión versiones convertidas a JPEG y H.264. Sin pedirle explícitamente los recursos originales (mediaPresentation = OriginalAssets), el principio de «originales siempre» no se habría cumplido.

Con eso resuelto, Exportador copia HEIC, DNG ProRAW, JPG, PNG, MOV y MP4 tal como están en el teléfono, con su EXIF, su ubicación GPS y su fecha de captura intactos. Además:

  • Live Photos: la foto y su video salen con el mismo nombre base, por ejemplo IMG_4821.HEIC e IMG_4821.MOV.
  • Editadas: siempre el original; si quieres, también la versión editada (IMG_E…) y su archivo de ajustes .AAE.
  • Sin duplicados: si un archivo idéntico ya está en la carpeta, se omite. Si el nombre choca pero el contenido es otro, recibe el sufijo -1, compartido por toda la Live Photo.
  • Orden en el Finder: la fecha de captura pasa a ser la fecha de modificación del archivo, así la carpeta se ordena sola.

Ningún archivo a medias

La integridad manda sobre la velocidad. Cada copia pasa por seis pasos antes de recibir su nombre final:

  1. Se escribe con un nombre temporal, IMG_4821.HEIC.part.
  2. Se fuerza al disco con fsync.
  3. Se vuelve a leer desde el disco y no desde la memoria (F_NOCACHE), para comprobar lo que realmente quedó escrito.
  4. Su hash BLAKE3 y su tamaño deben coincidir con lo que entregó el iPhone.
  5. La fecha de captura pasa a ser la fecha de modificación.
  6. Un renombre atómico (renamex_np con RENAME_EXCL) le da su nombre final sin pisar nunca otro archivo.

Si se corta el cable, cierras la app o cancelas, en la carpeta quedan solo archivos completos y verificados; si fue el cable, al reconectar la app ofrece terminar lo que faltó. Antes de empezar compara el peso de la selección con el espacio libre, y avisa si un video de más de 4 GB no cabe en un disco FAT32.

La prueba decisiva fue con un iPhone real: 30 de 30 archivos, de todos los tipos, quedaron idénticos byte a byte a la descarga de Captura de Imagen, la app de Apple. Y para confirmar que la verificación no es decorativa, las pruebas incluyen mutaciones: si se desactiva, la prueba de corrupción en disco falla.

Solo lectura y privada

Exportador no puede borrar ni modificar nada en el iPhone, y no es una promesa: una prueba automática revisa que el código no use ninguna función de borrado, subida o escritura en el dispositivo.

Las fotos, los videos, las miniaturas y los nombres de archivo nunca pasan por la red. La ventana no puede cargar nada de afuera (su política de seguridad no permite orígenes externos) y la única conexión es la cuenta: se ingresa con el correo y un código, sin contraseña, a través de Rust y solo hacia el servicio de cuentas. Ahí se guardan totales de uso que ayudan a mejorar la app (cuánto se exporta, la velocidad, los errores), que se pueden desactivar y nunca incluyen fotos, nombres, ubicaciones ni carpetas.

Veinte mil fotos, sin tirones

Una fototeca de verdad tiene miles de elementos, así que la app se probó con un iPhone real de 4 239 elementos (125 GB) y con uno simulado de 20 000:

  • Grilla virtualizada: solo existen en pantalla las ~54 celdas visibles. Recorrer 20 000 elementos se mantiene a 60 fps.
  • Miniaturas por lotes según lo visible, con caché en disco por dispositivo. Se dibujan en <canvas> y se liberan al salir de la vista: con <img>, WebKit retenía las imágenes decodificadas y la memoria pasaba de 800 MB.
  • Copia en paralelo: por USB 2, el iPhone entrega unos 20 MB/s con una lectura a la vez y 28–31 MB/s con dos, así que la app mantiene dos lecturas en vuelo.
  • Videos al instante: el visor pide el video por rangos y el núcleo en Rust lee del iPhone en bloques de 2 MiB, con caché y lectura anticipada. Lee de inmediato el final del archivo, porque los MOV del iPhone guardan ahí su índice. El video empieza en unos 0,45 segundos.

Los detalles

Una herramienta de una sola tarea se juzga por cómo se siente. Algunos detalles que me tomé en serio:

  • La ventana abre con las medidas de la pantalla del iPhone más grande y se amplía con la misma animación que el zoom nativo de macOS.
  • Avisos con forma de Dynamic Island y una barra superior con desenfoque progresivo, como en Fotos de iOS.
  • Sonidos de interfaz sintetizados en el momento con Web Audio, sin archivos, que respetan el ajuste de efectos de sonido de macOS.
  • Todo se opera con el teclado, con tema claro y oscuro según el sistema.
  • En español y en inglés, y el idioma cambia en el acto, sin reiniciar.

Lo que aprendí

  • Un PRD con criterios medibles cambia todo. Cada requisito tenía su criterio de aceptación y al final quedó un documento de verificación, requisito por requisito, con la evidencia: la medición, la prueba o el caso real. Lo construí con Claude Code como copiloto, y esa disciplina de especificar y verificar fue lo que más rindió.
  • Las APIs del sistema tienen esquinas oscuras. ImageCaptureCore a veces no avisa que el iPhone se desbloqueó, y la app quedaba esperando con el teléfono abierto en la mano. La solución fue reabrir la sesión de forma periódica mientras siga bloqueado, sin hacerlo si falta aceptar «Confiar» ni durante una exportación.
  • Los errores raros hay que reproducirlos, no adivinarlos. Un cierre inesperado con scroll rápido resultó ser una carrera dentro de wry, la capa de WebView de Tauri, al responder miniaturas fuera del hilo principal. Recién al reproducirlo con símbolos se pudo corregir, y después resistió siete minutos de estrés.

Disponibilidad

Exportador es gratis y se sostiene con donaciones. Funciona en macOS 13.3 o superior, con Apple Silicon o Intel. Por ahora es solo para Mac; la versión para Windows queda pendiente.

Para descargarlo, entra a la página de Exportador: ahí está siempre la última versión, con las instrucciones para instalarla.

La landing de Exportador: «Tus fotos del iPhone, byte a byte», con un iPhone 3D rodeado de sus fotos

La landing, hecha en Astro, con el iPhone 3D en three.js.

Stack

  • App: Tauri 2, Rust (tokio, objc2 con ImageCaptureCore, BLAKE3, SQLite), React 19, TypeScript, Tailwind CSS 4, shadcn/ui, TanStack Virtual, three.js
  • Cuenta: Clerk, con las peticiones desde Rust
  • Landing: Astro, three.js, Firebase Hosting
  • Pruebas: 57 pruebas en Rust, Vitest y un arnés que opera la app compilada con un iPhone simulado de 20 000 elementos

Más información y descarga en exportador-beta.web.app.