Pakiet SDK Miejsc na iOS – pierwsze kroki (Objective-C)

1. Zanim zaczniesz

Zanim zaczniesz kodować, musisz spełnić pewne wymagania wstępne, które musisz spełnić.

Xcode

W tym samouczku używamy narzędzia Xcode firmy Apple® wraz z językiem Objective-C do utworzenia prostej aplikacji dla systemu iOS, która jest uruchomiona w emulatorze. Nie potrzebujesz fizycznego urządzenia. Kod Xcode znajdziesz na https://developer.apple.com/xcode/

CocoaPods

Pakiet SDK Miejsc na iOS jest dostępny jako blok CocoaPods. CocoaPods to narzędzie do zarządzania zależnościami typu open source w projektach Swift i Objective-C. Jeśli nie masz jeszcze tego narzędzia, musisz je zainstalować, zanim przejdziesz dalej. Możesz go zainstalować z terminala w ten sposób:

sudo gem install cocoapods

Aby dowiedzieć się więcej o CocoaPods, zobacz Wprowadzenie do CocoaPods.

Instalowanie pakietu SDK

Aby zainstalować pakiet SDK, w katalogu projektu musisz utworzyć plik Podfile, którego będą używać CocoaPods do pobierania i konfigurowania zależności wymaganych. Najłatwiej zrobić to, tworząc nowy projekt w Xcode, dodając do niego plik Podfile i instalując w nim pody.

Uruchom Xcode, a zobaczysz ekran „Witamy w Xcode'. Wybierz „Utwórz nowy projekt Xcode”.

4f1ecee473937c7b.png

Na następnym ekranie pojawi się prośba o szablon dla nowego projektu. W aplikacji na iOS wybierz „Pojedynczy widok” i naciśnij „Dalej”.

Gdy pojawi się prośba o podanie nazwy produktu, możesz wybrać dowolną z nich. Pamiętaj jednak o zapisaniu wygenerowanego identyfikatora pakietu. Te informacje będą Ci potrzebne później.

72fbf25cb2db22ad.png

Naciśnij „Dalej”, a projekt zostanie utworzony za Ciebie. Zanotuj katalog, w którym został utworzony. Zamknij Xcode i przejdź do tego katalogu, używając terminala.

W terminalu wpisz to polecenie:

pod init

Zostanie utworzony plik Podfile. Edytuj go, aby dodać blok reklamowy do Map Google, podobny do tego:

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

Zapisz i zamknij Xcode. Pamiętaj, aby go zamknąć, ponieważ w następnym kroku przejdziesz do edycji głównego projektu. Kiedy skończysz, otwórz inny plik projektu, co często sprawia deweloperowi niepewność, co się stanie, jeśli wcześniej nie zamknął Xcode! W terminalu otwórz katalog projektu i uruchom polecenie „pod install&#39:

789c5bc62817f68a.png

Gdy skończysz, bloki reklamowe zostaną zainstalowane i zostanie utworzony nowy plik .xcworkspace. Od teraz używaj tego projektu. Teraz, przed rozpoczęciem programowania, potrzebny jest klucz interfejsu API.

2. Pobierz klucz interfejsu API

W następnym kroku włącz Pakiet SDK Map Google na iOS.

Konfigurowanie Google Maps Platform

Jeśli nie masz jeszcze konta Google Cloud Platform ani projektu z włączonymi płatnościami, przeczytaj przewodnik Pierwsze kroki z Google Maps Platform, by utworzyć konto rozliczeniowe i projekt.

  1. W Cloud Console kliknij menu projektu i wybierz projekt, którego chcesz użyć w tym ćwiczeniu z programowania.

  1. Włącz interfejsy API i pakiety SDK Google Maps Platform wymagane w ramach tego ćwiczenia z ćwiczeń w Google Cloud Marketplace. W tym celu wykonaj czynności opisane w tym filmie lub w tej dokumentacji.
  2. Wygeneruj klucz interfejsu API na stronie Dane logowania w Cloud Console. Odpowiednie instrukcje znajdziesz w tym filmie lub w tej dokumentacji. Wszystkie żądania wysyłane do Google Maps Platform wymagają klucza interfejsu API.

3. Tworzenie aplikacji Places API

