1. Prima di iniziare
Questo codelab ti insegna a creare una semplice app per iOS che utilizza l'SDK di navigazione Google Maps Platform per raggiungere una destinazione preconfigurata.
Questo sarà l'aspetto della tua app al termine dell'operazione.
Prerequisiti
- Conoscenza dello sviluppo di app per iOS di base in Swift.
- Una certa familiarità con i concetti di base dell'SDK di Google Maps, ad esempio la creazione di una mappa centrata su una posizione specifica.
Cosa imparerai a fare
- Come creare una semplice app iOS Swift che utilizza l'SDK Navigation per raggiungere una destinazione.
- Come integrare l'SDK Navigation dal repository Cocoapods remoto.
- Come gestire le autorizzazioni di accesso alla posizione e il contratto per gli utenti con i termini per l'utente finale dell'SDK di navigazione.
- Come inizializzare l'SDK.
- Come impostare una destinazione e avviare le indicazioni stradali.
Che cosa ti serve
- L'ultima versione stabile di Xcode.
- Un Account Google e un progetto con la fatturazione abilitata.
- Un dispositivo iOS o un dispositivo emulato in esecuzione nel simulatore XCode. Qualunque sia la tua scelta, deve soddisfare i requisiti minimi per l'SDK di navigazione.
2. Configurazione
Se non disponi già di un account Google Cloud e di un progetto con la fatturazione abilitata, configura il tuo progetto Google Cloud seguendo le istruzioni su come iniziare a utilizzare Google Maps Platform.
Seleziona un progetto Google Cloud nella console
Nella console Cloud, fai clic sul menu a discesa del progetto e seleziona il progetto che vuoi utilizzare per questo codelab.
Attivare l'SDK Navigation nel progetto
Abilita le API e gli SDK di Google Maps Platform richiesti per questo codelab nel Google Cloud Marketplace.
Vai a API e servizi > Libreria nella console Google Cloud e cerca "Navigation SDK".
Dovresti vedere un risultato di ricerca.
Fai clic su Navigation SDK per aprire la pagina Dettagli prodotto. Fai clic su Abilita per abilitare l'SDK nel progetto.
Ripeti questa procedura per il Google Maps SDK for iOS.
Crea una chiave API
Genera una chiave API nella pagina Credenziali di Cloud Console. Tutte le richieste a Google Maps Platform richiedono una chiave API. Nella pagina Credenziali della console. Fai clic su "+Crea credenziali" nella parte superiore della pagina e seleziona "Chiave API" dalle opzioni.
Per l'uso in produzione, ti consigliamo di impostare una limitazione dell'applicazione per la chiave API, ma questa limitazione è facoltativa per questo codelab.
3. recupera i file di progetto di esempio
Questa sezione descrive come configurare un progetto di app Xcode vuoto di base clonando i file dal repository GitHub per questo codelab. Il repository GitHub contiene le versioni prima e dopo del codice del codelab. Il codelab inizierà con un modello di progetto vuoto e verrà completato. In caso di problemi, puoi utilizzare il progetto finito nel repository come riferimento.
Clonare il repository o scaricare il codice
Vai alla directory in cui vuoi archiviare il codelab.
Quindi clona il repository o scarica il codice:
git clone https://github.com/googlemaps-samples/codelab-navigation-101-ios-swift
Se non hai installato Git, fai clic su questo pulsante per ottenere il codice:
Per aiutarti a iniziare il più rapidamente possibile, il repository contiene un codice di avvio nella cartella Starter
che ti aiuterà a seguire questo codelab. È disponibile anche un progetto Solution
completato nel caso tu voglia proseguire o controllare i tuoi progressi in qualsiasi momento. Per utilizzare il progetto della soluzione dovrai seguire il documento "Installazione con Cocoapods" istruzioni qui sotto, quindi esegui il comando dalla cartella solution/Navigation SDK Codelab
.
Dopo aver clonato il repository in locale, usa XCode per aprire la cartella Starter
come progetto esistente. Verifica che il progetto venga compilato ed eseguito.
Connetti un dispositivo o configura il simulatore XCode
4. Aggiungere l'SDK Navigation all'app
Esistono tre modi per integrare l'SDK Navigation in un progetto Xcode: questo codelab utilizza CocoaPods. Per informazioni dettagliate su come eseguire l'integrazione utilizzando Swift Package Manager o per installare manualmente l'SDK scaricandolo, consulta Creare il progetto Xcode e installare l'SDK Navigation nella documentazione dell'SDK Navigation.
Installazione con Cocoapods
Se non hai già lo strumento CocoaPods, installalo su macOS eseguendo il seguente comando dal terminale. Per maggiori dettagli, consulta la guida introduttiva di CocoaPods.
sudo gem install cocoapods
Crea un nuovo file denominato Podfile nella cartella del progetto, all'interno della cartella Codelab di Navigation SDK/starter (in XCode, File > Nuovo > File > Altro > Vuoto, salva come "Podfile")
Aggiungi i seguenti contenuti a Podfile
:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '15.0' target 'Navigation SDK Codelab' do pod 'GoogleNavigation', '9.1.1' end
Risparmia Podfile
.
Apri un terminale e cambia directory nella posizione in cui hai salvato il Podfile (dovrebbe essere la cartella "starter/Navigation SDK Codelab" nel repository del codelab)
cd "<path-to-starter-project-folder>/Navigation SDK Codelab"
Esegui il comando pod install
. Questa operazione installa le API specificate in Podfile
, insieme alle eventuali dipendenze
pod install
Chiudi Xcode, quindi apri il file .xcworkspace del progetto per avviare Xcode. D'ora in poi, per aprire il progetto dovrai usare il file .xcworkspace.
Verifica che alla struttura del progetto sia stata aggiunta una directory Pods e che contenga i pod "GoogleMaps" e "GoogleNavigation".
Aggiungere la chiave API
Aggiungi la tua chiave API a AppDelegate.swift
come segue:
- Aggiungi le seguenti istruzioni di importazione:
import GoogleMaps import GoogleNavigation
- Aggiungi quanto segue al metodo
application(_:didFinishLaunchingWithOptions:)
:
GMSServices.provideAPIKey("YOUR_API_KEY")
Sostituisci "YOUR_API_KEY" con la chiave API che hai creato nel passaggio precedente.
Compila il progetto e correggi eventuali errori.
5. Configurare le autorizzazioni app
L'SDK di navigazione dipende dai segnali GPS per fornire la posizione esatta e indicazioni passo passo, quindi la tua app dovrà chiedere all'utente di concedere l'accesso ai dati sulla posizione esatta.
A questo scopo, dovrai aggiungere alcune proprietà al file Info.plist delle app in Xcode, aggiungere codice all'app per richiedere l'autorizzazione all'utente in fase di runtime e gestire eventuali errori, come la mancata concessione dell'autorizzazione o la mancata disponibilità della posizione.
Apri Info.plist in Xcode. L'annuncio dovrebbe avere un aspetto simile a questo.
Richiedere l'autorizzazione di accesso alla posizione esatta
Puoi aggiungere nuovi valori passando il puntatore del mouse sopra "Elenco delle proprietà delle informazioni" riga "+" finché non appare un segno "+" . Fai clic sul segno "+" per visualizzare una finestra di dialogo con i nomi delle proprietà suggeriti, ma tieni presente che puoi anche aggiungere le proprietà manualmente.
Aggiungi le proprietà e i valori seguenti a Info.plist:
Proprietà | Valore |
Privacy - Descrizione utilizzo posizione sempre e quando in uso | "Questa app richiede la posizione del dispositivo per poter fornire la navigazione passo passo" |
Privacy - Descrizione dell'utilizzo della posizione in uso | "Questa app richiede la posizione del dispositivo per poter fornire la navigazione passo passo" |
allowsBackgroundLocationUpdates | SÌ |
Richiedere l'autorizzazione di accesso alla posizione in background
Aggiungi le seguenti proprietà e valori a Info.plist:
UIBackgroundModes
> Aggiungi riga > Item 0: App registers for location updates
(seleziona questo valore dall'elenco a discesa dei suggerimenti)
Al termine, il file Info.plist dovrebbe avere il seguente aspetto.
Richiedere l'accesso alla posizione in fase di runtime
Aggiungi le seguenti istruzioni di importazione a ViewController.swift
:
import GoogleNavigation
Aggiungi la seguente dichiarazione alla classe ViewController:
var locationManager: CLLocationManager!
Aggiungi un override del metodo per loadView()
e chiama locationManager.requestAlwaysAuthorization()
:
override func loadView() { locationManager = CLLocationManager() locationManager.requestAlwaysAuthorization()
Ora l'app richiederà la posizione all'utente e la renderà disponibile per la tua app se questo concede l'autorizzazione .
Richiedere l'autorizzazione per mostrare le notifiche
Aggiungi il seguente codice a loadView() per richiedere all'utente l'autorizzazione a mostrare le notifiche, che sarà necessaria per mostrare le istruzioni di navigazione.
UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) { granted, error in // Handle denied authorization to display notifications. if !granted || error != nil { print("User rejected request to display notifications.") } }
Crea ed esegui l'app e controlla che ti venga chiesto di condividere la posizione e attivare le notifiche.
6. Aggiungi un'interfaccia utente di navigazione
In questo passaggio aggiungerai una mappa e la configurerai per mostrare una località. A questo punto, verrà mostrata all'utente una finestra di dialogo con i Termini e condizioni d'uso dell'SDK Navigation.
Aggiungere una visualizzazione mappa all'app
Aggiungi questa riga per dichiarare una variabile GMSMapView in ViewController.
var mapView: GMSMapView!
Aggiungi il seguente codice a loadView()
in Viewcontroller.swift
per inizializzare la mappa.
let camera = GMSCameraPosition.camera(withLatitude: 51.483174, longitude: -0.177369, zoom: 14) let options = GMSMapViewOptions() options.camera = camera options.frame = .zero mapView = GMSMapView(options: options) view = mapView
Se crei ed esegui la tua app, dovresti vedere una mappa centrata nella zona sud-ovest di Londra.
Mostrare la finestra di dialogo dei Termini e condizioni d'uso del prodotto SDK Navigation
Aggiungi il seguente codice a ViewController.swift
nello stesso metodo loadView()
del codice precedente. Verranno mostrati i Termini e condizioni d'uso per l'utente finale dell'SDK per la navigazione. Se non viene accettata, la navigazione non verrà attivata.
// Show the terms and conditions. let companyName = "Navigation SDK Codelab" GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(withCompanyName: companyName) { termsAccepted in if termsAccepted { // Enable navigation if the user accepts the terms. self.mapView.isNavigationEnabled = true // Request authorization for alert notifications which deliver guidance instructions // in the background. } else { // Handle the case when the user rejects the terms and conditions. } }
Crea ed esegui l'app per visualizzare la finestra di dialogo.
7. Aggiungere listener per gli eventi di navigazione chiave
Questo passaggio ti mostra come configurare gli ascoltatori per gli eventi chiave, ad esempio l'arrivo a una destinazione o il cambio di percorso del conducente.
Per ascoltare questi eventi, il tuo controller della visualizzazione deve adottare il protocollo GMSNavigatorListener
.
Aggiungi questo protocollo alla definizione della classe in ViewController.swift
.
class ViewController: UIViewController, GMSNavigatorListener {
Ora aggiungi una riga di codice per configurare il listener in loadView():
// Add a listener for GMSNavigator. mapView.navigator?.add(self)
Infine, aggiungi due metodi al corso per gestire gli eventi generati.
// Listener to handle arrival events. func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSNavigationWaypoint) { print("You have arrived at: \(waypoint.title)") } // Listener for route change events. func navigatorDidChangeRoute(_ navigator: GMSNavigator) { print("The route has changed.") }
8. Impostare una destinazione e avviare le indicazioni stradali
Questa sezione ti insegnerà a impostare una destinazione e ad avviare le indicazioni di navigazione.
Crea una nuova funzione per la logica di navigazione.
Innanzitutto, aggiungi una nuova funzione denominata startNav()
in ViewController
. che conterrà la logica per impostare una destinazione e avviare la navigazione.
// Create a route and start guidance. @objc func startNav() { }
Crea un Waypoint
per la destinazione.
Successivamente, crea un array di destinazioni con un singolo waypoint.
// Create a route and start guidance. @objc func startNav() { var destinations = [GMSNavigationWaypoint]() destinations.append( GMSNavigationWaypoint.init( placeID: "ChIJH-tBOc4EdkgRJ8aJ8P1CUxo", title: "Trafalgar Square")!) }
Chiama setDestinations()
e gestisci la risposta.
A questo punto, chiama setDestinations
e gestisci il GMSRouteStatus
che viene restituito.
Se GMSRouteStatus
è "OK", avvia la guida impostando isGuidanceActive=true
sull'oggetto navigator
di mapView
. Altrimenti, stampa un'istruzione per indicare che si è verificato un errore.
Se il valore GMSRouteStatus
restituito è "OK", inizia a simulare il viaggio lungo il percorso chiamando mapView.locationSimulator.simulateLocationsAlongExistingRoute()
.
// Create a route and start guidance. @objc func startNav() { var destinations = [GMSNavigationWaypoint]() destinations.append( GMSNavigationWaypoint.init( placeID: "ChIJH-tBOc4EdkgRJ8aJ8P1CUxo", title: "Trafalgar Square")!) mapView.navigator?.setDestinations( destinations ) { routeStatus in guard routeStatus == .OK else { print("Handle route statuses that are not OK.") return } //If routeStatus is OK, start guidance. self.mapView.navigator?.isGuidanceActive = true //start simulating driving along the route. self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute() self.mapView.cameraMode = .following } }
Gestire gli stati di errore comuni
È utile gestire gli errori GMSRouteStatus
in modo più esplicito, soprattutto durante il debug dei problemi iniziali con la nuova app. Ad esempio, potresti notare che hai ottenuto l'autorizzazione di accesso alla posizione, la chiave API o "nessun percorso trovato". a causa della configurazione di debug, pertanto può essere utile gestire questi stati di errore.
Aggiungi il codice che gestisca questi casi specifici e stampa un'istruzione nella console.
mapView.navigator?.setDestinations( destinations ) { routeStatus in guard routeStatus == .OK else { print("Handle route statuses that are not OK.") switch routeStatus { case .locationUnavailable: print("Location unavailable.") //check permissions case .noRouteFound: print("No route found.") //check start location and destination case .waypointError: print("Waypoint error") //check Place ID default: print("Not sure what happened") } return }
Aggiungere un pulsante per avviare le indicazioni stradali
Infine, aggiungi un pulsante all'interfaccia utente e collegalo al metodo startNav. Crea un metodo denominato makeButton()
con il seguente codice. Chiama la funzione makeButton()
da loadView()
.
// Add a button to the view. func makeButton() { // A button to start navigation. let navButton = UIButton(frame: CGRect(x: 5, y: 150, width: 200, height: 35)) navButton.backgroundColor = .blue navButton.alpha = 0.5 navButton.setTitle("Start navigation", for: .normal) navButton.addTarget(self, action: #selector(startNav), for: .touchUpInside) self.mapView.addSubview(navButton) }
Crea ed esegui la tua app.
Nota: l'esecuzione del codice in
startNav()
chiamerà il
setDestinations()
che prevede un addebito dopo le prime 1000 destinazioni utilizzate. Per ulteriori informazioni, consulta Utilizzo e fatturazione.
9. Complimenti!
Ottimo, hai raggiunto la tua destinazione.
Hai creato una semplice app che fornisce indicazioni stradali passo passo per raggiungere una destinazione utilizzando l'SDK Navigation di Google Maps Platform.
Hai configurato le autorizzazioni app e la finestra di dialogo dei termini per gli utenti finali dell'SDK di navigazione e hai specificato una destinazione utilizzando un ID luogo. Hai gestito diversi stati di operazione riuscita ed errore nella tua app.
10. Vuoi di più?
Se vuoi sviluppare ulteriormente la tua app, dai un'occhiata ai seguenti argomenti per trovare l'ispirazione.
- Ascolta altri eventi di navigazione. Aggiungi codice per visualizzare un messaggio se il tempo o la distanza rimanenti superano una soglia.
- Personalizza l'interfaccia di navigazione.
- Se vuoi una sfida più grande, prova ad aggiungere un selettore di luoghi dell'API Places per consentire all'utente di impostare la destinazione. Suggerimento: le app demo dell'SDK di navigazione hanno un'implementazione di esempio. Esegui
pod try GoogleNavigation
nella cartella del progetto per visualizzare il codice.