모든 준비를 마쳤습니다!

개발을 시작하려면 개발자 문서로 이동하세요.

Google Places API for iOS 활성화

개발을 시작하기 위해 Google Developers Console에서 우선적으로 해야 할 일을 몇 가지 소개하겠습니다.

  1. 프로젝트 생성 또는 선택
  2. Google Places API for iOS 활성화
  3. 적합한 키 생성
계속

장소 자동완성

Google Places API for iOS의 자동완성 서비스는 사용자 검색 쿼리에 대한 응답으로 장소 예상 검색어를 반환합니다. 자동완성 서비스는 사용자가 입력하는 중에 사업체, 주소, 관심 지점 등의 제안을 반환합니다.

다음과 같은 방식으로 자동완성을 앱에 추가할 수 있습니다.

자동완성 UI 컨트롤 추가

자동완성 UI 컨트롤은 자동완성 기능이 기본 제공되는 검색 대화상자입니다. 이 컨트롤은 사용자가 검색어를 입력하는 중에 예상 장소의 목록을 표시합니다. 사용자가 선택을 하면, GMSPlace 인스턴스가 반환되며 앱이 이 인스턴스를 사용하여 선택한 장소에 대한 세부정보를 가져올 수 있습니다.

다음과 같은 방식으로 자동완성 UI 컨트롤을 앱에 추가할 수 있습니다.

전체 화면 컨트롤 추가

모달 컨텍스트를 원하는 경우에는 전체 화면 컨트롤을 사용하세요. 이 경우 사용자가 선택을 할 때까지 자동완성 UI가 앱 UI를 임시로 대체합니다. 이 기능은 GMSAutocompleteViewController 클래스에 의해 제공됩니다. 사용자가 장소를 선택하면 앱이 콜백을 수신합니다.

전체 화면 컨트롤을 앱에 추가하려면:

  1. 기본 앱에서 자동완성 UI 컨트롤을 실행하는 UI 요소를 만듭니다(예: UIButton의 터치 핸들러).
  2. GMSAutocompleteViewControllerDelegate 프로토콜을 상위 뷰 컨트롤러에 구현합니다.
  3. GMSAutocompleteViewController 인스턴스를 만들고 상위 뷰 컨트롤러를 대리자 속성으로 할당합니다.
  4. [self presentViewController...]를 사용하여 GMSAutocompleteViewController를 표시합니다.
  5. didAutocompleteWithPlace 대리자 메서드에서 사용자의 선택을 처리합니다.
  6. didAutocompleteWithPlace, didFailAutocompleteWithErrorwasCancelled 대리자 메서드에서 컨트롤러를 해제합니다.

다음 예시에서는 사용자가 버튼을 누를 때 이에 반응하여 GMSAutocompleteViewController를 실행하는 한 가지 방법을 보여줍니다.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  // Present the Autocomplete view controller when the button is pressed.
  @IBAction func autocompleteClicked(_ sender: UIButton) {
    let autocompleteController = GMSAutocompleteViewController()
    autocompleteController.delegate = self
    present(autocompleteController, animated: true, completion: nil)
  }
}

extension ViewController: GMSAutocompleteViewControllerDelegate {

  // Handle the user's selection.
  func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
    dismiss(animated: true, completion: nil)
  }

  func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) {
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // User canceled the operation.
  func wasCancelled(_ viewController: GMSAutocompleteViewController) {
    dismiss(animated: true, completion: nil)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }

}

Objective-C

#import "ViewController.h"
#import <GooglePlaces/GooglePlaces.h>

@interface ViewController () <GMSAutocompleteViewControllerDelegate>

@end

@implementation ViewController

...

// Present the autocomplete view controller when the button is pressed.
- (IBAction)onLaunchClicked:(id)sender {
  GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init];
  acController.delegate = self;
  [self presentViewController:acController animated:YES completion:nil];
}

// Handle the user's selection.
- (void)viewController:(GMSAutocompleteViewController *)viewController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  // Do something with the selected place.
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)viewController:(GMSAutocompleteViewController *)viewController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// User canceled the operation.
- (void)wasCancelled:(GMSAutocompleteViewController *)viewController {
  [self dismissViewControllerAnimated:YES completion:nil];
}

// Turn the network activity indicator on and off again.
- (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)didUpdateAutocompletePredictions:(GMSAutocompleteViewController *)viewController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

@end

결과 컨트롤러 추가

텍스트 입력 UI보다 더 많은 제어를 원한다면 결과 컨트롤러를 사용하세요. 결과 컨트롤러는 입력된 UI 포커스에 따라 결과 표시 여부를 동적으로 전환합니다.