Po utworzeniu projektu konsoli i aktywowaniu w nim interfejsu API Miejsc oraz uzyskaniu klucza interfejsu API możesz zacząć kodować swoją pierwszą aplikację Places API.

Wcześniej, gdy zainstalowano pliki podów, utworzono nowy plik .xcworkspace. Aby go otworzyć, kliknij go dwukrotnie.

19d62f34c08e645c.png

W eksploratorze projektu zobaczysz, że został utworzony nowy folder o nazwie „Pody'”. Jeśli to się uda, zobaczysz folder Mapy Google z platformami.

8844d861f64c61aa.png

4. Edytuj plik Info.plist.

Gdy uruchomisz aplikację po raz pierwszy, zobaczysz okno z prośbą o zgodę na dostęp do usług lokalizacyjnych. W tym oknie podasz zdefiniowany ciąg i umieścisz go w pliku Info.plist. Jeśli ten ciąg nie jest obecny, okno dialogowe nie będzie widoczne, a aplikacja nie będzie działać.

Plik Info.plist znajdziesz w eksploratorze projektu tutaj:

C224C920ab3f1ef.png

Wybierz go, a zobaczysz edytor plist.

859ca56f3b19da5.png

Najedź kursorem na dowolny element, by wyświetlić ikonę „+&#39”. Naciśnij go, a zobaczysz nowy wpis. Wpisz w tym polu wartość „NSLocationAlwaysUsageDescription&#39”.

9fb225d6f5508794

Naciśnij Enter, aby dodać nowy klawisz. Następnie kliknij dwukrotnie kolumnę Wartość dla tego klucza i dodaj do niego ciąg znaków:

5aefeb184187aa58.png

Więcej informacji o tym ciągu znajdziesz tutaj w dokumentacji dla programistów Apple.

5. Edytuj przedstawiciela

W eksploratorze projektu znajdź i otwórz aplikację AppPrzedstawiciel.m. Użyjesz jej, aby dodać klucz interfejsu API.

Na początku pliku dodaj go bezpośrednio pod wierszem #import:

@import GoogleMaps;

Następnie w funkcji didFinishLaunchingWithOptions: dodaj ten wiersz mniej więcej o wierszu „return YES'”:

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

Pamiętaj, aby użyć klucza interfejsu API wygenerowanego wcześniej.

6. Edytowanie pliku scenorysu

W eksploratorze projektu otwórz plik Main.storyboard. Aby upewnić się, że pasek boczny jest aktywny, naciśnij przycisk na pasku bocznym w prawym górnym rogu.

352af28b970d9e2.png

Następnie na dole paska bocznego znajdź element sterujący etykiet, wybierając opcję Biblioteka obiektów.

adec7051ae949531.png

Na scenie widoku kontrolera po lewej stronie wybierz „View'”.

e4827b92b5861e3e.png

Następnie przeciągnij i upuść 7 etykiet w widoku. Ułóż je w sposób pokazany tutaj. Pamiętaj, aby przeciągać rozmiary, by pasowały do widocznych elementów. Aby edytować tekst etykiety, kliknij go dwukrotnie i wpisz wymaganą wartość.

F8a9457772358069.png

W dolnej etykiecie (największej) otwórz edytor właściwości i upewnij się, że ma on 0 wierszy (domyślnie jest to 1). Umożliwi to renderowanie wielu wierszy.

a4abacf00d8888fe.png

7. Utwórz gniazdka dla wartości

Dla 3 wartości „value'” musisz utworzyć gniazdo. Umożliwi Ci to zmianę ich wartości za pomocą kodu. Aby to zrobić, musisz najpierw aktywować edytor asystenta. Aby to zrobić, najpierw zamknij pasek boczny, klikając odpowiedni przycisk. (W poprzednim kroku ten przycisk został wyświetlony)

Następnie kliknij przycisk Asystenta – jest to podwójny okrąg widoczny poniżej:

e92dcc4ceea20a51.png

Upewnij się, że jest to plik renderujący ViewViewler.h. Jeśli nie, możesz ją zmienić, korzystając z edytora u góry okna Asystenta:

D42f0fcc18b84703.png

Następnie, przytrzymując klawisz CONTROL, przeciągnij poszczególne etykiety i upuść je w wierszu @interface w pliku ViewController.h w Asystencie. Pojawi się okno z pytaniem, jaki typ połączenia chcesz nawiązać:

A44B7888ed0f62b.png

Upewnij się, że ustawienia są widoczne w takiej formie (Połączenie: Outlet; Typ: UILabel; Pamięć: Słabe), a następnie nadaj im nazwy. Na potrzeby tych ćwiczeń nazywałem je etykietami lblLongitude, lblLaheight i lblAltidude. Przeciągnij dużą etykietę z dołu na dół i nazwij ją lblPlaces.

Gdy skończysz, plik ViewController.h powinien wyglądać tak:

#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. Edytuj plik nagłówka dla interfejsów API lokalizacji i klienta Google

Przed ostatnimi krokami – tworzenia aplikacji do korzystania z interfejsu Places API, musisz skonfigurować jeszcze kilka zmiennych w pliku nagłówka (ViewController.h). Oto główny menedżer lokalizacji i obiekt podstawowej lokalizacji:

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

Potrzebujesz też klienta Google API:

@property GMSPlacesClient *placesClient;

Na koniec musisz zaktualizować plik nagłówka, tak aby klasa wdrożyła CLLocationManagerPrzedstawiciel:

@interface ViewController : UIViewController<CLLocationManagerDelegate>

Gdy skończysz, plik nagłówka powinien wyglądać tak:

#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. Edytowanie kontrolera widoku danych

Pierwszym krokiem jest zmodyfikowanie funkcji viewWeLoad w celu zainicjowania Menedżera lokalizacji, wysłania do użytkownika prośby o autoryzację dostępu do lokalizacji oraz uruchomienia Menedżera lokalizacji w celu śledzenia bieżącej lokalizacji. Zainicjujesz też klienta interfejsu Places API.

- (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. Obsługa aktualizacji lokalizacji

Menedżer lokalizacji odwróci się do kontrolera widoku danych z aktualizacją lokalizacji, wywołując funkcję didUpdateLocations. Musisz dodać to do elementu ViewController.m. Funkcja wygląda tak:

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

Ta funkcja będzie musiała wykonać kilka czynności.

Najpierw zostanie zapisany w pamięci podręcznej, a ostatnio wysłany:

self.location = locations.lastObject;

Następnie należy zaktualizować trzy etykiety szerokości i długości geograficznej:

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

Następnie wywołasz interfejs Places API za pomocą klienta Client. W tym celu należy określić funkcję wywołania zwrotnego, która pobiera listę prawdopodobieństw miejsca. Interfejs Places API określa prawdopodobieństwo, że jesteś w określonym miejscu na podstawie lokalizacji. Zwraca nazwę prawdopodobnego miejsca wraz z wartością od 0 do 1 zawierającą prawdopodobieństwo, że jesteś w tym miejscu.

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

Następnie możesz zaimplementować wywołanie zwrotne. Powtórzy to listę prawdopodobieństwa, dodając miejsca i prawdopodobieństwa w przypadku tych miejsc.

[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;
}];

Gdy skończysz, funkcja WasUpdateLocations powinna wyglądać tak:

-(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;
    }];
}

Teraz możesz uruchomić aplikację i przetestować ją.

11. Uruchamianie aplikacji w emulatorze

Uruchamiasz aplikację, używając przycisku uruchamiania na pasku tytułu. Pozwala to również wybrać typ uruchomienia, a jak widać tutaj, przeprowadzam testy na iPhonie 6 przy pomocy emulatora.

bbbe0b8820c8a913.png

Gdy naciśniesz przycisk uruchamiania, zostanie utworzona i uruchomiona aplikacja. Zobaczysz prośbę o zezwolenie aplikacji na dostęp do lokalizacji, w tym określony wcześniej niestandardowy ciąg znaków.

b9bb2ace7e68f186.png

Gdy to zrobisz, zobaczysz długość i szerokość geograficzną. Aby zmienić lokalizację, kliknij menu debugowania i wybierz lokalizację. Możesz na przykład wybrać trasę „Autostrada”

dcb1ce091d780f56.png

Gdy to zrobisz, zobaczysz lokalizację, w której jest prawdopodobne miejsce, i zostanie ona symulowana.

649e3eeb2321ae03.png

Gotowe! Udało Ci się wyświetlić aktualne informacje o miejscu, korzystając z interfejsu API Miejsc Google na iOS.