Следуйте инструкциям настоящего руководства по загрузке Google Places API for iOS, добавлению библиотеки и ее зависимостей в ваше приложение, а также получению бесплатного ключа API.
Примечания к выпуску публикуются для каждого выпуска.
Шаг 1. Установите последнюю версию Xcode
Для создания проекта с использованием Google Places API for iOS требуется Xcode 7.3 или более новой версии.
Шаг 2. Установите API
Использование CocoaPods
Google Places API for iOS предоставляется как две группы контейнеров CocoaPod. Первая из них, GooglePlaces, содержит все функции адресов, для которых не требуется карта (программные API и виджет подсказки мест для пользовательского интерфейса), а отдельная группа контейнеров GooglePlacePicker содержит виджет для поиска и выделения мест на карте.
CocoaPods – диспетчер зависимостей с открытым исходным кодом для проектов Cocoa на языках Swift и Objective-C. Если инструмент CocoaPods у вас еще не установлен, установите его в macOS, выполнив следующую команду через терминал: Дополнительную информацию см. в руководстве по началу работы с CocoaPods.
sudo gem install cocoapods
Создайте файл Podfile для Google Places API for iOS и используйте его для установки API и его зависимостей.
- Если у вас еще нет проекта Xcode, создайте его и сохраните на локальном компьютере. (Если вы раньше не занимались разработкой для iOS, создайте приложение с одним представлением).
- Создайте файл с именем
Podfileв каталоге своего проекта. Этот файл содержит определения зависимостей проекта. - Откройте
Podfileи добавьте в него свои зависимости. В этом примере указано имя вашего приложения, а также имена обеих групп контейнеров, получаемых вместе с Places API for iOS (GooglePlacePickerиGoogleMapsтребуются только в том случае, если вы используете пример с виджетом выбора мест):source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GooglePlaces' pod 'GooglePlacePicker' pod 'GoogleMaps' end
- Сохраните
Podfile. Откройте окно терминала и перейдите в каталог, содержащий
Podfile:cd <path-to-project>
Выполните команду
pod install. Эта команда устанавливает API, указанные вPodfile, а также все относящиеся к ним зависимости.pod install
Закройте проект Xcode, а затем откройте (двойным щелчком) файл
.xcworkspaceвашего проекта для запуска Xcode. С этого момента для открытия проекта необходимо использовать файл.xcworkspace.
Установка вручную
В этом руководстве разъясняется, как вручную добавить платформу GooglePlaces в проект и настроить параметры сборки в Xcode.
- Загрузите исходные файлы SDK:
GooglePlacePicker-2.0.1 требуется, только если вы используете выбор мест.
- Распакуйте исходные файлы.
- Запустите Xcode, после чего либо откройте существующий проект, либо создайте новый. Если вы раньше не занимались разработкой для iOS, создайте приложение с одним представлением, отключите режим Use Storyboards и включите режим Use Automatic Reference Counting.
- Удалите все комплекты пакеты Google Maps предыдущих версий из своего проекта.
- Перенесите следующие пакеты в свой проект (при появлении соответствующего запроса выберите Copy items if needed):
GooglePlaces-2.0.1/Frameworks/GooglePlaces.frameworkGoogleMaps-2.0.1/Subspecs/Base/Frameworks/GoogleMapsBase.framework
Если вы используете выбор мест, перенесите в свой проект следующие пакеты (в дополнение к вышеперечисленным):
GooglePlacePicker-2.0.1/Frameworks/GooglePlacePicker.frameworkGoogleMaps-2.0.1/Subspecs/Maps/Frameworks/GoogleMapsCore.frameworkGoogleMaps-2.0.1/Subspecs/Maps/Frameworks/GoogleMaps.framework
- В своем проекте щелкните правой кнопкой
GooglePlaces.frameworkи выберите Show In Finder. - Перенесите
GooglePlaces.bundleиз папкиResourcesв свой проект. При появлении соответствующего запроса убедитесь, что режим Copy items into destination group's folder не выбран. - Если вы используете выбор мест, повторите предыдущий шаг и перенесите в проект файлы
GoogleMaps.bundleиGooglePlacePicker.bundle. Их можно найти вGoogleMaps.frameworkиGooglePlacePicker.frameworkсоответственно. - В Project Navigator найдите свой проект и выберите назначение своего приложения.
- Перейдите на вкладку Build Phases и в Link Binary with Libraries добавьте следующие компоненты:
GooglePlaces.frameworkGoogleMapsBase.frameworkGooglePlacePicker.framework(только если используется выбор мест)GoogleMapsCore.framework(только если используется выбор мест)GoogleMaps.framework(только если используется выбор мест)Accelerate.frameworkCoreData.frameworkCoreGraphics.frameworkCoreLocation.frameworkCoreText.frameworkGLKit.frameworkImageIO.frameworklibc++.tbdlibz.tbdOpenGLES.frameworkQuartzCore.frameworkSystemConfiguration.frameworkUIKit.framework
Вместо конкретного назначения выберите свой проект и перейдите на вкладку Build Settings.
- В разделе Other Linker Flags добавьте
-ObjC. Если эти параметры не отображаются, на панели Build Settings измените фильтр – вместо Basic выберите All.
Шаг 3. Получите ключ API
Для начала использования Google Places API for iOS нажмите кнопку ниже, чтобы перейти к инструкциям по активации Google Places API for iOS и получению ключа API.
Получить ключВ качестве альтернативы выполните следующие действия, чтобы получить ключ API.
- Перейдите в Google API Console.
- Создайте или выберите проект.
- Нажмите Continue для активации Google Places API for iOS.
- На странице Учетные данные выберите Ключ API.
Примечание. Если у вас есть ключ с ограничениями для iOS, можете использовать этот ключ. В одном проекте можно использовать один и тот же ключ с любыми приложениями для iOS. - В окне с отображаемым ключом API выберите Restrict key, чтобы установить ограничение iOS для ключа API.
- В разделе Restrictions выберите iOS apps и укажите идентификатор пакета своего приложения. Например:
com.example.helloplaces. - Нажмите Save.
Новый ключ для iOS появится в списке ключей API вашего проекта. Ключ API представляет собой строку символов, которая выглядит примерно так:
AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0
Также можно выполнить поиск существующего ключа в Google API Console.
Дополнительную информацию об использовании Google API Console см. в Справке API Console.
Шаг 4. Добавьте ключ API в свое приложение
В следующих примерах кода показано, как добавить ключ API в приложение.
Добавьте свой ключ API в файл AppDelegate.swift, как показано ниже:
- Добавьте следующую команду импорта:
import GooglePlaces
- Добавьте в метод
application(_:didFinishLaunchingWithOptions:)следующую строку, заменив YOUR_API_KEY своим ключом API:GMSPlacesClient.provideAPIKey("YOUR_API_KEY")
Добавьте свой ключ API в файл AppDelegate.m, как показано ниже:
- Добавьте следующую команду импорта:
@import GooglePlaces;
- Добавьте в метод
application:didFinishLaunchingWithOptions:следующую строку, заменив YOUR_API_KEY своим ключом API:[GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];
Шаг 5. Подготовка программного кода
В следующих примерах кода показано, как узнать текущее место и добавить виджет выбора мест в приложение.
Получение информации о текущем месте
Swift
import UIKit
import GooglePlaces
class ViewController: UIViewController {
var placesClient: GMSPlacesClient!
// Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
@IBOutlet var nameLabel: UILabel!
@IBOutlet var addressLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
placesClient = GMSPlacesClient.shared()
}
// Add a UIButton in Interface Builder, and connect the action to this function.
@IBAction func getCurrentPlace(_ sender: UIButton) {
placesClient.currentPlace(callback: { (placeLikelihoodList, error) -> Void in
if let error = error {
print("Pick Place error: \(error.localizedDescription)")
return
}
self.nameLabel.text = "No current place"
self.addressLabel.text = ""
if let placeLikelihoodList = placeLikelihoodList {
let place = placeLikelihoodList.likelihoods.first?.place
if let place = place {
self.nameLabel.text = place.name
self.addressLabel.text = place.formattedAddress?.components(separatedBy: ", ")
.joined(separator: "\n")
}
}
})
}
}
Objective-C
#import "ViewController.h"
@import GooglePlaces;
@interface ViewController ()
// Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *addressLabel;
@end
@implementation ViewController {
GMSPlacesClient *_placesClient;
}
- (void)viewDidLoad {
[super viewDidLoad];
_placesClient = [GMSPlacesClient sharedClient];
}
// Add a UIButton in Interface Builder, and connect the action to this function.
- (IBAction)getCurrentPlace:(UIButton *)sender {
[_placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *placeLikelihoodList, NSError *error){
if (error != nil) {
NSLog(@"Pick Place error %@", [error localizedDescription]);
return;
}
self.nameLabel.text = @"No current place";
self.addressLabel.text = @"";
if (placeLikelihoodList != nil) {
GMSPlace *place = [[[placeLikelihoodList likelihoods] firstObject] place];
if (place != nil) {
self.nameLabel.text = place.name;
self.addressLabel.text = [[place.formattedAddress componentsSeparatedByString:@", "]
componentsJoinedByString:@"\n"];
}
}
}];
}
@end
Добавление средства выбора мест
В числе демонстрационных приложений SDK в комплекте Google Places API for iOS имеется пример приложения виджета выбора мест. Для установки демонстрационного приложения с виджетом выбора мест используйте команду pod try GooglePlacePicker. Дополнительную информацию см. в руководстве по примерам кода.
Ниже приведены краткие примеры создания виджета выбора мест.
Swift
import UIKit
import GooglePlacePicker
class ViewController: UIViewController {
// Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
@IBOutlet var nameLabel: UILabel!
@IBOutlet var addressLabel: UILabel!
// Add a UIButton in Interface Builder, and connect the action to this function.
@IBAction func pickPlace(_ sender: UIButton) {
let center = CLLocationCoordinate2D(latitude: 37.788204, longitude: -122.411937)
let northEast = CLLocationCoordinate2D(latitude: center.latitude + 0.001, longitude: center.longitude + 0.001)
let southWest = CLLocationCoordinate2D(latitude: center.latitude - 0.001, longitude: center.longitude - 0.001)
let viewport = GMSCoordinateBounds(coordinate: northEast, coordinate: southWest)
let config = GMSPlacePickerConfig(viewport: viewport)
let placePicker = GMSPlacePicker(config: config)
placePicker.pickPlace(callback: {(place, error) -> Void in
if let error = error {
print("Pick Place error: \(error.localizedDescription)")
return
}
if let place = place {
self.nameLabel.text = place.name
self.addressLabel.text = place.formattedAddress?.components(separatedBy: ", ")
.joined(separator: "\n")
} else {
self.nameLabel.text = "No place selected"
self.addressLabel.text = ""
}
})
}
}
Objective-C
#import "ViewController.h"
@import GooglePlacePicker;
@interface ViewController ()
// Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *addressLabel;
@end
@implementation ViewController {
GMSPlacePicker *_placePicker;
}
// Add a UIButton in Interface Builder, and connect the action to this function.
- (IBAction)pickPlace:(UIButton *)sender {
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37.788204, -122.411937);
CLLocationCoordinate2D northEast = CLLocationCoordinate2DMake(center.latitude + 0.001,
center.longitude + 0.001);
CLLocationCoordinate2D southWest = CLLocationCoordinate2DMake(center.latitude - 0.001,
center.longitude - 0.001);
GMSCoordinateBounds *viewport = [[GMSCoordinateBounds alloc] initWithCoordinate:northEast
coordinate:southWest];
GMSPlacePickerConfig *config = [[GMSPlacePickerConfig alloc] initWithViewport:viewport];
_placePicker = [[GMSPlacePicker alloc] initWithConfig:config];
[_placePicker pickPlaceWithCallback:^(GMSPlace *place, NSError *error) {
if (error != nil) {
NSLog(@"Pick Place error %@", [error localizedDescription]);
return;
}
if (place != nil) {
self.nameLabel.text = place.name;
self.addressLabel.text = [[place.formattedAddress
componentsSeparatedByString:@", "] componentsJoinedByString:@"\n"];
} else {
self.nameLabel.text = @"No place selected";
self.addressLabel.text = @"";
}
}];
}
@end