결과 컨트롤러를 앱에 추가하려면:

  1. GMSAutocompleteResultsViewController를 만듭니다.
  2. GMSAutocompleteResultsViewControllerDelegate 프로토콜을 상위 뷰 컨트롤러에 구현하고 상위 뷰 컨트롤러를 대리자 속성으로서 할당합니다.
  3. UISearchController 객체를 만들고, GMSAutocompleteResultsViewController를 결과 컨트롤러 인수로 전달합니다.
  4. GMSAutocompleteResultsViewControllerUISearchControllersearchResultsUpdater 속성으로서 설정합니다.
  5. UISearchControllersearchBar를 앱 UI에 추가합니다.
  6. didAutocompleteWithPlace 대리자 메서드에서 사용자의 선택을 처리합니다.

UISearchController의 검색 창을 앱 UI에 배치할 수 있는 여러 가지 방법이 있습니다.

검색 창을 탐색 모음에 추가

다음 코드 예시에서는 결과 컨트롤러 추가하고, searchBar를 탐색 모음에 추가하고, 사용자 선택을 처리하는 방법을 보여줍니다.

Swift

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    // Put the search bar in the navigation bar.
    searchController?.searchBar.sizeToFit()
    navigationItem.titleView = searchController?.searchBar

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true

    // Prevent the navigation bar from being hidden when searching.
    searchController?.hidesNavigationBarDuringPresentation = false
  }
}

// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

- (void)viewDidLoad {
  _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
  _resultsViewController.delegate = self;

  _searchController = [[UISearchController alloc]
                       initWithSearchResultsController:_resultsViewController];
  _searchController.searchResultsUpdater = _resultsViewController;

  // Put the search bar in the navigation bar.
  [_searchController.searchBar sizeToFit];
  self.navigationItem.titleView = _searchController.searchBar;

  // When UISearchController presents the results view, present it in
  // this view controller, not one further up the chain.
  self.definesPresentationContext = YES;

  // Prevent the navigation bar from being hidden when searching.
  _searchController.hidesNavigationBarDuringPresentation = NO;
}

// Handle the user's selection.
- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
  didAutocompleteWithPlace:(GMSPlace *)place {
    _searchController.active = NO;
    // Do something with the selected place.
    NSLog(@"Place name %@", place.name);
    NSLog(@"Place address %@", place.formattedAddress);
    NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
- (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

참고: 검색 창이 올바로 표시되려면, 앱의 뷰 컨트롤러가 UINavigationController 내에 포함되어야 합니다.

검색 창을 뷰 상단에 추가

다음 코드 예시에서는 searchBar를 뷰 위에 추가하는 방법을 보여줍니다.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    let subView = UIView(frame: CGRect(x: 0, y: 65.0, width: 350.0, height: 45.0))

    subView.addSubview((searchController?.searchBar)!)
    view.addSubview(subView)
    searchController?.searchBar.sizeToFit()
    searchController?.hidesNavigationBarDuringPresentation = false

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true
  }
}

// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

- (void)viewDidLoad {
    [super viewDidLoad];

    _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
    _resultsViewController.delegate = self;

    _searchController = [[UISearchController alloc]
                             initWithSearchResultsController:_resultsViewController];
    _searchController.searchResultsUpdater = _resultsViewController;

    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 65.0, 250, 50)];

    [subView addSubview:_searchController.searchBar];
    [_searchController.searchBar sizeToFit];
    [self.view addSubview:subView];

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    self.definesPresentationContext = YES;
}

// Handle the user's selection.
- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  // Do something with the selected place.
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
- (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

기본적으로, UISearchController는 표시할 때 탐색 모음을 숨깁니다(이 기능을 해제할 수 있음). 탐색 모음이 보이지만 불투명한 경우, UISearchController가 배치를 올바로 설정하지 못합니다. 해결 방법으로 다음 코드를 사용하세요.

Swift

navigationController?.navigationBar.translucent = false
searchController?.hidesNavigationBarDuringPresentation = false

// This makes the view area include the nav bar even though it is opaque.
// Adjust the view placement down.
self.extendedLayoutIncludesOpaqueBars = true
self.edgesForExtendedLayout = .top

Objective-C

self.navigationController.navigationBar.translucent = NO;
_searchController.hidesNavigationBarDuringPresentation = NO;

// This makes the view area include the nav bar even though it is opaque.
// Adjust the view placement down.
self.extendedLayoutIncludesOpaqueBars = YES;
self.edgesForExtendedLayout = UIRectEdgeTop;

팝업 결과를 사용하여 검색 창 추가

다음 코드 예시에서는 검색 창을 탐색 모음 오른쪽에 배치하고 결과를 팝업에 표시하는 방법을 보여줍니다.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    // Add the search bar to the right of the nav bar,
    // use a popover to display the results.
    // Set an explicit size as we don't want to use the entire nav bar.
    searchController?.searchBar.frame = (CGRect(x: 0, y: 0, width: 250.0, height: 44.0))
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: (searchController?.searchBar)!)

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true

    // Keep the navigation bar visible.
    searchController?.hidesNavigationBarDuringPresentation = false
    searchController?.modalPresentationStyle = .popover
  }
}
// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];

  _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
  _resultsViewController.delegate = self;

  _searchController = [[UISearchController alloc]
                           initWithSearchResultsController:_resultsViewController];
  _searchController.searchResultsUpdater = _resultsViewController;

  // Add the search bar to the right of the nav bar,
  // use a popover to display the results.
  // Set an explicit size as we don't want to use the entire nav bar.
  _searchController.searchBar.frame = CGRectMake(0, 0, 250.0f, 44.0f);
  self.navigationItem.rightBarButtonItem =
  [[UIBarButtonItem alloc] initWithCustomView:_searchController.searchBar];

  // When UISearchController presents the results view, present it in
  // this view controller, not one further up the chain.
  self.definesPresentationContext = YES;

  // Keep the navigation bar visible.
  _searchController.hidesNavigationBarDuringPresentation = NO;

  _searchController.modalPresentationStyle = UIModalPresentationPopover;
}

