Informazioni su questo codelab
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'
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.
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:
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.
- In Cloud Console, fai clic sul menu a discesa del progetto e seleziona il progetto che vuoi utilizzare per questo codelab.
- 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.
- 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.
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.
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:
Selezionala per visualizzare l'editor plist.
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.
Premi Invio per aggiungere la nuova chiave. Quindi, fai doppio clic sulla colonna Valore per questa chiave e aggiungi una stringa:
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':
[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.
Quindi, nella parte inferiore della barra laterale, trova il controllo dell'etichetta assicurandoti che la libreria di oggetti sia selezionata.
Nella Scena del controller di visualizzazione a sinistra, assicurati che l'opzione "Visualizza' sia selezionata:
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:
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.
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:
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:
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:
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.
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.
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'
In questo modo, puoi visualizzare il luogo con i relativi luoghi probabilmente aggiornati, simulando il viaggio in autostrada.
e il gioco è fatto. Hai eseguito correttamente l'accesso ai dettagli sul luogo attuali utilizzando l'API Google Places su iOS.