1. Hinweis
Bevor Sie mit dem Programmieren beginnen, müssen Sie einige Voraussetzungen erfüllen.
Xcode
In dieser Anleitung wird das Xcode-Tool von Apple zusammen mit der Sprache Objective-C verwendet, um eine einfache iOS-Anwendung zu erstellen, die in einem Emulator ausgeführt wird. Sie benötigen kein physisches Gerät. Sie können Xcode unter https://developer.apple.com/xcode/ herunterladen.
CocoaPods
Das Places SDK for iOS ist als CocoaPods-Pod verfügbar. CocoaPods ist ein Open-Source-Tool zur Abhängigkeitsverwaltung für Swift- und Objective-C-Projekte. Wenn Sie dieses Tool noch nicht haben, müssen Sie es installieren, bevor Sie fortfahren. So wird es über das Terminal installiert:
sudo gem install cocoapods
Weitere Informationen zu CocoaPods finden Sie im Startleitfaden zu CocoaPods.
SDK installieren
Um das SDK zu installieren, müssen Sie in Ihrem Projektverzeichnis eine Podfile-Datei erstellen, die von CocoaPods zum Herunterladen und Konfigurieren der erforderlichen Abhängigkeiten verwendet wird. Am einfachsten geht das, indem Sie ein neues Projekt in Xcode erstellen, ein Podfile hinzufügen und die Pods dort installieren.
Öffnen Sie Xcode. Der Bildschirm „Welcome to Xcode“ (Willkommen bei Xcode) wird angezeigt. Wählen Sie hier „Create a new Xcode project“ (Neues Xcode-Projekt erstellen) aus.
Auf dem nächsten Bildschirm werden Sie nach einer Vorlage für Ihr neues Projekt gefragt. Wählen Sie für iOS „Single View Application“ (App mit Einzelansicht) aus und klicken Sie auf „Next“ (Weiter).
Wenn Sie nach dem Produktnamen gefragt werden, können Sie einen beliebigen Namen auswählen. Notieren Sie sich jedoch die Bundle-ID, die für Sie generiert wird. Sie benötigen sie später.
Klicken Sie auf „Weiter“. Das Projekt wird dann für Sie erstellt. Notieren Sie sich das Verzeichnis, in dem die Datei erstellt wird. Schließen Sie Xcode und wechseln Sie über das Terminal zu diesem Verzeichnis.
Geben Sie im Terminal den folgenden Befehl ein:
pod init
Eine Datei mit dem Namen „Podfile“ wird für Sie erstellt. Bearbeiten Sie die Datei, um einen Pod für GoogleMaps hinzuzufügen:
target '{YOUR APP NAME}' do
pod 'GoogleMaps'
end
Speichern Sie die Datei und schließen Sie Xcode. Schließen Sie es, da Sie im nächsten Schritt das zugrunde liegende Projekt bearbeiten werden. Wenn der Vorgang abgeschlossen ist, öffnen Sie eine andere Projektdatei. Es kommt häufig vor, dass Entwickler verwirrt sind, wo sich die einzelnen Elemente befinden, wenn sie Xcode nicht zuvor geschlossen haben. Wechseln Sie nun in einem Terminal zu Ihrem Projektverzeichnis und führen Sie „pod install“ so aus:
Anschließend werden die Pods installiert und eine neue .xcworkspace-Datei wird erstellt. Verwenden Sie es ab sofort für das Projekt. Bevor Sie mit dem Programmieren beginnen, benötigen Sie einen API-Schlüssel.
2. API-Schlüssel abrufen
Aktivieren Sie im nächsten Schritt Maps SDK for iOS.
Google Maps Platform einrichten
Wenn Sie noch kein Google Cloud-Konto und kein Projekt mit aktivierter Abrechnung haben, lesen Sie bitte den Leitfaden Erste Schritte mit Google Maps Platform, um ein Rechnungskonto und ein Projekt zu erstellen.
- Klicken Sie in der Cloud Console auf das Drop-down-Menü für das Projekt und wählen Sie das Projekt aus, das Sie für dieses Codelab verwenden möchten.
- Aktivieren Sie die für dieses Codelab erforderlichen APIs und SDKs der Google Maps Platform im Google Cloud Marketplace. Folgen Sie dazu der Anleitung in diesem Video oder dieser Dokumentation.
- Generieren Sie einen API-Schlüssel in der Cloud Console auf der Seite Anmeldedaten. Folgen Sie dazu dieser Anleitung oder dieser Dokumentation. Für alle Anfragen an die Google Maps Platform ist ein API-Schlüssel erforderlich.
3. Places API-App erstellen
Nachdem Sie ein Konsolenprojekt erstellt und die Places API darin aktiviert haben, können Sie mit dem Programmieren Ihrer ersten Places API-App beginnen.
Als Sie die Pod-Dateien installiert haben, wurde eine neue .xcworkspace-Datei erstellt. Öffnen Sie die Datei per Doppelklick.
Im Projekt-Explorer sehen Sie jetzt einen neuen Ordner namens „Pods“. Wenn das funktioniert hat, sehen Sie dort einen GoogleMaps-Ordner mit den Frameworks.
4. Bearbeiten Sie die Datei „Info.plist“.
Wenn Sie die App zum ersten Mal ausführen, wird in iOS ein Dialogfeld angezeigt, in dem der Nutzer aufgefordert wird, die Berechtigung für den Zugriff auf die Standortdienste zu erteilen. In diesem Dialogfeld wird ein String angezeigt, den Sie definieren und in die Datei „Info.plist“ einfügen. Wenn dieser String nicht vorhanden ist, wird der Dialog nicht angezeigt und Ihre App funktioniert nicht.
Die Datei „Info.plist“ finden Sie im Projekt-Explorer hier:
Wählen Sie sie aus, um den plist-Editor aufzurufen.
Bewegen Sie den Mauszeiger auf eines der Elemente, um das Symbol „+“ aufzurufen. Drücken Sie darauf. Ein neuer Eintrag wird angezeigt. Geben Sie in dieses Feld den Wert „NSLocationAlwaysUsageDescription“ ein.
Drücken Sie die Eingabetaste, um den neuen Schlüssel hinzuzufügen. Doppelklicken Sie dann auf die Spalte „Value“ für diesen Schlüssel und fügen Sie einen String hinzu:
Weitere Informationen zu diesem String finden Sie in der Apple-Entwicklerdokumentation.
5. App-Delegate bearbeiten
Suchen Sie im Projekt-Explorer nach AppDelegate.m und öffnen Sie die Datei. Sie fügen dort Ihren API-Schlüssel ein.
Fügen Sie oben in der Datei direkt unter der #import-Zeile Folgendes ein:
@import GoogleMaps;
Fügen Sie dann in der Funktion „didFinishLaunchingWithOptions:“ Folgendes direkt vor der Zeile „return YES“ hinzu:
[GMSServices provideAPIKey:@"<Add your API Key>"];
Verwenden Sie den API-Schlüssel, den Sie zuvor generiert haben.
6. Storyboard-Datei bearbeiten
Öffnen Sie im Projektexplorer die Datei „Main.storyboard“. Achten Sie darauf, dass die Seitenleiste aktiv ist. Drücken Sie dazu rechts oben auf die Schaltfläche für die Seitenleiste.
Suchen Sie dann unten in der Seitenleiste nach dem Label-Steuerelement. Achten Sie darauf, dass die Objektbibliothek ausgewählt ist.
Achten Sie darauf, dass in der View Controller-Szene auf der linken Seite die „View“ ausgewählt ist:
Ziehen Sie dann sieben Labels per Drag-and-drop auf die Ansicht. Ordnen Sie sie wie hier gezeigt an. Achten Sie darauf, die Größen so anzupassen, dass sie mit den gezeigten übereinstimmen. Sie können den Text im Label bearbeiten, indem Sie darauf doppelklicken und den gewünschten Wert eingeben:
Wählen Sie das unterste Label (das sehr große) aus und legen Sie im Eigenschafteneditor die Anzahl der Zeilen auf 0 fest (standardmäßig ist 1 eingestellt). So können mehrere Zeilen gerendert werden.
7. Outlets für die Werte erstellen
Für die drei „value“-Labels müssen Sie ein Outlet erstellen. So können Sie ihre Werte mit Code ändern. Dazu müssen Sie zuerst den Assistenten-Editor aktivieren. Schließen Sie dazu zuerst die Seitenleiste mit den Eigenschaften, indem Sie auf die entsprechende Schaltfläche klicken. (Diese Schaltfläche wurde im vorherigen Schritt angezeigt.)
Wählen Sie dann die Assistant-Schaltfläche aus. Sie ist hier als doppelter Kreis dargestellt:
Achten Sie darauf, dass die Datei „ViewController.h“ gerendert wird. Falls nicht, können Sie das mit dem Editor oben im Assistentenfenster ändern:
Halten Sie dann die CONTROL-Taste gedrückt, ziehen Sie jedes Label und legen Sie es im Assistenten unter der Zeile „@interface“ in der Datei „ViewController.h“ ab. Ein Dialogfeld wird angezeigt, in dem Sie gefragt werden, welche Art von Verbindung Sie herstellen möchten:
Achten Sie darauf, dass die Einstellungen wie gezeigt sind (Verbindung: Outlet; Typ: UILabel; Speicher: Weak) und geben Sie dann jeder einen Namen. In diesem Codelab habe ich die Labels für Längengrad, Breitengrad und Höhe lblLongitude, lblLatitude und lblAltidude genannt. Ziehen Sie auch das große Label von unten nach oben und nennen Sie es „lblPlaces“.
Wenn Sie fertig sind, sollte die Datei „ViewController.h“ so aussehen:
#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. Header-Datei für Standort- und Google-Client-APIs bearbeiten
Bevor Sie die App für die Verwendung der Places API erstellen, müssen Sie noch einige Variablen in der Header-Datei (ViewController.h) einrichten. Das sind der Core Location Manager und ein Core Location-Objekt:
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;
Außerdem benötigen Sie einen Google API-Client:
@property GMSPlacesClient *placesClient;
Schließlich müssen Sie die Headerdatei aktualisieren, damit die Klasse das CLLocationManagerDelegate-Protokoll implementiert:
@interface ViewController : UIViewController<CLLocationManagerDelegate>
Wenn Sie fertig sind, sollte Ihre Header-Datei so aussehen:
#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. View Controller bearbeiten
Als Erstes müssen Sie die Funktion „viewDidLoad“ bearbeiten, um den Standortmanager zu initialisieren, die Autorisierung des Nutzers für den Zugriff auf den Standort anzufordern und schließlich den Standortmanager zu starten, damit er den aktuellen Standort verfolgt. Außerdem initialisieren Sie den Google Places API-Client.
- (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. Standortaktualisierungen verarbeiten
Der Standortmanager ruft Ihren View Controller mit Standortaktualisierungen zurück, indem er die Funktion „didUpdateLocations“ aufruft. Sie müssen dies zu Ihrer ViewController.m-Datei hinzufügen. Die Funktion sieht so aus:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
// Enter code here
}
Diese Funktion muss mehrere Dinge erledigen.
Zuerst wird der Standort mit dem zuletzt empfangenen Standort im Cache gespeichert:
self.location = locations.lastObject;
Als Nächstes sollten die drei Labels für „Breitengrad“, „Längengrad“ und „Höhe“ aktualisiert werden:
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];
Als Nächstes rufen Sie die Places API mit dem Places-Client auf. Dazu geben Sie die Callback-Funktion an, die die Liste der Wahrscheinlichkeiten für Orte erhält. Die Places API ermittelt anhand Ihres Standorts, wie wahrscheinlich es ist, dass Sie sich an einem bestimmten Ort befinden. Es wird der Name wahrscheinlicher Orte zusammen mit einem Wert zwischen 0 und 1 zurückgegeben, der die Wahrscheinlichkeit angibt, dass Sie sich an diesem Ort befinden.
[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {
Anschließend können Sie den Callback implementieren. Dadurch wird die Liste der Wahrscheinlichkeiten durchlaufen und Orte sowie die Wahrscheinlichkeiten für diese Orte werden hinzugefügt.
[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;
}];
Wenn Sie fertig sind, sollte Ihre didUpdateLocations-Funktion so aussehen:
-(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;
}];
}
Jetzt können Sie Ihre App ausführen und testen.
11. App im Emulator ausführen
Sie führen die App über die Schaltfläche „Ausführen“ in der Titelleiste aus. Hier können Sie auch den Lauf-Typ auswählen. Wie Sie hier sehen, teste ich auf einem iPhone 6 mit dem Emulator.
Wenn Sie auf die Schaltfläche „Ausführen“ klicken, wird die App erstellt und gestartet. Sie sehen die Anfrage, der App den Zugriff auf den Standort zu erlauben, einschließlich des benutzerdefinierten Strings, den Sie zuvor angegeben haben.
Danach werden die aktualisierten Breiten- und Längengrade angezeigt. Wenn Sie den Standort ändern möchten, wählen Sie das Debug-Menü aus und wählen Sie einen Standort aus. Sie können beispielsweise „Autobahnfahrt“ auswählen.
Wenn Sie das tun, wird der Standort mit den wahrscheinlichen Orten aktualisiert, um die Autobahnfahrt zu simulieren.
Webseite. Sie haben erfolgreich über die Google Places API für iOS auf die aktuellen Ortsdetails zugegriffen.