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

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

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

Xкод

В этом руководстве используется инструмент Apple Xcode вместе с языком 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, добавить к нему подфайл и установить туда модули.

Откройте 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! Теперь в терминале перейдите в каталог вашего проекта и запустите «установку модуля» следующим образом:

789c5bc62817f68a.png

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

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

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

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

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

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

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

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

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

Раньше, когда вы устанавливали файлы модуля, для вас создавался новый файл .xcworkspace. Откройте это, дважды щелкнув по нему.

19d62f34c08e645c.png

Вы заметите в Project Explorer, что теперь у вас есть новая папка под названием «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

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

adec7051ae949531.png

В сцене контроллера представления с левой стороны убедитесь, что выбрано «Вид»:

e4827b92b5861e3e.png

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

f8a9457772358069.png

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

a4abacf00d8888fe.png

7. Создайте точки выхода для ценностей

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

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

e92dcc4ceea20a51.png

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

d42f0fcc18b84703.png

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

a44b7888ed0f62b.png

Убедитесь, что параметры указаны так, как показано (Подключение: Розетка; Тип: UILabel; Хранилище: Слабое), а затем дайте каждому имя. Для целей этой кодовой лаборатории я назвал метки Longitude, Latitude и Altitude 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, чтобы инициализировать диспетчер местоположений, запросить авторизацию пользователя для доступа к местоположению и, наконец, запустить диспетчер местоположений, чтобы он отслеживал текущее местоположение. Вы также инициализируете клиент Google 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. Обработка обновлений местоположения

Диспетчер местоположений перезвонит вашему контроллеру представления с обновлениями местоположения, вызвав функцию 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];

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

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