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

1. Hinweis

Bevor du mit dem Coding beginnen kannst, musst du einige Voraussetzungen einrichten.

Xcode

In dieser Anleitung wird das Xcode-Tool von Apple zusammen mit der Objective-C-Sprache verwendet, um eine einfache iOS-Anwendung zu erstellen, die in einem Emulator ausgeführt wird. Du brauchst kein physisches Gerät Du kannst 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 Verwaltung von Abhängigkeiten für Swift- und Objective-C-Projekte. Wenn Sie dieses Tool noch nicht haben, müssen Sie es installieren, bevor Sie fortfahren. Sie können es über das Terminal so installieren:

sudo gem install cocoapods

Weitere Informationen zu CocoaPods finden Sie im CocoaPods-Startleitfaden.

SDK installieren

Zum Installieren des SDK müssen Sie in Ihrem Projektverzeichnis eine Podfile erstellen, mit der CocoaPods die erforderlichen Abhängigkeiten herunterladen und konfigurieren kann. Am einfachsten erstellen Sie dazu ein neues Projekt in Xcode, fügen in diesem eine Podfile-Datei ein und installieren die Pods dort.

Öffnen Sie Xcode. Daraufhin wird der Bildschirm „Willkommen bei Xcode“ angezeigt. Wählen Sie hier „Create a new Xcode project'“ aus.

4f1ecee473937c7b

Auf dem nächsten Bildschirm wirst du nach einer Vorlage für dein neues Projekt gefragt. „Single View Application“ (iOS) auswählen und „Weiter“ auswählen

Wenn Sie nach dem Produktnamen gefragt werden, können Sie einen beliebigen Namen auswählen. Denken Sie aber daran, die Paket-ID zu verwenden, die für Sie generiert wird. Du benötigst ihn später.

72fbf25cb2db22ad_PNG

Klicken Sie auf „Weiter“ & das Projekt wird erstellt. Notieren Sie sich das Verzeichnis, in dem es erstellt wird. Schließen Sie den Xcode und wechseln Sie über das Terminal zu diesem Verzeichnis.

Geben Sie im Terminal den folgenden Befehl ein:

pod init

Sie erstellen eine Datei namens Podfile. Bearbeiten Sie den Eintrag, um einen Pod für GoogleMaps hinzuzufügen:

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

Speichern und schließen Sie Xcode. Schließen Sie es, da Sie im nächsten Schritt das zugrunde liegende Projekt bearbeiten. Sie öffnen eine andere Projektdatei, wenn ein Entwickler sie nicht mehr versteht, wenn sie Xcode zuvor geschlossen hat. Gehen Sie jetzt in einem Terminal zum Projektverzeichnis und führen Sie „pod install'“ aus.

789c5bc62817f68a

Wenn Sie fertig sind, werden die Pods installiert und eine neue .xcworkspace-Datei erstellt. Verwenden Sie sie ab jetzt für das Projekt. Als Erstes brauchen Sie jedoch einen API-Schlüssel.

2. API-Schlüssel anfordern

Aktivieren Sie für den folgenden Aktivierungsschritt das Maps SDK for iOS.

Google Maps Platform einrichten

Wenn Sie noch kein Google Cloud Platform-Konto und kein Projekt mit aktivierter Abrechnung haben, lesen Sie den Leitfaden Erste Schritte mit der 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 Projekte und wählen Sie das Projekt aus, das Sie für dieses Codelab verwenden möchten.

  1. Aktivieren Sie im Google Cloud Marketplace die für dieses Codelab erforderlichen Google Maps Platform APIs und SDKs. Folgen Sie dazu der Anleitung in diesem Video oder dieser Dokumentation.
  2. Generieren Sie in der Cloud Console auf der Seite Anmeldedaten einen API-Schlüssel. Folgen Sie der Anleitung in diesem Video oder dieser Dokumentation. Für alle Anfragen an die Google Maps Platform ist ein API-Schlüssel erforderlich.