// Handle the user's selection.
- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
- (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

참고: 검색 창이 올바로 표시되려면, 앱의 뷰 컨트롤러가 UINavigationController 내에 포함되어야 합니다.

테이블 소스 데이터 사용

앱이 iOS 7을 지원해야 하는 경우, GMSAutocompleteTableDataSource 클래스를 사용하여 UISearchDisplayController.의 테이블 뷰를 구동할 수 있습니다.

GMSAutocompleteTableDataSource를 사용하여 검색 컨트롤러를 표시하려면:

  1. GMSAutocompleteTableDataSourceDelegateUISearchDisplayDelegate 프로토콜을 상위 뷰 컨트롤러에 구현합니다.
  2. GMSAutocompleteTableDataSource 인스턴스를 만들고 상위 뷰 컨트롤러를 대리자 속성으로 할당합니다.
  3. UISearchDisplayController.의 인스턴스를 만듭니다.
  4. UISearchControllersearchBar를 앱 UI에 추가합니다.
  5. didAutocompleteWithPlace 대리자 메서드에서 사용자의 선택을 처리합니다.
  6. didAutocompleteWithPlace, didFailAutocompleteWithErrorwasCancelled 대리자 메서드에서 컨트롤러를 해제합니다.

다음 코드 예시에서는 GMSAutocompleteTableDataSource 클래스를 사용하여 UISearchDisplayController의 테이블 뷰를 구동하는 방법을 보여줍니다.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController, UISearchDisplayDelegate {

  var searchBar: UISearchBar?
  var tableDataSource: GMSAutocompleteTableDataSource?
  var searchDisplayController: UISearchDisplayController?

  override func viewDidLoad() {
    super.viewDidLoad()

    searchBar = UISearchBar(CGRect(x: 0, y: 0, width: 250.0, height: 44.0))

    tableDataSource = GMSAutocompleteTableDataSource()
    tableDataSource?.delegate = self

    searchDisplayController = UISearchDisplayController(searchBar: searchBar!, contentsController: self)
    searchDisplayController?.searchResultsDataSource = tableDataSource
    searchDisplayController?.searchResultsDelegate = tableDataSource
    searchDisplayController?.delegate = self

    view.addSubview(searchBar!)
  }

  func didUpdateAutocompletePredictionsForTableDataSource(tableDataSource: GMSAutocompleteTableDataSource) {
    // Turn the network activity indicator off.
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false
    // Reload table data.
    searchDisplayController?.searchResultsTableView.reloadData()
  }

  func didRequestAutocompletePredictionsForTableDataSource(tableDataSource: GMSAutocompleteTableDataSource) {
    // Turn the network activity indicator on.
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    // Reload table data.
    searchDisplayController?.searchResultsTableView.reloadData()
  }

}

extension ViewController: GMSAutocompleteTableDataSourceDelegate {
  func tableDataSource(tableDataSource: GMSAutocompleteTableDataSource, didAutocompleteWithPlace place: GMSPlace) {
    searchDisplayController?.active = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool {
    tableDataSource?.sourceTextHasChanged(searchString)
    return false
  }

  func tableDataSource(tableDataSource: GMSAutocompleteTableDataSource, didFailAutocompleteWithError error: NSError) {
    // TODO: Handle the error.
    print("Error: \(error.description)")
  }

  func tableDataSource(tableDataSource: GMSAutocompleteTableDataSource, didSelectPrediction prediction: GMSAutocompletePrediction) -> Bool {
    return true
  }
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

  _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, 250.0f, 44.0f)];

  _tableDataSource = [[GMSAutocompleteTableDataSource alloc] init];
  _tableDataSource.delegate = self;

  _searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar
                                                               contentsController:self];
  _searchDisplayController.searchResultsDataSource = _tableDataSource;
  _searchDisplayController.searchResultsDelegate = _tableDataSource;
  _searchDisplayController.delegate = self;

  [self.view addSubview:_searchBar];
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
  [_tableDataSource sourceTextHasChanged:searchString];
  return NO;
}

