iOS
Meratyn se ejecuta como una aplicación nativa de iOS construida desde la misma base de código React mediante Tauri v2 mobile, sin una app separada. La interfaz del webview (WKWebView) va incluida en la app, de modo que el shell funciona sin conexión; los mosaicos del mapa y los motores más pesados se descargan a demanda (igual que en las builds de escritorio y Android).
Estado: andamiaje. La configuración de iOS, el plist de privacidad y el flujo de CI de build/firma están en su lugar, pero aún no se ha publicado ninguna build de iOS. Las builds locales siguen requiriendo un Mac, porque iOS no puede compilarse de forma cruzada desde Linux.
Qué funciona en iOS frente al escritorio
La misma división que en Android. La build de iOS incluye el espacio de trabajo completo del mapa, Add Data, las herramientas vectoriales (Turf.js / GeoPandas en el navegador vía Pyodide), el SQL Workspace (DuckDB-WASM y PGlite/PostGIS), la Python Console (Pyodide), la geocodificación, las estadísticas, el asistente de IA, los story maps y los plugins.
iOS no tiene sidecar Python ni binarios auxiliares locales y su sandbox prohíbe
lanzar subprocesos. El procesamiento compatible con el navegador se ejecuta en
el dispositivo cuando la operación y el formato de entrada lo permiten:
Whitebox y las herramientas ráster usan sus motores WASM, y los formatos de
conversión compatibles con el navegador siguen disponibles. Las herramientas
exclusivas del sidecar, las rutas a archivos nativos y la fuente
PostgreSQL/Martin local permanecen ocultas en móvil. Estos límites se controlan
mediante isMobile() del user-agent (que ya reconoce iPhone/iPad) para que una
ruta no disponible no aparezca y falle después.
Permiso de ubicación (obligatorio)
Este es el único punto donde iOS difiere radicalmente de Android. El plugin de geolocalización de Android declara el permiso en tiempo de ejecución y el sistema operativo muestra un diálogo genérico; iOS termina la app en el instante en que solicita la ubicación si no hay una cadena de descripción de uso. Meratyn la aporta en
src-tauri/Info.ios.plist:
<key>NSLocationWhenInUseUsageDescription</key>
<string>Meratyn uses your location to center the map, capture GPS points during Field Collection, and record GPS tracks.</string>
Tauri fusiona Info.ios.plist en el
gen/apple/mappview_iOS/Info.plist generado durante la build. gen/apple está ignorado por git, así que este archivo es el hogar duradero de la cadena — la misma razón por la que los permisos del manifest de Android provienen del plugin y no de un manifest editado a mano y regenerado. Cubre a los tres consumidores de ubicación: Field Collection, GPS Tracking y el control de mapa Controls → GeoLocate. Tras una build, confirme que la clave sobrevivió a la fusión (véase Build más abajo).
Preparación del toolchain (una sola vez)
Necesita un Mac con Xcode (de la App Store; ábralo una vez para aceptar la licencia e instalar la plataforma iOS), las herramientas de línea de comandos, CocoaPods y los targets de Rust para iOS.
xcode-select --install # command-line tools (if not already)
sudo xcodebuild -license accept
brew install cocoapods # or `gem install cocoapods`
# Rust device + simulator targets (install rustup first if needed)
rustup target add aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-ios
aarch64-apple-ios es para dispositivos reales y archivos .ipa de release firmados;
aarch64-apple-ios-sim es el simulador en Macs con Apple Silicon.
Build
cd apps/mappview
bunx --no-install tauri ios init # generate src-tauri/gen/apple (once)
bunx --no-install tauri ios dev # run in the simulator / on a tethered device
bunx --no-install tauri ios build # release archive → signed .ipa (needs signing, below)
-
gen/applese genera (ignorado por git) y se regenera a demanda.inittambién aplicatauri.ios.conf.json(id de bundle, excluye el backend Python).Info.ios.plistse fusiona después contauri ios buildotauri ios dev. -
La app se llama Meratyn en iOS (la build de escritorio se llama “Meratyn Desktop”) y usa el id de bundle
com.mapptech.mappview; ambos se definen ensrc-tauri/tauri.ios.conf.json— el mismo patrón de sobreescritura y razonamiento que en Android (identifierentauri.conf.jsonsigue siendocom.mapptech.mappviewpara que las actualizaciones de escritorio sigan usando los espacios de nombres de datos y configuración existentes). -
El destino de despliegue duradero de iOS es iOS 15.0, configurado como
bundle.iOS.minimumSystemVersionentauri.ios.conf.json. El flujo de CI comprueba que Tauri lo traslada tanto al proyecto Xcode generado como a un IPA firmado antes de permitir una carga. -
Verifique que la cadena de ubicación quedó tras una build:
/usr/libexec/PlistBuddy -c 'Print :NSLocationWhenInUseUsageDescription' \ src-tauri/gen/apple/mappview_iOS/Info.plist
Firma
Toda build que se ejecute en un dispositivo real debe firmarse — no existe el atajo del keystore debug como en Android. Necesita:
- Una membresía del Apple Developer Program (99 USD/año).
- Un certificado de firma (Apple Development para pruebas en dispositivo; el certificado de distribución, cuando esté disponible, para builds de distribución),
exportado del llavero como
.p12. - Un provisioning profile para el id de app
com.mapptech.mappview. - Su Team ID (portal de desarrollador → Membership details).
Abrir gen/apple/mappview.xcodeproj en Xcode y activar “Automatically
manage signing” con el equipo Meratyn es la vía local más simple.
El workflow de GitHub Actions iOS también se ejecuta en releases o manualmente. Sin los secretos de firma realiza una comprobación real de compilación Rust para dispositivo. Con el conjunto completo de secretos crea un archivo sin firmar, estampa un número de build único,
lo exporta bajo firma manual explícita, verifica el identificador de bundle/firma/plist enviados,
y sube el .ipa:
APPLE_IOS_CERTIFICATE_BASE64— Apple Distribution.p12, codificado en base64APPLE_IOS_CERTIFICATE_PASSWORDAPPLE_IOS_PROVISIONING_PROFILE_BASE64— perfil gestionado manualmente paracom.mapptech.mappview, codificado en base64APPLE_TEAM_ID
Los secretos del certificado de iOS son deliberadamente independientes de las credenciales Developer ID de macOS; esos tipos de certificado no son intercambiables.
Instalación / prueba
- Simulador: ejecute
bunx --no-install tauri ios devy elija un simulador, o abra el proyecto de Xcode y pulse Run. No se necesita cuenta de pago para el simulador. - Su propio dispositivo: conéctelo por cable, abra
gen/apple/mappview.xcodeprojen Xcode, seleccione el dispositivo y pulse Run (un Apple ID gratuito permite firmar en dispositivo durante 7 días). - Testers: entrégueles el
.ipafirmado para instalarlo lateralmente vía Xcode (ventana Devices & Simulators), Finder o Apple Configurator; o bien pueden abrir ellos mismosgen/apple/mappview.xcodeprojen Xcode y pulsar Run en su propio dispositivo.
Limitaciones conocidas / pendientes
La mayoría reflejan Android:
- Las fuentes de archivos locales (MBTiles, rásters locales, archivos de proyecto) asumen rutas reales del sistema de archivos; iOS entrega URLs acotadas por sandbox a través del selector de documentos, así que esos flujos necesitan adaptarse antes de funcionar de forma nativa.
- La herramienta Download Offline Area depende de un service worker, que las builds de Tauri no usan — es una función de PWA. El caché de mapas base sin conexión nativo es trabajo futuro.
- El OAuth de Earth Engine usa un flujo de escritorio de loopback/multi-ventana; una redirección móvil mediante deep-link (un esquema de URL de iOS / universal link) es trabajo futuro.
- La multitarea de iPadOS (Split View / Stage Manager) no se ha ajustado; el diseño responsive debería adaptarse, pero verifíquelo en un iPad real antes del lanzamiento.