Erste Schritte mit dem Places SDK for iOS (Objective-C)

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.

4f1ecee473937c7b.png

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.

72fbf25cb2db22ad.png

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:

789c5bc62817f68a.png

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.

  1. 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.

  1. 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.
  2. 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.

19d62f34c08e645c.png

Im Projekt-Explorer sehen Sie jetzt einen neuen Ordner namens „Pods“. Wenn das funktioniert hat, sehen Sie dort einen GoogleMaps-Ordner mit den Frameworks.

8844d861f64c61aa.png

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:

c224c920ab3f1ef.png

Wählen Sie sie aus, um den plist-Editor aufzurufen.

859ca56f3b19da5.png

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.

9fb225d6f5508794.png

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:

5aefeb184187aa58.png

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.

352af28b970d9e2.png

Suchen Sie dann unten in der Seitenleiste nach dem Label-Steuerelement. Achten Sie darauf, dass die Objektbibliothek ausgewählt ist.

adec7051ae949531.png

Achten Sie darauf, dass in der View Controller-Szene auf der linken Seite die „View“ ausgewählt ist:

e4827b92b5861e3e.png

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:

f8a9457772358069.png

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.

a4abacf00d8888fe.png

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:

e92dcc4ceea20a51.png

Achten Sie darauf, dass die Datei „ViewController.h“ gerendert wird. Falls nicht, können Sie das mit dem Editor oben im Assistentenfenster ändern:

d42f0fcc18b84703.png

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:

a44b7888ed0f62b.png

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.

bbbe0b8820c8a913.png

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.

b9bb2ace7e68f186.png

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.

dcb1ce091d780f56.png

Wenn Sie das tun, wird der Standort mit den wahrscheinlichen Orten aktualisiert, um die Autobahnfahrt zu simulieren.

649e3eeb2321ae03.png

Webseite. Sie haben erfolgreich über die Google Places API für iOS auf die aktuellen Ortsdetails zugegriffen.