Compatibile con Xcode 8

Mappe con il linguaggio Swift. Annotare punti d’interesse

ENTRA NEL NOSTRO GRUPPO FACEBOOK

La geolocalizzazione ha portato a livello massimo le connessioni sociali tra le persone. Un tempo potevamo scrivere
dal bagno una poesia e condividerla senza che nessuno sapesse da dove fosse stato mandato quel messaggio.

Oggi tutti sappiamo che questo è diventato impossibile, tutti sanno cosa stiamo facendo, tutti sanno il perché e tutti sanno da dove lo stiamo facendo violando, spesso, i confini della privacy personale (nel 90% dei casi siamo noi sviluppatori a permettere che ciò avvenga).

Che sia chiaro, non voglio aprire una polemica sui problemi legati alla geolocalizzazione ma spesso sono i programmatori a portare l’utilizzatore ad attivare funzioni che normalmente non vorrebbero attivare.

Dato che ho l’onore di scrivere per te, che un giorno realizzerai applicazioni, è giusto discutere delle buone maniere dello sviluppo di un’applicazione.

Nella fattispecie oggi non imparerai a violare le norme sulla privacy, bensì ti illustrerò come utilizzare le mappe con il linguaggio Swift, quindi il framework MapKit, e ad annotare delle informazioni su di essa con le classiche bandierine (punti d’interesse).

mappe-con-il-linguaggio-swift

3 cose che imparerai da questo tutorial

In questo tutorial realizzerai un’applicazione in grado di recuperare la posizione dell’utente, seguire i suoi movimenti e inserire una nota in uno dei luoghi in cui l’utente si trova.

Praticamente l’applicazione seguirà i tuoi movimenti e, quando vorrai, potrai inserire un punto nota per ricordarti di un luogo in cui sei stato.

Ecco un riassunto degli argomenti che verranno trattati in questo tutorial:

  1. Inserire una MapView in un ViewController
  2. MapKit e CoreLocation. Recupero della posizione dell’utente con LocationManager e visualizzazione in mappa.
  3. PointAnnotation, come inserire un promemoria grafico all’interno della mappa.

Anche se tutte le guide e tutorial che scrivo sono semplici da seguire e capire (almeno spero) è necessario avere un minimo di conoscenza del linguaggio di programmazione Swift e della programmazione ad oggetti.

Let’s start!

Aggiungere il MapKit framework per l’utilizzo delle mappe

Apri Xcode e crea un nuovo progetto. Vai su File\New\Project…, seleziona iOS e Application Single View, fai Next, Impostate il nome in “Location Reminder“, assicurati di selezionare il linguaggio Swift, premi Next e infine Create.

Per prima cosa devi importare, all’interno del tuo progetto, il framework MapKit (un framework è una collezione di struementi e funzionalità). Il framework MapKit contiene tutte le informazioni per la gestione e manipolazione delle mappe di sistema.

Nel Project Navigator clicca su Location Reminder e spostati nel menu Build Phases. Apri il menu a tendina Link Binary With Libraries e clicca sul simbolo più (+) in basso a sinistra. Seleziona il MapKit.framework e importalo con Add:

location reminder - mapkit framework

I passaggi per l’inserimento sono gli stessi per qualsiasi versione di Xcode.

Il setting del progetto

Se non ti va di crearlo da solo, in fondo al tutorial, trovi il download del progetto completo.

Vai nel Main.storyboard. Trascina, dall’Object Library verso il ViewController, un oggetto MKMapView, un bottone e due TextField. Posizionale nella View in questa maniera.

mapview-e-point-annotation

Per il layout ho utilizzato sia i vincoli classici di Auto Layout che le Stack View per sistemare correttamente le due TextField ed il bottone.

Dato che questo tutorial non mira a spiegarti come sistemare correttamente un layout universale, se vuoi approfondire puoi farlo seguendo il mio corso sullo sviluppo di app iOS o andando ai tutorial citati.

Outlet e Delegate

Assicurati di creare le Outlet e Action per gli elementi. Crea una Outlet per ogni TextField, una Outlet per la MapView ed una Action per il bottone (da cui faremo partire il comando per inserire il pin nella mappa).

schermata-2016-10-22-alle-09-07-50

Assicurati di inserire il framework MapKit, con import MapKit, import UIKit.

MapView

La MapView, se apri il pannello Attributes Inspector, ha diverse proprietà che puoi modificare senza intervenire da codice. Una di queste è quella della User Location, che ti permette di visualizzare sulla mappa il classico puntino blu. Quindi, dato che ci servirà, attivala:

user-location-mapview-swift

Il Location Manager. Recuperare e mostrare la posizione sulla mappa

È arrivato il momento di introdurre l’oggetto che ti permetterà di accedere alla posizione dell’utente, il Location Manager.

Un oggetto della Classe Location Manager è colui che rappresenta qualsiasi informazione riguardante la geolocalizzazione. Esso gestisce i permessi per l’utilizzo della geolocalizzazione, tiene traccia del cambiamento della posizione e tantissime altre cose che mano a mano scoprirai.

Apri il ViewController.swift ed edita la definizione della classe ViewController aggiungendo i protocolli MKMapViewDelegate CLLocationManagerDelegate:

 

Sotto le IBOutlet dichiara due variabili, la prima gestirà un oggetto LocationManager e l’altra conserverà le tue coordinate (LocationCoordinate):

  •  CLLocationCoordinate2D è una structure dedita alla gestione delle coordinate: latitudine (latitude) e longitudine (longitude). Se non ti ricordi cosa sono le coordinate geografica visita la tanto amata wikipedia.

All’interno del metodo ViewDidLoad() dobbiamo fare due cose:

  1. Definire il delegato alla gestione della myMapView, in questo caso è la classe ViewController dato che abbiamo implementato qui il protocollo MKMapViewDelegate.
  2. Inizializzare il CLLocationManager contenuto nella variabile managerPosizione.
Infine, per poter inizializzare correttamente il nostro managerPosizione per fargli recuperare le coordinate dell’utente, è necessario aggiungere il seguente codice:
  • CLLocationManager() crea un oggetto LocationManager. Il LocationManager è l’oggetto delegato al recupero della posizione utente e non solo, uno dei suoi altri utilizzi può essere quello di inviare messaggi al raggiungimento di una determinata posizione o regione.
  • .delegate = self faccio in modo che il ViewController (self), dato che ha implementato il protocollo CLLocationManagerDelegate, sia il delegate del managerPosizione.
  • .desiredAccuracy setta l’accuratezza della posizione. Più piccolo è il valore e più tempo occorrerà a recuperare le coordinate.
  • .requestWhenInUseAuthorization() richiede all’utente di sbloccare l’utilizzo dei servizi di localizzazione.
    • Questo metodo sblocca l’utilizzo del GPS solo quando l’app si trova in foreground, cioè l’utente la sta utilizzando. Se ti servono i servizi di localizzazione in background devi usare la .requestAlwaysAuthorization() e dei sistemi che non tratterò in questo tutorial.
  • .startUpdatingLocation()inizia a recuperare la posizione dell’utente e ad aggiornare i suoi spostamenti.

Sbloccare l’utilizzo delle funzioni di geolocalizzazione

Vai nel Project Navigator e seleziona il file Info.plist. Questo file contiene una lista delle proprietà del tuo progetto. In questo file dovrai aggiungere la proprietà NSLocationWhenInUseUsageDescription che farà in modo di chiedere, all’avvio dell’applicazione, lo sblocco della geolocalizzazione durante l’utilizzo dell’app.

aggiugere-il-nslocationwheninuseusagedescription-allinfo-plist

In pratica questa proprietà farà si che l’applicazione richieda, all’utilizzatore, di sbloccare le funzionalità di geolocalizzazione. Esiste un altro tipo di autorizzazione che blocca le chiamate di aggiornamento quando l’applicazione è in background.

Avvia l’applicazione! magicamente ti verrà richiesto l’accesso alle funzioni di localizzazione (con il requestWhenInUseAuthorization()). Se accetti, la mappa ha inizierà ad aggiornarsi (startUpdatingLocation()):

richiesta-autorizzazione-utilizzo-servizi-geolocalizzazione-mapview-swift

Seguire i cambiamenti di posizione con didUpdateUserLocation

Ti sarai sicuramente accorto di come la mappa non mostri la tua posizione.

Per spingere la mappa a muoversi verso la tua posizione ed a seguirti, devi chiamare un metodo del protocol MapViewDelegate che avvisa il delegate (il ViewController) che le coordinate dell’utente sono state aggiornate.

Il metodo in questione è il didUpdateUserLocation che viene invocato ogni qual volta l’utente si muove, aggiornando così le sue coordinate.

