Guida introduttiva all'SDK Places per iOS (Objective-C)

1. Prima di iniziare

Prima di iniziare la programmazione, è necessario configurare alcuni prerequisiti.

Xcode

Questo tutorial utilizza lo strumento Xcode di Apple, insieme al linguaggio Objective-C per creare una semplice applicazione iOS che viene eseguita in un emulatore. Non hai bisogno di un dispositivo fisico. Puoi scaricare Xcode all'indirizzo https://developer.apple.com/xcode/

Cacao

L'SDK Places per iOS è disponibile come pod CocoaPods. CocoaPods è uno strumento di gestione delle dipendenze open source per i progetti Swift e Objective-C. Se non hai già questo strumento, devi installarlo prima di continuare. Può essere installato dal terminale in questo modo:

sudo gem install cocoapods

Per maggiori dettagli su CocoaPods, consulta la Guida introduttiva a CocoaPods.

Installazione dell'SDK

Per installare l'SDK devi creare nella directory del progetto un Podfile che CocoaPods utilizzerà per scaricare e configurare le dipendenze richieste. Il modo più semplice per farlo è creare un nuovo progetto in Xcode, aggiungere un podfile al suo interno e installare i pod.

Apri Xcode e verrà visualizzata la schermata "Ti diamo il benvenuto in Xcode'. Qui, seleziona "Create a new Xproject project'

4f1ecee473937c7b.png

Nella prossima schermata ti verrà chiesto un modello per il tuo nuovo progetto. Seleziona "Single View Application" per iOS e premi "Next'

Quando ti viene chiesto il nome del prodotto, puoi scegliere qualsiasi cosa ti piace, ma assicurati di notare l'identificatore bundle generato. ti servirà in un secondo momento.

72fbf25cb2db22ad.png

Premi "Avanti' e il progetto verrà creato automaticamente. Prendi nota della directory in cui è stata creata. Chiudi Xcode e utilizzando Terminale, vai alla directory.

Utilizzando Terminale, inserisci il seguente comando:

pod init

Verrà creato un file denominato Podfile. Modificalo per aggiungere un pod per Google Maps nel seguente modo:

target '{YOUR APP NAME}' do
pod 'GoogleMaps'
end

Salva e chiudi Xcode. Assicurati di chiuderlo, perché nel passaggio successivo modificherai il progetto sottostante. Al termine verrà aperto un altro file di progetto ed è abbastanza comune che uno sviluppatore venga confuso su dove si trovasse se non lo avesse chiuso in precedenza. Ora, in un terminale, vai alla directory del progetto ed esegui "pod install' in questo modo:

789c5bc62817f68a.png

Al termine, verranno installati i pod e verrà creato un nuovo file .xcworkspace. Da ora in poi, per il progetto. Ma prima di scrivere un codice, la prossima cosa di cui hai bisogno è una chiave API.

2. Recupera la tua chiave API

Per il passaggio di attivazione seguente, attiva l'SDK Maps per iOS.

Configurare Google Maps Platform

Se non hai ancora un account Google Cloud Platform e un progetto con la fatturazione abilitata, consulta la guida Utilizzo di Google Maps Platform per creare un account di fatturazione e un progetto.

  1. In Cloud Console, fai clic sul menu a discesa del progetto e seleziona il progetto che vuoi utilizzare per questo codelab.

  1. Abilita le API e gli SDK di Google Maps Platform richiesti per questo codelab in Google Cloud Marketplace. Per farlo, segui la procedura descritta in questo video o in questa documentazione.
  2. Genera una chiave API nella pagina Credentials di Cloud Console. Puoi seguire la procedura descritta in questo video o in questa documentazione. Tutte le richieste a Google Maps Platform richiedono una chiave API.

3. Creazione dell'app Places

Ora che hai creato un progetto della console e hai attivato l'API Places, dopo aver ottenuto una chiave API, puoi iniziare a codificare la tua prima app dell'API Places.

Quando hai installato i file dei pod, è stato creato per te un nuovo file .xcworkspace. Per aprire questa pagina, fai doppio clic sopra.

19d62f34c08e645c.png

Noterai in Project Explorer che ora hai una nuova cartella chiamata "Pod'. Se ha funzionato correttamente, vedrai una cartella di Google Maps che contiene i framework.

8844d861f64c61aa.png

4. Modifica il file Info.plist.

La prima volta che esegui l'applicazione, viene visualizzata una finestra di dialogo che chiede all'utente di autorizzare l'accesso ai servizi di geolocalizzazione. Questa finestra di dialogo fornisce una stringa da te definita e viene inserita nel file Info.plist. Se questa stringa non è presente, la finestra di dialogo non viene visualizzata e la tua app non funzionerà.

Puoi trovare il file Info.plist in Explorer progetti qui:

c224c920ab3f1ef.png

Selezionala per visualizzare l'editor plist.

859ca56f3b19da5.png

Passa il mouse sopra uno qualsiasi degli elementi per visualizzare l'icona "+'". Premilo per visualizzare una nuova voce. Inserisci il valore "NSLocationAlwaysUsageDescription' in questa casella.

9fb225d6f5508794.png

Premi Invio per aggiungere la nuova chiave. Quindi, fai doppio clic sulla colonna Valore per questa chiave e aggiungi una stringa:

5aefeb184187aa58.png

Per ulteriori informazioni su questa stringa, consulta la documentazione per gli sviluppatori di Apple.

5. Modifica del delegato della app

In Explorer progetti, trova e apri AppDelegate.m. Lo utilizzerai per aggiungere la tua chiave API.

All'inizio del file, aggiungilo subito sotto la riga #import:

@import GoogleMaps;

Poi, nella funzione DidFinishLaunchingWithOptions: aggiungi quanto segue solo sulla riga "return YES&#39:

[GMSServices provideAPIKey:@"<Add your API Key>"];

Assicurati di utilizzare la chiave API generata in precedenza.

6. Modificare il file dello Storyboard

In Esplora progetto, apri il file Main.storyboard. Assicurati che la barra laterale sia attiva premendo il pulsante della barra laterale nell'angolo in alto a destra.

352af28b970d9e2.png

Quindi, nella parte inferiore della barra laterale, trova il controllo dell'etichetta assicurandoti che la libreria di oggetti sia selezionata.

adec7051ae949531.png

Nella Scena del controller di visualizzazione a sinistra, assicurati che l'opzione "Visualizza' sia selezionata:

e4827b92b5861e3e.png

Trascina quindi sette etichette sulla vista. Disponile come mostrato qui. Trascina le loro dimensioni in modo che corrispondano a quelle mostrate. Puoi modificare il testo nell'etichetta facendo doppio clic e digitando il valore richiesto:

F8a9457772358069.png

Per l'etichetta più grande in basso (quella molto grande), vai all'editor delle proprietà e assicurati che sia impostata su 0 righe (il valore predefinito è 1). Ciò consente di visualizzare più righe.

a4abacf00d8888fe.png

7. Crea prese per i valori

Per le 3 etichette "value', dovrai creare una presa. In questo modo, potrai modificare i loro valori utilizzando il codice. A tale scopo, devi prima attivare l'editor dell'assistente. A tale scopo, per prima cosa chiudi la barra laterale delle proprietà facendo clic sul pulsante di rimozione. Questo pulsante è stato mostrato nel passaggio precedente.

Poi seleziona il pulsante Assistente Google: è il cerchio doppio mostrato qui:

e92dcc4ceea20a51.png

Assicurati che il rendering del file ViewController.h sia eseguito. In caso contrario, puoi modificarlo utilizzando l'editor nella parte superiore della finestra dell'assistente:

d42f0fcc18b84703.png

Quindi, tenendo premuto il tasto CTRL, trascina ogni etichetta e rilasciala sotto la riga @interface nel file ViewController.h. Viene visualizzata una finestra di dialogo che chiede quale tipo di connessione vuoi stabilire:

a44b7888ed0f62b.png

Assicurati che le impostazioni siano le seguenti mostrate (Connessione: Presa; Tipo: Etichetta UI; Spazio di archiviazione: Debole), quindi assegna a ogni nome un nome. Ai fini di questo codelab, ho chiamato rispettivamente le etichette Longitudine, Latitudine e Altitudine lblLongitude, lblLatitude e lblAltidude. Trascina inoltre l'etichetta grande dal basso verso l'alto e richiamala lblLuoghi.

Al termine, il file ViewController.h dovrebbe avere il seguente aspetto:

#import <UIKit/UIKit.h>
@import GoogleMaps;

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;

@end

8. Modifica il file di intestazione per le API Location e Google Client

Prima dei passaggi finali, dove crei l'app per utilizzare l'API Places, devi configurare altre variabili nel file di intestazione (ViewController.h). Questi sono l'oggetto Core Location Manager e un Core Location:

@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;

Occorre anche un client API di Google:

@property GMSPlacesClient *placesClient;

Infine, dovrai aggiornare il file di intestazione in modo che la classe implementi il CLLocationManagerDelega:

@interface ViewController : UIViewController<CLLocationManagerDelegate>

Al termine, il file di intestazione dovrebbe avere il seguente aspetto:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>


@interface ViewController : UIViewController<CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;

@property GMSPlacesClient *placesClient;
@end

9. Modifica il controller

