Начало работы с Places SDK для iOS (Objective-C)

1. Прежде чем начать

Прежде чем приступить к кодированию, вам необходимо выполнить несколько предварительных условий.

Xcode

В этом руководстве используется инструмент Xcode от Apple и язык программирования Objective-C для создания простого приложения для iOS, работающего в эмуляторе. Физическое устройство не требуется. Xcode можно скачать по адресу https://developer.apple.com/xcode/

CocoaPods

Places SDK для iOS доступен в виде модуля CocoaPods. CocoaPods — это инструмент управления зависимостями с открытым исходным кодом для проектов Swift и Objective-C. Если у вас ещё нет этого инструмента, вам необходимо установить его, прежде чем продолжить. Установить его можно из терминала следующим образом:

sudo gem install cocoapods

Более подробную информацию о CocoaPods можно найти в руководстве по началу работы с CocoaPods.

Установка SDK

Для установки SDK необходимо создать Podfile в каталоге проекта, который CocoaPods будет использовать для загрузки и настройки необходимых зависимостей. Проще всего это сделать, создав новый проект в Xcode, добавив в него Podfile и установив модули в него.

Откройте Xcode, и вы увидите экран «Добро пожаловать в Xcode». Здесь выберите «Создать новый проект Xcode».

4f1ecee473937c7b.png

На следующем экране вам будет предложено выбрать шаблон для нового проекта. Выберите «Single View Application» для iOS и нажмите «Далее».

Когда вас попросят указать название продукта, вы можете выбрать любое имя, но обязательно запишите сгенерированный идентификатор пакета. Он понадобится вам позже.

72fbf25cb2db22ad.png

Нажмите «Далее», и проект будет создан. Запомните каталог, в котором он создан. Закройте Xcode и с помощью терминала перейдите в этот каталог.

Используя Терминал, введите следующую команду:

pod init

Будет создан файл Podfile. Отредактируйте его, чтобы добавить модуль для GoogleMaps, например:

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

Сохраните его и закройте Xcode. Обязательно закройте его, так как на следующем шаге вам предстоит редактировать базовый проект. После этого вы откроете другой файл проекта, и разработчики часто путаются, где всё находится, если они предварительно не закрыли Xcode! Теперь перейдите в терминал в каталог своего проекта и выполните команду 'pod install' следующим образом:

789c5bc62817f68a.png

После завершения будут установлены модули и создан новый файл .xcworkspace. Используйте его для проекта в дальнейшем. Но перед написанием кода вам понадобится ключ API.

2. Получите свой ключ API

Для следующего шага включения включите Maps SDK для iOS .

Настройте платформу Google Карт

Если у вас еще нет учетной записи Google Cloud Platform и проекта с включенным выставлением счетов, ознакомьтесь с руководством « Начало работы с Google Maps Platform», чтобы создать учетную запись для выставления счетов и проект.

  1. В Cloud Console щелкните раскрывающееся меню проектов и выберите проект, который вы хотите использовать для этой кодовой лаборатории.

  1. Включите API и SDK платформы Google Карт, необходимые для этой лабораторной работы, в Google Cloud Marketplace . Для этого следуйте инструкциям в этом видео или в этой документации .
  2. Сгенерируйте ключ API на странице «Учётные данные» в Cloud Console. Вы можете следовать инструкциям в этом видео или в этой документации . Для всех запросов к платформе Google Карт требуется ключ API.

3. Создание приложения Places API

Теперь, когда вы создали консольный проект, активировали в нем API Places и получили ключ API, вы готовы приступить к написанию своего первого приложения API Places.

Ранее, при установке файлов pod, был создан новый файл .xcworkspace. Откройте его, дважды щёлкнув по нему.

19d62f34c08e645c.png

В обозревателе проектов вы увидите новую папку «Pods». Если всё прошло успешно, вы увидите там папку GoogleMaps, содержащую фреймворки.

8844d861f64c61aa.png

4. Отредактируйте файл Info.plist.

При первом запуске приложения iOS выведет диалоговое окно с просьбой предоставить разрешение на доступ к службам геолокации. В этом диалоговом окне будет указана строка, которую вы добавите в файл Info.plist. Если этой строки нет, диалоговое окно не отобразится, и приложение не будет работать.

Файл Info.plist можно найти в обозревателе проектов здесь:

c224c920ab3f1ef.png

Выберите его, и вы увидите редактор plist.

859ca56f3b19da5.png

Наведите указатель мыши на любой элемент, и вы увидите значок «+». Нажмите на него, и появится новая запись. Введите в это поле значение «NSLocationAlwaysUsageDescription».

9fb225d6f5508794.png

Нажмите Enter, чтобы добавить новый ключ. Затем дважды щёлкните столбец «Значение» для этого ключа и добавьте строку:

5aefeb184187aa58.png

Более подробную информацию об этой строке можно найти в документации для разработчиков Apple здесь .

5. Отредактируйте своего делегата приложения

В обозревателе проекта найдите и откройте AppDelegate.m. Он понадобится вам для добавления ключа API.

В верхней части файла добавьте следующее сразу под строкой #import:

@import GoogleMaps;

Затем в функции didFinishLaunchingWithOptions: добавьте следующее около строки «return YES»:

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

