- Swift 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| Onvaig | ||
| Onvaig.xcodeproj | ||
| OnvaigTests | ||
| OnvaigUITests | ||
| LICENSE | ||
| README.md | ||
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.
- Només iPhone (no iPad).
- Target mínima: iOS 26.4.
- Suport complet de CarPlay, incloent-hi el mapa del quadre d'instruments.
- Llicència AGPL-3.0. Codi font: https://codeberg.org/spla/onvaig
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.Loggeri a un fitxer aDocuments/onvaig-registre.logque 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-mapsaprovat per Apple.
Execució del projecte
No hi ha cap .xcworkspace ni cap gestor de dependències: tot és Cocoa.
- Obre
Onvaig.xcodeprojamb Xcode. - Selecciona el target
Onvaig. - Revisa
Signing & Capabilities(TeamiBundle Identifier). - 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)
- Incrementa el
Build Number(CURRENT_PROJECT_VERSION) en un commit propi. - Fes
Product > Archive. - Puja el build a App Store Connect.
- 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
UserDefaultsdel telèfon. - El target declara
ITSAppUsesNonExemptEncryption = falseper 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).