Navegació GPS en català
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-11 23:46:30 +02:00
Onvaig L'app declara el català com a idioma 2026-10-11 23:46:30 +02:00
Onvaig.xcodeproj L'app declara el català com a idioma 2026-10-11 23:46:30 +02:00
OnvaigTests CarPlay navegant s'assembla a l'Apple Maps 2026-10-10 18:05:19 +02:00
OnvaigUITests Capçalera de copyright AGPL-3.0 a tots els fitxers de codi 2026-08-04 15:18:38 +02:00
LICENSE Afegeix la llicència AGPL-3.0 2026-08-04 15:15:15 +02:00
README.md Actualitza el README 2026-09-17 14:48:11 +02:00

On vaig

Onvaig és una aplicació de navegació GPS per a iPhone, íntegrament en català: la interfície, les indicacions per veu i el codi. Construïda amb SwiftUI i MapKit, sense cap dependència externa.

Funcionalitats

Cerca i destinacions

  • Cerca de destinacions per text amb autocompletat (MKLocalSearchCompleter).
  • Cerca de categories a prop (restaurants, cafès, benzineres, botigues, hotels, farmàcies, policia, cinemes, museus, taxi, tren, bus, metro), centrada a la ubicació actual o al centre del mapa si el mapa s'ha desplaçat.
  • Selecció manual del punt al mapa quan la cerca en retorna diversos.
  • Detalls del lloc: adreça, telèfon, web i distància.
  • Previsualització Look Around quan està disponible.
  • Favorits i destinacions recents, totes dues amb coordenada desada.
  • Domicili («Casa»): l'adreça es valida i se'n desa la coordenada, perquè anar a casa des del cotxe no depengui de la cobertura.
  • Parada intermèdia: la ruta es calcula en dos trams (origen → parada → destí).
  • Benzinera més propera de la xarxa preferida, amb un toc des del mòbil i des de CarPlay. Si no n'hi ha cap a prop, t'hi porta la més propera de qualsevol marca; amb un vehicle elèctric configurat, busca punts de recàrrega.

Rutes i navegació

  • Tipus de transport: cotxe, a peu, bici i públic. Per al públic, MapKit només dona l'estimació de temps (Apple no exposa l'itinerari a apps de tercers), així que l'app en mostra l'ETA i ofereix obrir l'itinerari a Mapes.
  • Preferència de ruta: més ràpida o més curta.
  • Navegació pas a pas amb distància fins al gir següent, distància restant i hora d'arribada.
  • Indicacions per veu en català, amb tria de la veu instal·lada al sistema (Núria/Montse, per qualitat: compacta, millorada, premium). Avís llunyà i avís de gir. El text es prepara abans de dir-lo: els codis de carretera es diuen com els diu un humà («C-35» → «ce 35», «AP-7» → «a pe 7») i no com els llegeix el sintetitzador («menys 35»), i les abreviatures de les direccions no es lletregen («Les Franqueses del V.»).
  • Nom de la via per on es circula durant la navegació a CarPlay («Carrer de Joan Prim», «C-35»), tret de la ruta ja calculada i no de cap petició de xarxa: funciona dins dels túnels i sense cobertura.
  • Anunci de la comarca en creuar-ne el límit («el Baix Empordà»), resolt localment amb un test de punt-dins-de-polígon sobre Comarques.geojson: sense xarxa, precisió de metres i funciona dins els túnels. Es pot desactivar.
  • Avisos de radars de velocitat propers a la ruta.
  • Recàlcul automàtic en desviar-se.
  • Carburant estimat: amb el vehicle configurat (carburant, consum i preu), la previsualització del viatge i la navegació a CarPlay mostren els litres —o kWh— i els euros que queden per gastar fins a la destinació.

Mapa

  • Modes normal, satèl·lit i trànsit, amb relleu realista.
  • Vista 2D/3D i brúixola per tornar al nord.
  • Altitud sobre el nivell del mar mesurada amb el baròmetre de l'iPhone (CMAltimeter), no amb el GPS.
  • Meteorologia i qualitat de l'aire al destí (API gratuïta d'Open-Meteo).
  • Compartir la ubicació actual.
  • Peu del mapa reduït a dues icones (cerca i configuració) perquè es vegi tot el mapa.

CarPlay

Implementació completa amb CPMapTemplate com a arrel:

  • Llista On vas? amb cerca d'adreça, «🏠 Casa», «⛽️ Benzinera» i destinacions recents.
  • Previsualització del viatge i sessió de navegació amb maniobres.
  • Seguiment d'ubicació propi i càmera manual amb tres règims (ciutat, interurbà, via ràpida) segons la velocitat màxima del tram, amb histèresi asimètrica.
  • Brúixola pròpia en català amb els 8 punts cardinals.
  • Etiqueta amb el nom del carrer o la carretera actual mentre es navega, sota la de la comarca i l'altitud.
  • Etiqueta del carburant que queda per gastar durant la navegació (i, a l'iOS 27, dins del rètol d'estimacions del sistema amb CPRouteDetail).
  • Botons de mapa: veu de la comarca, vista general de la ruta, 2D/3D i recentrar.
  • Mapa al quadre d'instruments (ClusterCarPlaySceneDelegate), la pantalla petita darrere el volant, alimentat des del mateix estat de navegació.