Per implementarlo aggiungi, sotto la funzione ViewDidLoad(), il seguente metodo:

  • self.posizioneUtente = userLocation.coordinate salvo le coordinate aggiornate nella variabili posizioneUtente definita sopra.
  • print(…) stampa sulla console le coordinate per vedere se sono state aggiornate oppure no.
  • MKCoordinateSpanMake definisce l’estensione dell’aerea da visualizzare.
  • MKCoordinateRegion calcola le coordinate della regione con centro la nuova posizione e come area l’estensione definita sopra (lo span).
  • setRegion aggiorna la mapView (che sarebbe la myMapView) focalizzandosi, quindi spostando la visuale, sulla nuova regione.

Geolocalizzazione ed iOS Simulator

Dato che stai lavorando sul Mac è evidente come esso non possa utilizzare il CoreLocation dato che, quest’ultimo, funziona solo su dispositivo mobile.

Per settare apparentemente una posizione, e quindi simulare l’utilizzo del CoreLocation, devi cambiare un’impostazione del tuo iOS Simulator.

Avvia l’applicazione. Spostati sull’iOS Simulator e dalla barra delle preferenze (in alto) apri Debug/Location e infine scegli se utilizzare una posizione Custom oppure una di quelle pre impostate. Per semplicità scegli Apple:

attivare-la-geolocalizzazione-sul-simulatore-ios

Avvia nuovamente l’applicazione e osservate cosa accade.

L’applicazione adesso ti informa che tu ti trovi nelle vicinanze della sede Apple. Ovviamente è surreale e serve solo ed esclusivamente per dimostrarti che il tuo CoreLocation funziona correttamente, infatti se sposti l’app su dispositivo dovrebbe mostrarti la tua reale posizione.

Puoi cambiare la Location Apple in Freeway Drive o City Run. In questo modo l’applicazione simulerà uno spostamento automatico e continuo.

 

PointAnnotation, salvare un punto d’interesse sulla mappa con il linguaggio Swift

Un PointAnnotation è un segnale o bandierina che viene fissata sulla mappa per ricordare all’utente che in quelle coordinate c’è qualcosa di cui si vuole mantenere memoria: un locale, una persona o qualsiasi altra nota.

Nel caso dell’applicazione che stai creando, le bandierine avranno un nome e una descrizione in modo da formare una sorta di promemoria dei luoghi visitati.

Per poter aggiungere un PointAnnotation, edita la IBAction salvaRicordo e aggiungi il seguente codice:

  •  MKPointAnnotation() crea un oggetto di tipo PointAnnotation che verrà fissato in delle specifiche coordinate.
  • nuovoRicordo.coordinate = posizioneUtente setta le coordinate del PointAnnotation uguali a quelle dell’utente.
  • Modifico il title e subtitle uguali a quelle delle due TextField.
  • addAnnotation(..) fissa sulla mappa il PointAnnotation creato.

Adesso ogni volta in cui inserirai un nome, una descrizione e cliccherai su salva, la funzione salvaRicordo creerà un PointAnnotation nelle stesse coordinate in cui si trova l’utente.

Fai una prova, avvia l’applicazione:

mappe-con-il-linguaggio-swift

Fai un po’ di prove utilizzando il freeway drive in modo da aggiungere diversi PointAnnotation:

Considerazioni e Download del progetto

Avrai ben notato l’applicazione non permette né lo spostamento dei PointAnnotation né il salvataggio in un Database o sul dispositivo di tutti i PointAnnotation, questi problemi vengono tutti risolti nei tutorial successivi che ti invito a seguire.

Non ho voluto sovraccaricare questo tutorial perché mi volevo concentrare sull’utilizzo del MapKit per accedere alle coordinate dell’utente e come salvare, con un PointAnnotation, qualcosa sulla mappa.

Dove andare da qui

Come ti ho detto prima, il passo successivo è quello riguardante la modifica e il trascinamento dei Point Annotation. Una volta che hai imparato ad utilizzare tutti questi strumenti è il momento di passare al salvataggio, dei PointAnnotation o delle coordinate utente, nella memoria del dispositivo (utilizzando il CoreData) oppure su internet (CloudKit e Firebase). Quindi i tutorial che ti consiglio di fare, in ordine di importanza sono:

Download del progetto

Se hai avuto qualche problema con il tuo progetto, puoi scaricare quelli fatti da me qui sotto:

[sociallocker]

Download Dropbox

[/sociallocker]

Buona Programmazione!

Start typing and press Enter to search

tutorial-webview-linguaggio-swiftTutorial modificare e Trascinare un MKPointAnnotation in Swift