3. Places API-Anwendung erstellen

Nachdem Sie nun ein Konsolenprojekt erstellt und die Places API aktiviert haben, um einen API-Schlüssel abzurufen, können Sie Ihre erste Places API App programmieren.

Als Sie die Pod-Dateien installiert haben, wurde eine neue .xcworkspace-Datei für Sie erstellt. Öffnen Sie ihn per Doppelklick.

19d62f34c08e645c.png

Im Projekt-Explorer sehen Sie, dass Sie jetzt den neuen Ordner „Pods'“ haben. Wenn dies erfolgreich war, 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, über das der Nutzer aufgefordert wird, den Zugriff auf die Standortdienste zu gewähren. In diesem Dialogfeld wird ein von Ihnen definierter String ausgegeben, den Sie in die Datei "Info.plist" einfügen. Wenn dieser String nicht vorhanden ist, wird das Dialogfeld nicht angezeigt und deine App funktioniert nicht.

Die Datei Info.plist finden Sie im Projekt-Explorer hier:

c224c920ab3f1ef.pngs

Wenn Sie sie auswählen, wird der PLIST-Editor angezeigt.

859ca56f3b19da5.png

Bewegen Sie den Mauszeiger auf eines der Elemente. Daraufhin erscheint ein „+'“-Symbol. Drücke sie und es erscheint ein neuer Eintrag. Geben Sie in dieses Feld den Wert „NSLocationAlwaysUsageDescription“ ein.

9fb225d6f5508794

Drücken Sie die Eingabetaste, um den neuen Schlüssel hinzuzufügen. Klicken Sie dann doppelt auf die Spalte „Wert“ für diesen Schlüssel und fügen Sie einen String hinzu:

5aefeb184187aa58

Weitere Informationen zu diesem String finden Sie in der Dokumentation für Apple-Entwickler.

5. App-Bevollmächtigten bearbeiten

Suchen Sie im Projekt-Explorer nach „AppDelegate.m“. Fügen Sie den API-Schlüssel damit ein.

Fügen Sie oben in der Datei direkt unter der Zeile #import ein:

@import GoogleMaps;

Fügen Sie dann in der DidFinishLaunchingWithOptions:-Funktion Folgendes direkt über die Zeile „return YES'“ ein:

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

Achten Sie darauf, den zuvor generierten API-Schlüssel zu verwenden.

6. Storyboard-Datei bearbeiten

Öffnen Sie im Projekt-Explorer die Datei „Main.storyboard“. Vergewissere dich, dass die Seitenleiste aktiv ist. Drücke dazu die Seitenleiste rechts oben.

352af28b970d9e2.png

Suchen Sie unten in der Seitenleiste nach der Label Control, um die Objektbibliothek auszuwählen.

a77551ae949531.png

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

e4827b92b5861e3e.png

Ziehen Sie dann sieben Labels auf die Ansicht. Ordnen Sie sie wie hier gezeigt an. Ziehen Sie ihre Größen an die angezeigten Elemente. Sie können den Text des Labels bearbeiten, indem Sie darauf doppelklicken und den erforderlichen Wert eingeben:

f8a9457772358069

Gehen Sie für das unterste Label (das wirklich große) zum Eigenschafteneditor und achten Sie darauf, dass es keine Zeilen enthält. Der Standardwert ist 1. Dadurch können mehrere Zeilen gerendert werden.

a4abacf00d8888fe.png

7. Outlets für die Werte erstellen

Für die drei Labels „value“ müssen Sie eine Steckdose erstellen. So können Sie die zugehörigen Werte mithilfe von Code ändern. Dazu musst du zuerst den Assistant-Editor aktivieren. Dazu schließen Sie zuerst die Seitenleiste mit den Eigenschaften, indem Sie auf die entsprechende Schaltfläche klicken. (Diese Schaltfläche wurde im vorherigen Schritt angezeigt)

und dann die Assistant-Taste auswählen. Diese ist hier der doppelte Kreis:

e92dcc4ceea20a51

Vergewissere dich, dass sie die Datei „ViewController.h“ rendert. Falls nicht, können Sie dies über den Editor oben im Assistentenfenster ändern:

d42f0fcc18b84703

Ziehen Sie dann das Steuerelement bei gedrückter Strg-Taste unter die @-Schnittstellenzeile in der Datei „ViewController.h“ in Google Assistant. Ein Dialogfeld erscheint, in dem Sie gefragt werden, welche Art von Verbindung Sie herstellen möchten:

a44b7888ed0f62b

Prüfen Sie, ob die Einstellungen wie gezeigt sind („Verbindung: Outlet; Typ: UILabel; Speicher: schwach“) und geben Sie jedem einen Namen. In diesem Codelab habe ich die Labels „Längengrad“, „Breitengrad“ und „Höhe“ mit den Werten „lblLongitude“, „lblLatitude“ und „lblAltidude“ genannt. Ziehen Sie das große Label auch von unten nach oben und nennen Sie es „lblPlaces“.

Wenn Sie fertig sind, sollte Ihre ViewController.h-Datei 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 File for Location und Google Client APIs bearbeiten

Zuerst müssen Sie in der Header-Datei (ViewController.h) einige Variablen 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;

Abschließend müssen Sie die Header-Datei aktualisieren, damit die Klasse CLLocationManagerDelegate implementiert:

@interface ViewController : UIViewController<CLLocationManagerDelegate>

Wenn Sie fertig sind, sollte die Kopfzeile 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. Ansicht-Controller bearbeiten

Zuerst müssen Sie die Funktion „view DidLoad“ 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 der aktuelle Standort erfasst wird. 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 den View Controller mit Standortaktualisierungen zurück, indem er die Funktion DidUpdateLocations aufruft. Sie müssen dies zu „ViewController.m“ hinzufügen. Die Funktion sieht so aus:

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

Diese Funktion muss einige Dinge tun.

Zuerst wird der Standort im Cache mit dem zuletzt empfangenen gespeichert:

self.location = locations.lastObject;

Jetzt 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];

Sie rufen die Places API mit dem Places-Client auf. Geben Sie dazu die Callback-Funktion an, mit der die Liste der Orte wahrscheinlichkeiten abgerufen wird. Die Places API ermittelt anhand Ihres Standorts die Wahrscheinlichkeit, dass Sie sich an einem bestimmten Ort befinden. Sie gibt den Namen wahrscheinlicher Orte sowie einen Wert zwischen 0 und 1 zurück, 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 wiederholt, wobei Orte und Wahrscheinlichkeiten für diese Orte hinzugefügt werden.

[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 die Funktion „dadUpdateLocations“ 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;
    }];
}

Sie können Ihre Anwendung jetzt ausführen und testen.

11. App im Emulator ausführen

Führen Sie die App über die Schaltfläche „Ausführen“ in der Titelleiste aus. Außerdem können Sie hier den Ausführungstyp auswählen. Wie Sie hier sehen können, sehen Sie sich außerdem die iPhone-Funktionen auf dem iPhone 6 mit dem Emulator an.

bbbe0b8820c8a913

Wenn Sie auf „Ausführen“ klicken, wird die App erstellt und gestartet. Daraufhin wird die Anfrage angezeigt, die App auf den Standort zugreifen darf, einschließlich des zuvor festgelegten benutzerdefinierten Strings.

b9bb2ace7e68f186

Danach sehen Sie die Aktualisierung der Breiten- und Längengrade. Wählen Sie zum Ändern des Speicherorts das Menü „Fehlerbehebung“ aus und wählen Sie einen Standort aus. So können Sie z. B. die Option „Autobahn'

dcb1ce091d780f56.png

In diesem Fall wird der Ort mit den wahrscheinlichen Orten aktualisiert und die Autobahnfahrt simuliert.

649e3eeb2321ae03.png

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