// Handle the user's selection.
- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource
  didAutocompleteWithPlace:(GMSPlace *)place {
  [_searchDisplayController setActive:NO animated:YES];
  // Do something with the selected place.
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource
  didFailAutocompleteWithError:(NSError *)error {
  [_searchDisplayController setActive:NO animated:YES];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

- (void)didUpdateAutocompletePredictionsForTableDataSource:
  (GMSAutocompleteTableDataSource *)tableDataSource {
  // Turn the network activity indicator off.
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
  // Reload table data.
  [_searchDisplayController.searchResultsTableView reloadData];
}

- (void)didRequestAutocompletePredictionsForTableDataSource:
  (GMSAutocompleteTableDataSource *)tableDataSource {
  // Turn the network activity indicator on.
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
  // Reload table data.
  [_searchDisplayController.searchResultsTableView reloadData];
}

참고: UISearchDisplayController API는 비동기 데이터 업데이트라는 개념을 지원하지 않으므로, GMSAutoCompleteResultsDelegate 프로토콜의 didUpdateAutocompletePredictionsdidRequestAutocompletePredictions 메서드에 테이블 데이터를 다시 로드함으로써 테이블을 강제로 업데이트해야 합니다.

텍스트 및 배경색 사용자 지정

위젯 모양이 앱의 시각적 모양과 비슷하게 보이도록, 자동완성 UI 컨트롤의 모든 텍스트와 배경색을 설정할 수 있습니다. UI 컨트롤 색상을 설정하는 두 가지 방법이 있습니다.

  • 기본 iOS UIAppearance 프로토콜을 사용하여 UI 컨트롤의 스타일을 전역적으로 지정합니다(가능한 경우). 이들 설정은 UI 컨트롤 요소의 상당수에 적용되지만 전부에 적용되는 것은 아닙니다.
  • 위젯 클래스에서 SDK 메서드를 사용하여 UIAppearance 프로토콜.에 의해 지원되지 않는 속성을 설정합니다.

일반적으로 앱은 UIAppearance 프로토콜 및 SDK 메서드를 조합하여 사용합니다. 다음 다이어그램은 스타일 지정이 가능한 요소를 나타냅니다.

자동완성 UI 컨트롤 색상

다음 표는 모든 UI 요소를 나열하며, 각 요소에 스타일이 지정되는 방법을 나타냅니다(UIAppearance 프로토콜 또는 SDK 메서드).

UI 요소 메서드 스타일 지정 방법
탐색 모음 색조(배경) UIAppearance 프로토콜 UINavigationBar 프록시에서 setBarTintColor를 호출합니다.
탐색 모음 색조 색상(검색 창 텍스트 캐럿 및 취소 버튼) UIAppearance 프로토콜 UINavigationBar 프록시에서 setTintColor를 호출합니다.
검색 창 텍스트 색상 UIAppearance 프로토콜 NSForegroundColorAttributeNamesearchBarTextAttributes에 설정합니다.
검색 창 색조 색상 해당 없음 검색 창은 반투명이며 음영 버전의 탐색 모음으로 표시됩니다.
검색 창 자리표시자 텍스트 색상(기본 검색 텍스트) UIAppearance 프로토콜 NSForegroundColorAttributeNameplaceholderAttributes에 설정합니다.
기본 텍스트(오류 및 메시지 텍스트에도 적용됨) SDK 메서드 primaryTextColor를 호출합니다.
기본 텍스트 강조 표시 SDK 메서드 primaryTextHighlightColor를 호출합니다.
보조 텍스트 SDK 메서드 secondaryTextColor를 호출합니다.
오류 및 메시지 텍스트 SDK 메서드 primaryTextColor를 호출합니다.
테이블 셀 배경 SDK 메서드 tableCellBackgroundColor를 호출합니다.
테이블 셀 구분 기호 색상 SDK 메서드 tableCellSeparatorColor를 호출합니다.
"다시 시도" 버튼 SDK 메서드 tintColor를 호출합니다.
액티비티 표시기(진행 상태 스피너) UIAppearance 프로토콜 UIActivityIndicatorView 프록시에서 setColor를 호출합니다.
"Powered by Google" 로고, 우중충한 구름 이미지 해당 없음 배경 대비에 따라 흰색 또는 회색 버전이 자동으로 선택됩니다.
검색 창 텍스트 필드의 돋보기 및 텍스트 지우기 아이콘 해당 없음 스타일을 지정하려면, 기본 이미지를 원하는 색상의 이미지로 대체합니다.

참고: 이들 속성은 UI 요소의 색상 설정에만 영향을 미칩니다. UI 요소의 크기나 표 셀에 사용된 글꼴을 변경하는 것은 지원되지 않습니다.

UIAppearance 프로토콜 사용

UIAppearance 프로토콜을 사용하여 주어진 UI 요소의 모양 프록시를 가져온 다음, 이 프록시를 사용하여 UI 요소의 색상을 설정할 수 있습니다. 수정이 완료되면, 주어진 UI 요소의 모든 인스턴스가 영향을 받습니다. 예를 들어, 다음 예시에서는 UITextField 클래스의 텍스트 색상을 녹색으로 전역적으로 변경합니다(이 클래스가 UISearchBar에 포함된 경우).

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil]
    setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}];