Il primo passaggio consiste nel modificare la funzione viewDoneLoad per inizializzare la gestione delle posizioni, richiedere l'autorizzazione di accesso alla posizione e, infine, avviare la gestione della posizione in modo che monitori la posizione corrente. Dovrai anche inizializzare il client API Google Places.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc]init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.locationManager requestAlwaysAuthorization];
        // Or [self.locationManager requestWhenInUseAuthorization];
    }
    [self.locationManager startUpdatingLocation];
    
    self.locationManager.delegate = self;
    self.location = [[CLLocation alloc] init];
    self.placesClient = [GMSPlacesClient sharedClient];
}

10. Gestire gli aggiornamenti sulla posizione

Il gestore del luogo richiama il tuo controller di visualizzazione con gli aggiornamenti della posizione richiamando la funzione DidUpdateLocations. Dovrai aggiungerlo a ViewController.m. La funzione avrà il seguente aspetto:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    // Enter code here
}

Questa funzione deve svolgere diverse operazioni.

Innanzitutto, memorizza nella cache la posizione con l'ultima ricevuta:

self.location = locations.lastObject;

Successivamente, è necessario aggiornare le tre etichette per Latitudine, Longitudine e Altitudine:

self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];

self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];

self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];

Successivamente, chiamerai l'API Places utilizzando il client Places. Per farlo, specifica la funzione di callback, che fornirà l'elenco dei luoghi del luogo. L'API Places determina la probabilità che ti trovi in un determinato luogo in base alla tua posizione. Restituisce il nome dei luoghi probabili, insieme a un valore compreso tra 0 e 1 contenente la probabilità che tu ti trovi in quel luogo.

[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

Dopodiché puoi implementare il callback. Verrà eseguito l'iterazione tramite l'elenco di probabilità, aggiungendo luoghi e probabilità per tali luoghi.

[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

  if (error != nil) {
    NSLog(@"Current Place error %@", [error localizedDescription]);
    return;
  }
  NSMutableString *strPlaces = [NSMutableString stringWithString:@""];

  for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods) {
    GMSPlace* place = likelihood.place;
    NSLog(@"Current Place name %@ at likelihood %g", place.name,
            likelihood.likelihood);
    NSLog(@"Current Place address %@", place.formattedAddress);
    NSLog(@"Current Place attributions %@", place.attributions);
    NSLog(@"Current PlaceID %@", place.placeID);
    [strPlaces appendString:place.name];
    [strPlaces appendString:@" "];
    [strPlaces appendFormat:@"%g",likelihood.likelihood];
    [strPlaces appendString:@"\n"];
  }
  self.lblPlaces.text = strPlaces;
}];

Al termine, la funzione DidUpdateLocations dovrebbe avere il seguente aspetto:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    
    self.location = locations.lastObject;
    self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];
    self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];
    self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];
    
    NSLog(@"%@", self.location.description);
    
    [self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

        if (error != nil) {
            NSLog(@"Current Place error %@", [error localizedDescription]);
            return;
        }
        NSMutableString *strPlaces = [NSMutableString stringWithString:@""];
        
        for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods)  
        {
            GMSPlace* place = likelihood.place;
            NSLog(@"Current Place name %@ at likelihood %g", place.name, likelihood.likelihood);
            NSLog(@"Current Place address %@", place.formattedAddress);
            NSLog(@"Current Place attributions %@", place.attributions);
            NSLog(@"Current PlaceID %@", place.placeID);
            [strPlaces appendString:place.name];
            [strPlaces appendString:@" "];
            [strPlaces appendFormat:@"%g",likelihood.likelihood];
            [strPlaces appendString:@"\n"];
        }
        self.lblPlaces.text = strPlaces;
    }];
}

Ora puoi eseguire la tua app e testarla.

11. Esecuzione dell'app nell'emulatore

Puoi eseguire l'app utilizzando il pulsante Esegui nella barra del titolo. Questo consente inoltre di selezionare il tipo di esecuzione, e come puoi vedere qui, test su un iPhone 6, utilizzando l'emulatore.

bbbe0b8820c8a913.png

Quando premi il pulsante Esegui, l'app viene creata e avviata. Vedrai la richiesta di consentire all'app di accedere alla posizione, inclusa la stringa personalizzata che hai specificato in precedenza.

b9bb2ace7e68f186.png

Dopo avere eseguito questa operazione, potrai visualizzare gli aggiornamenti di Latitudine e Longitudine. Per cambiare la posizione, seleziona il menu Debug e scegli una posizione. Ad esempio, puoi selezionare "Autostrada autostradale'

dcb1ce091d780f56.png

In questo modo, puoi visualizzare il luogo con i relativi luoghi probabilmente aggiornati, simulando il viaggio in autostrada.

649e3eeb2321ae03.png

e il gioco è fatto. Hai eseguito correttamente l'accesso ai dettagli sul luogo attuali utilizzando l'API Google Places su iOS.