Eines de desenvolupament

  • Simulador de navegació (☰ → Simular la navegació): recorre la polilínia de la ruta activa publicant fixos falsos cada 10 m, amb velocitat estimada per tram, per veure una navegació sencera al simulador de CarPlay i al mòbil alhora sense conduir. Factor ×1/×2/×5.
  • Registre de diagnòstic (☰ → Diagnòstic): doble sortida a os.Logger i a un fitxer a Documents/onvaig-registre.log que sobreviu entre execucions, llegible al mateix telèfon i exportable per l'app Fitxers. Imprescindible perquè CarPlay es prova al cotxe, on no hi ha cap Mac connectat.

Requisits

  • macOS amb Xcode 27.0 (SDK d'iOS 27.0).
  • Compte Apple Developer per executar en dispositiu físic i distribuir via TestFlight.
  • Per a CarPlay, l'entitlement com.apple.developer.carplay-maps aprovat per Apple.

Execució del projecte

No hi ha cap .xcworkspace ni cap gestor de dependències: tot és Cocoa.

  1. Obre Onvaig.xcodeproj amb Xcode.
  2. Selecciona el target Onvaig.
  3. Revisa Signing & Capabilities (Team i Bundle Identifier).
  4. Executa amb Run (Cmd + R) en simulador o dispositiu.

Al simulador cal fixar una ubicació (Features → Location, o simctl location <udid> set <lat>,<lon>): sense ella CLLocationManager falla i el mapa es queda amb mida 0.

La interfície de CarPlay es pot provar des del CarPlay Simulator del Device Hub (DeviceHub.app, plugin com.apple.CarPlaySimulator). Cal un iPhone físic connectat per cable: amb un simulador d'iPhone no funciona, i si el telèfon està connectat per xarxa l'entrada del menú no apareix (es comprova amb xcrun devicectl list devices --json-output <fitxer>, on connectionProperties.transportType ha de dir wired).

Estructura del projecte

onvaig/
├── Onvaig.xcodeproj/
├── Onvaig/
│   ├── OnvaigApp.swift                   # @main
│   ├── ContentView.swift                 # UI principal, cerca, rutes, navegació, veu, comarca
│   ├── CarPlaySceneDelegate.swift        # CarPlay (pantalla central) + EstatCarPlay
│   ├── CarPlayClusterSceneDelegate.swift # CarPlay (quadre d'instruments)
│   ├── SimuladorNavegacio.swift          # Fixos falsos sobre la ruta
│   ├── CadenciaFixos.swift               # Mesura el ritme dels fixos per animar la càmera
│   ├── Registre.swift                    # Registre de diagnòstic + VistaDiagnostic
│   ├── AppDelegate.swift
│   ├── SceneDelegate.swift
│   ├── Comarques.geojson                 # Límits oficials de les 43 comarques (WGS84)
│   ├── Info.plist
│   ├── Onvaig.entitlements
│   ├── Assets.xcassets/
│   └── onvaig.icon
├── OnvaigTests/                          # Swift Testing
└── OnvaigUITests/                        # XCTest

Les decisions de disseny, els bugs trobats conduint amb la seva causa i les limitacions de MapKit i CarPlay ja verificades (guia de carrils, itineraris de transport públic, velocitats per tram, nom de la via) van als missatges de commit: git log és la memòria del projecte, i val la pena mirar-la abans de tocar aquestes parts.

Distribució (TestFlight)

  1. Incrementa el Build Number (CURRENT_PROJECT_VERSION) en un commit propi.
  2. Fes Product > Archive.
  3. Puja el build a App Store Connect.
  4. Completa la informació de TestFlight (What to Test) i envia a revisió beta.

Per a CarPlay en producció cal, a més: aprovació de l'entitlement per part d'Apple, activació de la capability a l'App ID, i regeneració dels provisioning profiles.

Privadesa i dades

  • Les comarques es resolen al dispositiu, sense cap petició de xarxa ni geocodificador.
  • L'única API externa és Open-Meteo (gratuïta, sense clau), per a la meteorologia i la qualitat de l'aire al destí.
  • La cerca, les rutes i els mapes els serveix MapKit d'Apple.
  • Favorits, recents i domicili es desen només a UserDefaults del telèfon.
  • El target declara ITSAppUsesNonExemptEncryption = false per simplificar l'Export Compliance a App Store Connect.

Estat actual

Projecte en evolució activa. Els fluxos de navegació només es poden validar de debò conduint, i el registre de diagnòstic és el que permet reconstruir després què ha passat: d'allà surten els bugs que s'arreglen i les dades amb què es comproven (les instruccions de maniobra reals, per exemple, són el joc de proves de OnvaigTests/VeuTests.swift).

Llicència

AGPL-3.0