색상 값 정의에 대한 자세한 내용은 UIColor 클래스 참조.를 참조하세요.

다음 코드 스니펫은 전체 화면 자동완성 UI 컨트롤에 있는 모든 것에 스타일을 지정하는 데 사용되는 모든 프록시 명령을 보여줍니다. 이 코드를 Appdelegate.m의 didFinishLaunchingWithOptions 메서드에 추가합니다.

// Define some colors.
UIColor *darkGray = [UIColor darkGrayColor];
UIColor *lightGray = [UIColor lightGrayColor];

// Navigation bar background.
[[UINavigationBar appearance] setBarTintColor:darkGray];
[[UINavigationBar appearance] setTintColor:lightGray];

// Color of typed text in the search bar.
NSDictionary *searchBarTextAttributes = @{
                                          NSForegroundColorAttributeName: lightGray,
                                          NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]]
                                          };
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
    .defaultTextAttributes = searchBarTextAttributes;

// Color of the placeholder text in the search bar prior to text entry.
NSDictionary *placeholderAttributes = @{
                                        NSForegroundColorAttributeName: lightGray,
                                        NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]]
                                        };

// Color of the default search text.
// NOTE: In a production scenario, "Search" would be a localized string.
NSAttributedString *attributedPlaceholder =
[[NSAttributedString alloc] initWithString:@"Search"
                                attributes:placeholderAttributes];
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
    .attributedPlaceholder = attributedPlaceholder;

// Color of the in-progress spinner.
[[UIActivityIndicatorView appearance] setColor:lightGray];

// To style the two image icons in the search bar (the magnifying glass
// icon and the 'clear text' icon), replace them with different images.
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_clear_x_high"]
                  forSearchBarIcon:UISearchBarIconClear
                            state:UIControlStateHighlighted];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_clear_x"]
                  forSearchBarIcon:UISearchBarIconClear
                            state:UIControlStateNormal];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_search"]
                    forSearchBarIcon:UISearchBarIconSearch
                            state:UIControlStateNormal];

// Color of selected table cells.
UIView *selectedBackgroundView = [[UIView alloc] init];
selectedBackgroundView.backgroundColor = [UIColor lightGrayColor];
[UITableViewCell appearanceWhenContainedIn:[GMSAutocompleteViewController class], nil]
    .selectedBackgroundView = selectedBackgroundView;

UI 컨트롤 스타일 속성 설정

UI 컨트롤 요소 중 일부에는 UIAppearance 프로토콜의 영향을 받지 않는 속성이 있으며, 따라서 이들 속성을 직접 설정해야 합니다. 다음 코드 예시에서는 전경색 및 배경색을 정의하는 방법과 이름이 acController인 UI 컨트롤 인스턴스에 이들을 적용하는 방법을 보여줍니다. 이 코드를 ViewController.m 파일의 onLaunchClicked 메서드에 추가합니다.

UIColor <em>darkGray = [UIColor darkGrayColor];
UIColor </em>lightGray = [UIColor lightGrayColor];</p>
<p>acController.secondaryTextColor = [UIColor colorWithWhite:1.0f alpha:0.5f];
acController.primaryTextColor = lightGray;
acController.primaryTextHighlightColor = [UIColor grayColor];
acController.tableCellBackgroundColor = darkGray;
acController.tableCellSeparatorColor = lightGray;
acController.tintColor = lightGray;

참고: GMSAutocompleteViewControllerGMSAutocompleteResultsViewController의 경우, 인터페이스 빌더를 사용하여 이들 값을 설정할 수 있습니다.

프로그래밍 방식으로 장소 예상 검색어 가져오기

자동완성 위젯에 의해 제공되는 UI를 대체하기 위해 사용자 지정 검색 UI를 만들 수 있습니다. 이를 위해서는 장소 예상 검색어를 프로그래밍 방식으로 가져와야 합니다. 예상 장소 이름 및/또는 주소 목록을 다음 방법 중 하나로 가져올 수 있습니다.

GMSPlacesClient 호출

예상 장소 이름 및/또는 주소 목록을 가져오려 다음 매개변수가 포함된 GMSPlacesClient autocompleteQuery:bounds:filter:callback: 메서드를 호출합니다.

  • 사용자가 입력한 텍스트를 포함하는 autocompleteQuery 문자열.
  • 위도 및 경도 경계로 지정된 특정 영역으로 결과를 편중하는 GMSCoordinateBounds 객체.
  • 특정 유형의 장소로 결과를 제한하는 GMSAutocompleteFilter. 모든 유형을 검색하려면 nil 값을 입력합니다. 필터에서 지원되는 장소 유형:

    • kGMSPlacesAutocompleteTypeFilterNoFilter – 빈 필터의 경우 모든 결과가 반환됩니다.
    • kGMSPlacesAutocompleteTypeFilterGeocode– 사업체 대신 지오코딩 결과만 반환합니다. 지정된 위치가 명확하지 않은 경우 이 요청을 사용하여 결과를 명확히 나타낼 수 있습니다.
    • kGMSPlacesAutocompleteTypeFilterAddress– 정확한 주소를 지닌 자동완성 결과만 반환합니다. 사용자가 전체 주소를 찾고 있다는 것을 알고 있다면 이 유형을 사용하세요.
    • kGMSPlacesAutocompleteTypeFilterEstablishment– 사업체인 장소만 반환합니다.
    • kGMSPlacesAutocompleteTypeFilterRegion – 다음 유형 중 하나와 일치하는 장소만 반환합니다.

      • locality
      • sublocality
      • postal_code
      • country
      • administrative_area_level_1
      • administrative_area_level_2
    • kGMSPlacesAutocompleteTypeFilterCitylocality 또는 administrative_area_level_3과 일치하는 결과만 반환합니다.

