Manual/Referencia

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/apple se genera (ignorado por git) y se regenera a demanda. init también aplica tauri.ios.conf.json (id de bundle, excluye el backend Python). Info.ios.plist se fusiona después con tauri ios build o tauri 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 en src-tauri/tauri.ios.conf.json — el mismo patrón de sobreescritura y razonamiento que en Android (identifier en tauri.conf.json sigue siendo com.mapptech.mappview para 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.minimumSystemVersion en tauri.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:

  1. Una membresía del Apple Developer Program (99 USD/año).
  2. 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.
  3. Un provisioning profile para el id de app com.mapptech.mappview.
  4. 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 base64
  • APPLE_IOS_CERTIFICATE_PASSWORD
  • APPLE_IOS_PROVISIONING_PROFILE_BASE64 — perfil gestionado manualmente para com.mapptech.mappview, codificado en base64
  • APPLE_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 dev y 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.xcodeproj en Xcode, seleccione el dispositivo y pulse Run (un Apple ID gratuito permite firmar en dispositivo durante 7 días).
  • Testers: entrégueles el .ipa firmado para instalarlo lateralmente vía Xcode (ventana Devices & Simulators), Finder o Apple Configurator; o bien pueden abrir ellos mismos gen/apple/mappview.xcodeproj en 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.