Обязательно используйте API-ключ, который вы сгенерировали ранее.

6. Отредактируйте файл раскадровки

В обозревателе проекта откройте файл Main.storyboard. Убедитесь, что боковая панель активна, нажав кнопку боковой панели в правом верхнем углу.

352af28b970d9e2.png

Затем в нижней части боковой панели найдите элемент управления Label, убедившись, что выбрана Библиотека объектов.

adec7051ae949531.png

В сцене View Controller слева убедитесь, что выбрано «View»:

e4827b92b5861e3e.png

Затем перетащите 7 меток на область просмотра. Расположите их, как показано здесь. Убедитесь, что их размеры соответствуют отображаемым. Вы можете редактировать текст метки, дважды щёлкнув по ней и введя нужное значение:

f8a9457772358069.png

Для самой нижней надписи (самой большой) перейдите в редактор свойств и убедитесь, что она имеет 0 строк (по умолчанию 1). Это позволит отображать несколько строк.

a4abacf00d8888fe.png

7. Создавайте возможности для выражения ценностей

Для трёх меток «значение» вам потребуется создать выход. Это позволит вам изменять их значения с помощью кода. Для этого сначала необходимо активировать помощник-редактор. Для этого сначала закройте боковую панель свойств, нажав на соответствующую кнопку. (Эта кнопка была показана на предыдущем шаге.)

Затем выберите кнопку помощника — она обозначена двойным кругом, как показано здесь:

e92dcc4ceea20a51.png

Убедитесь, что он отображает файл ViewController.h. Если нет, вы можете настроить его таким образом, используя редактор в верхней части окна помощника:

d42f0fcc18b84703.png

Затем, удерживая клавишу CONTROL, перетащите каждую метку под строку @interface в файле ViewController.h в помощнике. Появится диалоговое окно с вопросом о типе соединения:

a44b7888ed0f62b.png

Убедитесь, что настройки соответствуют указанным (Connection: Outlet; Type: UILabel; Storage: Weak), и дайте каждому из них имя. Для целей этой практической работы я назвал метки долготы, широты и высоты lblLongitude, lblLatitude и lblAltidude соответственно. Также перетащите большую метку снизу и назовите её lblPlaces.

Когда вы закончите, ваш файл ViewController.h должен выглядеть так:

#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. Отредактируйте заголовочный файл для API местоположения и клиента Google.

Перед последними этапами — сборкой приложения для использования API мест — необходимо настроить ещё несколько переменных в заголовочном файле (ViewController.h). Это Core Location Manager и объект Core Location:

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

Вам также понадобится клиент Google API:

@property GMSPlacesClient *placesClient;

Наконец, вам необходимо обновить заголовочный файл, чтобы класс реализовал CLLocationManagerDelegate:

@interface ViewController : UIViewController<CLLocationManagerDelegate>

Когда вы закончите, ваш заголовочный файл должен выглядеть следующим образом:

#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. Отредактируйте свой контроллер представления

Первый шаг — отредактировать функцию viewDidLoad для инициализации менеджера местоположений, запроса разрешения пользователя на доступ к данным о местоположении и, наконец, запуска менеджера местоположений, чтобы он отслеживал текущее местоположение. Также необходимо инициализировать клиент 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. Обрабатывайте обновления местоположения

Менеджер местоположения будет обращаться к вашему View Controller с обновлениями местоположения, вызывая функцию didUpdateLocations. Вам необходимо добавить её в файл ViewController.m. Функция выглядит следующим образом:

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

Эта функция должна будет выполнять несколько действий.

Во-первых, он кэширует местоположение с последним полученным значением:

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

Далее вы вызовете API Places с помощью клиента Places. Это делается путем указания функции обратного вызова, которая получит список вероятностей мест. API Places определяет вероятность вашего нахождения в определенном месте на основе вашего местоположения. Он возвращает название вероятного места и значение от 0 до 1, содержащее вероятность вашего нахождения в этом месте.

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

Затем можно реализовать обратный вызов. Он будет проходить по списку вероятностей, добавляя места и вероятности для этих мест.

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

Когда вы закончите, ваша функция didUpdateLocations должна выглядеть так:

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

Теперь вы готовы запустить свое приложение и протестировать его!

11. Запуск приложения в эмуляторе

Запуск приложения осуществляется кнопкой «Запустить» в строке заголовка. Здесь же можно выбрать тип запуска. Как видите, я тестирую приложение на iPhone 6 с помощью эмулятора.

bbbe0b8820c8a913.png

После нажатия кнопки «Запустить» приложение будет собрано и запущено. Вы увидите запрос на доступ к данным о местоположении, включая указанную вами ранее строку.

b9bb2ace7e68f186.png

После этого вы увидите обновление широты и долготы. Чтобы изменить местоположение, выберите меню «Отладка» и выберите местоположение. Например, можно выбрать «Freeway Drive».

dcb1ce091d780f56.png

После этого вы увидите, как местоположение и его вероятные места будут обновляться, имитируя движение по автостраде.

649e3eeb2321ae03.png

Вот и всё! Вы успешно получили доступ к текущей информации о месте с помощью API Google Places на iOS.