자세한 정보는 장소 유형을 참조하세요.

  • 반환된 예상 검색어를 처리할 콜백 메서드.

아래 코드 샘플에서는 간단한 autocompleteQuery:bounds:filter:callback: 호출을 보여줍니다.

Swift

func placeAutocomplete() {
  let filter = GMSAutocompleteFilter()
  filter.type = .establishment
  placesClient.autocompleteQuery("Sydney Oper", bounds: nil, filter: filter, callback: {(results, error) -> Void in
    if let error = error {
      print("Autocomplete error \(error)")
      return
    }
    if let results = results {
      for result in results {
        print("Result \(result.attributedFullText) with placeID \(result.placeID)")
      }
    }
  })
}

Objective-C

- (void)placeAutocomplete {

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.type = kGMSPlacesAutocompleteTypeFilterEstablishment;

[_placesClient autocompleteQuery:@"Sydney Oper"
                          bounds:nil
                          filter:filter
                        callback:^(NSArray *results, NSError *error) {
                          if (error != nil) {
                            NSLog(@"Autocomplete error %@", [error localizedDescription]);
                            return;
                          }

                          for (GMSAutocompletePrediction* result in results) {
                            NSLog(@"Result '%@' with placeID %@", result.attributedFullText.string, result.placeID);
                          }
                        }];
}

API가 지정된 콜백 메서드를 호출하고 GMSAutocompletePrediction 객체의 배열을 전달합니다.

GMSAutocompletePrediction 객체에는 다음 정보가 포함됩니다.

  • attributedFullTextNSAttributedString 형식의 전체 예상 검색어 텍스트. 예: 'Sydney Opera House, Sydney, New South Wales, Australia'. 사용자 입력과 일치하는 모든 텍스트 범위는 kGMSAutocompleteMatchAttribute 특성을 가집니다. 이러한 특성을 사용하여 예를 들어, 아래와 같이 사용자의 쿼리에서 일치하는 텍스트를 강조 표시할 수 있습니다.
  • placeID– – 예상 장소의 장소 ID. 장소 ID는 장소를 고유하게 식별하는 텍스트 식별자입니다. 장소 ID에 대한 자세한 내용은 장소 ID 개요를 참조하세요.

다음 코드 예시에서는 enumerateAttribute를 사용하여 사용자의 쿼리에 나오는 텍스트와 일치하는 결과 부분을 굵은 텍스트로 강조 표시하는 방법을 보여줍니다.

Swift

let regularFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
let boldFont = UIFont.boldSystemFont(ofSize: UIFont.labelFontSize)

let bolded = prediction.attributedFullText.mutableCopy() as! NSMutableAttributedString
bolded.enumerateAttribute(kGMSAutocompleteMatchAttribute, in: NSMakeRange(0, bolded.length), options: []) {
  (value, range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
    let font = (value == nil) ? regularFont : boldFont
    bolded.addAttribute(NSFontAttributeName, value: font, range: range)
}

label.attributedText = bolded
    

Objective-C

UIFont *regularFont = [UIFont systemFontOfSize:[UIFont labelFontSize]];
UIFont *boldFont = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];

NSMutableAttributedString *bolded = [prediction.attributedFullText mutableCopy];
[bolded enumerateAttribute:kGMSAutocompleteMatchAttribute
                   inRange:NSMakeRange(0, bolded.length)
                   options:0
                usingBlock:^(id value, NSRange range, BOOL *stop) {
                  UIFont *font = (value == nil) ? regularFont : boldFont;
                  [bolded addAttribute:NSFontAttributeName value:font range:range];
                }];

label.attributedText = bolded;
    

펫처(fetcher) 사용

자체 자동완성 컨트롤을 처음부터 빌드하려면 GMSAutocompleteFetcher를 사용할 수 있습니다. 이것은 GMSPlacesClient에서 autocompleteQuery 메서드를 래핑합니다. 펫처는 요청을 조절하고, 가장 최근에 입력한 검색 텍스트의 결과만을 반환합니다. UI 요소는 제공하지 않습니다.

