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».
На следующем экране вам будет предложено выбрать шаблон для нового проекта. Выберите «Single View Application» для iOS и нажмите «Далее».
Когда вас попросят указать название продукта, вы можете выбрать любое имя, но обязательно запишите сгенерированный идентификатор пакета. Он понадобится вам позже.
Нажмите «Далее», и проект будет создан. Запомните каталог, в котором он создан. Закройте Xcode и с помощью терминала перейдите в этот каталог.
Используя Терминал, введите следующую команду:
pod init
Будет создан файл Podfile. Отредактируйте его, чтобы добавить модуль для GoogleMaps, например:
target '{YOUR APP NAME}' do
pod 'GoogleMaps'
end
Сохраните его и закройте Xcode. Обязательно закройте его, так как на следующем шаге вам предстоит редактировать базовый проект. После этого вы откроете другой файл проекта, и разработчики часто путаются, где всё находится, если они предварительно не закрыли Xcode! Теперь перейдите в терминал в каталог своего проекта и выполните команду 'pod install' следующим образом:
После завершения будут установлены модули и создан новый файл .xcworkspace. Используйте его для проекта в дальнейшем. Но перед написанием кода вам понадобится ключ API.
2. Получите свой ключ API
Для следующего шага включения включите Maps SDK для iOS .
Настройте платформу Google Карт
Если у вас еще нет учетной записи Google Cloud Platform и проекта с включенным выставлением счетов, ознакомьтесь с руководством « Начало работы с Google Maps Platform», чтобы создать учетную запись для выставления счетов и проект.
- В Cloud Console щелкните раскрывающееся меню проектов и выберите проект, который вы хотите использовать для этой кодовой лаборатории.
- Включите API и SDK платформы Google Карт, необходимые для этой лабораторной работы, в Google Cloud Marketplace . Для этого следуйте инструкциям в этом видео или в этой документации .
- Сгенерируйте ключ API на странице «Учётные данные» в Cloud Console. Вы можете следовать инструкциям в этом видео или в этой документации . Для всех запросов к платформе Google Карт требуется ключ API.
3. Создание приложения Places API
Теперь, когда вы создали консольный проект, активировали в нем API Places и получили ключ API, вы готовы приступить к написанию своего первого приложения API Places.
Ранее, при установке файлов pod, был создан новый файл .xcworkspace. Откройте его, дважды щёлкнув по нему.
В обозревателе проектов вы увидите новую папку «Pods». Если всё прошло успешно, вы увидите там папку GoogleMaps, содержащую фреймворки.
4. Отредактируйте файл Info.plist.
При первом запуске приложения iOS выведет диалоговое окно с просьбой предоставить разрешение на доступ к службам геолокации. В этом диалоговом окне будет указана строка, которую вы добавите в файл Info.plist. Если этой строки нет, диалоговое окно не отобразится, и приложение не будет работать.
Файл Info.plist можно найти в обозревателе проектов здесь:
Выберите его, и вы увидите редактор plist.
Наведите указатель мыши на любой элемент, и вы увидите значок «+». Нажмите на него, и появится новая запись. Введите в это поле значение «NSLocationAlwaysUsageDescription».
Нажмите Enter, чтобы добавить новый ключ. Затем дважды щёлкните столбец «Значение» для этого ключа и добавьте строку:
Более подробную информацию об этой строке можно найти в документации для разработчиков Apple здесь .
5. Отредактируйте своего делегата приложения
В обозревателе проекта найдите и откройте AppDelegate.m. Он понадобится вам для добавления ключа API.
В верхней части файла добавьте следующее сразу под строкой #import:
@import GoogleMaps;
Затем в функции didFinishLaunchingWithOptions: добавьте следующее около строки «return YES»:
[GMSServices provideAPIKey:@"<Add your API Key>"];
Обязательно используйте API-ключ, который вы сгенерировали ранее.
6. Отредактируйте файл раскадровки
В обозревателе проекта откройте файл Main.storyboard. Убедитесь, что боковая панель активна, нажав кнопку боковой панели в правом верхнем углу.
Затем в нижней части боковой панели найдите элемент управления Label, убедившись, что выбрана Библиотека объектов.
В сцене View Controller слева убедитесь, что выбрано «View»:
Затем перетащите 7 меток на область просмотра. Расположите их, как показано здесь. Убедитесь, что их размеры соответствуют отображаемым. Вы можете редактировать текст метки, дважды щёлкнув по ней и введя нужное значение:
Для самой нижней надписи (самой большой) перейдите в редактор свойств и убедитесь, что она имеет 0 строк (по умолчанию 1). Это позволит отображать несколько строк.
7. Создавайте возможности для выражения ценностей
Для трёх меток «значение» вам потребуется создать выход. Это позволит вам изменять их значения с помощью кода. Для этого сначала необходимо активировать помощник-редактор. Для этого сначала закройте боковую панель свойств, нажав на соответствующую кнопку. (Эта кнопка была показана на предыдущем шаге.)
Затем выберите кнопку помощника — она обозначена двойным кругом, как показано здесь:
Убедитесь, что он отображает файл ViewController.h. Если нет, вы можете настроить его таким образом, используя редактор в верхней части окна помощника:
Затем, удерживая клавишу CONTROL, перетащите каждую метку под строку @interface в файле ViewController.h в помощнике. Появится диалоговое окно с вопросом о типе соединения:
Убедитесь, что настройки соответствуют указанным (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 с помощью эмулятора.
После нажатия кнопки «Запустить» приложение будет собрано и запущено. Вы увидите запрос на доступ к данным о местоположении, включая указанную вами ранее строку.
После этого вы увидите обновление широты и долготы. Чтобы изменить местоположение, выберите меню «Отладка» и выберите местоположение. Например, можно выбрать «Freeway Drive».
После этого вы увидите, как местоположение и его вероятные места будут обновляться, имитируя движение по автостраде.
Вот и всё! Вы успешно получили доступ к текущей информации о месте с помощью API Google Places на iOS.