GMSAutocompleteFetcher를 구현하려면 다음 단계를 따르세요.

  1. GMSAutocompleteFetcherDelegate 프로토콜을 구현합니다.
  2. GMSAutocompleteFetcher 객체를 만듭니다.
  3. 사용자가 입력하는 중에 펫처에서 sourceTextHasChanged를 호출합니다.
  4. didAutcompleteWithPredictionsdidFailAutocompleteWithError 프로토콜 메서드를 사용하여 예상 검색어와 오류를 처리합니다.

다음 코드 예시에서는 펫처를 사용하여 사용자 입력을 가져오고 일치하는 장소를 텍스트 뷰에 표시하는 방법을 보여줍니다. 장소 선택 기능은 생략되었습니다. FetcherSampleViewController는 FetcherSampleViewController.h의 UIViewController로부터 파생됩니다.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var textField: UITextField?
  var resultText: UITextView?
  var fetcher: GMSAutocompleteFetcher?

  override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .white
    edgesForExtendedLayout = []

    // Set bounds to inner-west Sydney Australia.
    let neBoundsCorner = CLLocationCoordinate2D(latitude: -33.843366,
                                                longitude: 151.134002)
    let swBoundsCorner = CLLocationCoordinate2D(latitude: -33.875725,
                                                longitude: 151.200349)
    let bounds = GMSCoordinateBounds(coordinate: neBoundsCorner,
                                     coordinate: swBoundsCorner)

    // Set up the autocomplete filter.
    let filter = GMSAutocompleteFilter()
    filter.type = .establishment

    // Create the fetcher.
    fetcher = GMSAutocompleteFetcher(bounds: bounds, filter: filter)
    fetcher?.delegate = self

    textField = UITextField(frame: CGRect(x: 5.0, y: 10.0,
                                          width: view.bounds.size.width - 5.0,
                                          height: 44.0))
    textField?.autoresizingMask = .flexibleWidth
    textField?.addTarget(self, action: #selector(textFieldDidChange(textField:)),
                         for: .editingChanged)

    resultText = UITextView(frame: CGRect(x: 0, y: 45.0,
                                          width: view.bounds.size.width,
                                          height: view.bounds.size.height - 45.0))
    resultText?.backgroundColor = UIColor(white: 0.95, alpha: 1.0)
    resultText?.text = "No Results"
    resultText?.isEditable = false

    view.addSubview(textField!)
    view.addSubview(resultText!)
  }

  func textFieldDidChange(textField: UITextField) {
    fetcher?.sourceTextHasChanged(textField.text!)
  }

}

extension ViewController: GMSAutocompleteFetcherDelegate {
  func didAutocomplete(with predictions: [GMSAutocompletePrediction]) {
    let resultsStr = NSMutableString()
    for prediction in predictions {
      resultsStr.appendFormat("%@\n", prediction.attributedPrimaryText)
    }

    resultText?.text = resultsStr as String
  }

  func didFailAutocompleteWithError(_ error: Error) {
    resultText?.text = error.localizedDescription
  }

}

Objective-C

#import "FetcherSampleViewController.h"
#import <GooglePlaces/GooglePlaces.h>

@interface FetcherSampleViewController () <GMSAutocompleteFetcherDelegate>

@end

@implementation FetcherSampleViewController {
  UITextField *_textField;
  UITextView *_resultText;
  GMSAutocompleteFetcher* _fetcher;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  self.view.backgroundColor = [UIColor whiteColor];
  self.edgesForExtendedLayout = UIRectEdgeNone;

  // Set bounds to inner-west Sydney Australia.
  CLLocationCoordinate2D neBoundsCorner = CLLocationCoordinate2DMake(-33.843366, 151.134002);
  CLLocationCoordinate2D swBoundsCorner = CLLocationCoordinate2DMake(-33.875725, 151.200349);
  GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:neBoundsCorner
                                                                     coordinate:swBoundsCorner];

  // Set up the autocomplete filter.
  GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
  filter.type = kGMSPlacesAutocompleteTypeFilterEstablishment;

  // Create the fetcher.
  _fetcher = [[GMSAutocompleteFetcher alloc] initWithBounds:bounds
                                                     filter:filter];
  _fetcher.delegate = self;

  // Set up the UITextField and UITextView.
  _textField = [[UITextField alloc] initWithFrame:CGRectMake(5.0f,
                                                             0,
                                                             self.view.bounds.size.width - 5.0f,
                                                             44.0f)];
  _textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;
  [_textField addTarget:self
                 action:@selector(textFieldDidChange:)
       forControlEvents:UIControlEventEditingChanged];
  _resultText =[[UITextView alloc] initWithFrame:CGRectMake(0,
                                                            45.0f,
                                                            self.view.bounds.size.width,
                                                            self.view.bounds.size.height - 45.0f)];
  _resultText.backgroundColor = [UIColor colorWithWhite:0.95f alpha:1.0f];
  _resultText.text = @"No Results";
  _resultText.editable = NO;
  [self.view addSubview:_textField];
  [self.view addSubview:_resultText];
}

- (void)textFieldDidChange:(UITextField *)textField {
  NSLog(@"%@", textField.text);
  [_fetcher sourceTextHasChanged:textField.text];
}

#pragma mark - GMSAutocompleteFetcherDelegate
- (void)didAutocompleteWithPredictions:(NSArray *)predictions {
  NSMutableString *resultsStr = [NSMutableString string];
  for (GMSAutocompletePrediction *prediction in predictions) {
      [resultsStr appendFormat:@"%@\n", [prediction.attributedPrimaryText string]];
  }
  _resultText.text = resultsStr;
}

- (void)didFailAutocompleteWithError:(NSError *)error {
  _resultText.text = [NSString stringWithFormat:@"%@", error.localizedDescription];
}

@end

자동 완성의 GMSCoordinateBounds 설정

자동완성에 GMSCoordinateBounds를 제공하면 제공되는 완성 결과를 제한할 수 있습니다. 예를 들어, 뷰 컨트롤러에 Google 지도가 이미 있다면 현재 뷰포트의 경계를 사용하여 자동완성 결과를 편중할 수 있습니다.

Swift

func placeAutocomplete() {
  let visibleRegion = mapView.projection.visibleRegion()
  let bounds = GMSCoordinateBounds(coordinate: visibleRegion.farLeft, coordinate: visibleRegion.nearRight)

  let filter = GMSAutocompleteFilter()
  filter.type = .establishment
  placesClient.autocompleteQuery("Sydney Oper", bounds: bounds, filter: filter, callback: {
    (results, error) -> Void in
    guard error == nil else {
      print("Autocomplete error \(error)")
      return
    }
    if let results = results {
      for result in results {
        print("Result \(result.attributedFullText) with placeID \(result.placeID)")
      }
    }
  })
}

Objective-C

- (void)placeAutocomplete {

GMSVisibleRegion visibleRegion = self.mapView.projection.visibleRegion;
GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:visibleRegion.farLeft
                                                                   coordinate:visibleRegion.nearRight];
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.type = kGMSPlacesAutocompleteTypeFilterEstablishment;

[_placesClient autocompleteQuery:@"Sydney Oper"
                          bounds:bounds
                          filter:filter
                        callback:^(NSArray *results, NSError *error) {
                          if (error != nil) {
                            NSLog(@"Autocomplete error %@", [error localizedDescription]);
                            return;
                          }

                          for (GMSAutocompletePrediction* result in results) {
                            NSLog(@"Result '%@' with placeID %@", result.attributedFullText.string, result.placeID);
                          }
                        }];
}

사용 제한

앱에 특성 표시

  • 앱이 프로그래밍 방식으로 자동완성 서비스를 사용하는 경우, UI가 'Powered by Google' 속성을 표시하거나 Google 브랜드 지도 내에 나타나야 합니다.
  • 앱이 자동완성 UI 컨트롤을 사용하는 경우에는 추가적인 동작이 필요 없습니다(필수 속성은 기본적으로 표시됩니다).
  • ID로 장소를 획득한 후에 추가 장소 정보를 검색하고 표시하는 경우, 타사 특성도 표시해야 합니다.

자세한 내용은 특성에 대한 문서를 참조하세요.

네트워크 액티비티 표시기 제어

네트워크 액티비티 표시기를 애플리케이션 상태 표시줄에서 제어하려면, 사용 중인 자동완성 클래스에 대해 적절한 선택적 대리자 메서드를 구현해야 하며, 네트워크 표시기를 직접 켜고 꺼야 합니다.

  • GMSAutocompleteViewController의 경우에는 대리자 메서드 didRequestAutocompletePredictions:didUpdateAutocompletePredictions:을 구현해야 합니다.
  • GMSAutocompleteResultsViewController의 경우에는 대리자 메서드 didRequestAutocompletePredictionsForResultsController:didUpdateAutocompletePredictionsForResultsController:를 구현해야 합니다.
  • GMSAutocompleteTableDataSource의 경우에는 대리자 메서드 didRequestAutocompletePredictionsForTableDataSource:didUpdateAutocompletePredictionsForTableDataSource:를 구현해야 합니다.

이들 메서드를 구현하고 [UIApplication sharedApplication].networkActivityIndicatorVisibleYESNO로 각각 설정하면 상태 표시줄이 자동완성 UI와 정확히 일치할 것입니다.

문제 해결

광범위한 오류가 발생할 수 있지만, 일반적으로 앱에서 발생하는 오류의 대부분은 구성 오류이거나(예: 잘못된 API 키가 사용되거나 API 키가 잘못 구성됨) 할당량 오류입니다(앱이 할당량을 초과함). 할당량에 대한 자세한 내용은 사용 제한을 참조하세요.

자동완성 컨트롤 사용 시에 발생하는 오류는 다양한 대리자 프로토콜의 didFailAutocompleteWithError() 메서드에 반환됩니다. 제공된 NSError 객체의 code 속성은 GMSPlacesErrorCode 열거 값 중 하나로 설정됩니다.

다음에 대한 의견 보내기...