Place Autocomplete

プラットフォームを選択: Android iOS JavaScript ウェブサービス

<ph type="x-smartling-placeholder">

Places SDK for iOS の予測入力サービスは、 ユーザーの検索語句に応じて予測を行います。ユーザーが入力すると、 予測入力サービスは、お店やサービスなどの場所の候補を返します。 住所、plus code、 おすすめします。

次の方法でアプリにオートコンプリート機能を追加することができます。

予測入力 UI コントロールの追加

予測入力 UI コントロールは、予測入力が組み込まれた検索ダイアログです 説明します。ユーザーが検索キーワードを入力すると、コントロールに 場所の候補リストですユーザーが選択すると GMSPlace 返されます。アプリはこれを使用して、 選択します。

次の方法でアプリにオートコンプリート UI コントロールを追加することができます。

フルスクリーン コントロールの追加

モーダル コンテキストが必要な場合に、 予測入力 UI が一時的にアプリの UI に置き換わるまでの間、 選択することもできます。この機能は GMSAutocompleteViewController クラスです。ユーザーがプレイスを選択すると、アプリはコールバックを受け取ります。

フルスクリーン コントロールをアプリに追加するには:

  1. メインアプリに UI 要素を作成して、予測入力 UI コントロールを起動する たとえば、UIButton でのタッチハンドラなどです。
  2. GMSAutocompleteViewControllerDelegate を実装する 親ビュー コントローラの 2 つのパラメータがあります。
  3. GMSAutocompleteViewController のインスタンスを作成する 親ビュー コントローラを delegate プロパティとして割り当てます。
  4. GMSPlaceField を作成する 返す場所のデータタイプを定義します。
  5. GMSAutocompleteFilter を追加する クエリを特定の場所のタイプに制限します。
  6. GMSAutocompleteViewControllerを提示する [self presentViewController...] を使用します。
  7. didAutocompleteWithPlace でユーザーの選択を処理する delegate メソッドを使用します。
  8. didAutocompleteWithPlace でコントローラを閉じます。 didFailAutocompleteWithErrorwasCancelled のデリゲート メソッド。

次の例は、コンテナ イメージを起動する方法の一例です。 GMSAutocompleteViewController レスポンスで応答します。

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  override func viewDidLoad() {
    makeButton()
  }

  // Present the Autocomplete view controller when the button is pressed.
  @objc func autocompleteClicked(_ sender: UIButton) {
    let autocompleteController = GMSAutocompleteViewController()
    autocompleteController.delegate = self

    // Specify the place data types to return.
    let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) |
      UInt(GMSPlaceField.placeID.rawValue))!
    autocompleteController.placeFields = fields

    // Specify a filter.
    let filter = GMSAutocompleteFilter()
    filter.types = [.address]
    autocompleteController.autocompleteFilter = filter

    // Display the autocomplete view controller.
    present(autocompleteController, animated: true, completion: nil)
  }

  // Add a button to the view.
  func makeButton() {
    let btnLaunchAc = UIButton(frame: CGRect(x: 5, y: 150, width: 300, height: 35))
    btnLaunchAc.backgroundColor = .blue
    btnLaunchAc.setTitle("Launch autocomplete", for: .normal)
    btnLaunchAc.addTarget(self, action: #selector(autocompleteClicked), for: .touchUpInside)
    self.view.addSubview(btnLaunchAc)
  }

}

extension ViewController: GMSAutocompleteViewControllerDelegate {

  // Handle the user's selection.
  func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
    print("Place name: \(place.name)")
    print("Place ID: \(place.placeID)")
    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;

@interface ViewController () <GMSAutocompleteViewControllerDelegate>

@end

@implementation ViewController {
  GMSAutocompleteFilter *_filter;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  [self makeButton];
}

  // Present the autocomplete view controller when the button is pressed.
- (void)autocompleteClicked {
  GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init];
  acController.delegate = self;

  // Specify the place data types to return.
  GMSPlaceField fields = (GMSPlaceFieldName | GMSPlaceFieldPlaceID);
  acController.placeFields = fields;

  // Specify a filter.
  _filter = [[GMSAutocompleteFilter alloc] init];
  _filter.types = @[ kGMSPlaceTypeBank ];
  acController.autocompleteFilter = _filter;

  // Display the autocomplete view controller.
  [self presentViewController:acController animated:YES completion:nil];
}

  // Add a button to the view.
- (void)makeButton{
  UIButton *btnLaunchAc = [UIButton buttonWithType:UIButtonTypeCustom];
  [btnLaunchAc addTarget:self
             action:@selector(autocompleteClicked) forControlEvents:UIControlEventTouchUpInside];
  [btnLaunchAc setTitle:@"Launch autocomplete" forState:UIControlStateNormal];
  btnLaunchAc.frame = CGRectMake(5.0, 150.0, 300.0, 35.0);
  btnLaunchAc.backgroundColor = [UIColor blueColor];
  [self.view addSubview:btnLaunchAc];
}

  // 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 ID %@", place.placeID);
  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 をより詳細に制御する場合は、結果コントローラを使用します。 結果コントローラは、結果リストの表示 / 非表示を動的に切り替える 基づいて出力されます。

結果コントローラをアプリに追加するには:

  1. GMSAutocompleteResultsViewController を作成します。
  2. GMSAutocompleteResultsViewControllerDelegate を実装する 親ビュー コントローラにプロトコルを設定し、親ビュー コントローラを delegate プロパティを使用します。
  3. UISearchController オブジェクトを作成して、 GMSAutocompleteResultsViewController 結果コントローラの引数として 渡されます
  4. GMSAutocompleteResultsViewController を設定します。 UISearchControllersearchResultsUpdater プロパティとして指定します。
  5. UISearchControllersearchBar をアプリの UI に追加します。
  6. didAutocompleteWithPlace でユーザーの選択を処理する delegate メソッドを使用します。

UISearchController の検索バーを場所に配置するには、いくつかの方法があります。 作成してみましょう。

ナビゲーション バーに検索バーを追加する

次のコード例は、結果コントローラの追加、 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;
}

ビューの上部に検索バーを追加する

次のコードサンプルは、ビューの上部に 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;
}

テーブル データソースを使用する

アプリにカスタムの検索テキスト UI がある場合は、 GMSAutocompleteTableDataSource クラスを使用して、ビュー コントローラに結果を表示するテーブルビューを制御します。

GMSAutocompleteTableDataSource を使用するには UITableView のデータソースおよび委任として使用します。 ビュー コントローラで以下を行います。

  1. GMSAutocompleteTableDataSourceDelegate を実装する および UISearchBarDelegate ビュー コントローラで指定できます。
  2. GMSAutocompleteTableDataSource を作成する ビュー コントローラを delegate プロパティとして割り当てます。
  3. GMSAutocompleteTableDataSource を設定します。 UITableView のデータソースおよび委譲プロパティとして指定します。 ビュー コントローラです。
  4. 検索テキスト入力のハンドラで、sourceTextHasChanged GMSAutocompleteTableDataSource
  5. didAutocompleteWithPlace デリゲート メソッドでユーザーの選択を処理します。
  6. didAutocompleteWithPlacedidFailAutocompleteWithErrorwasCancelled デリゲート メソッド。

次のコード例は、 GMSAutocompleteTableDataSource クラスを使用して、UISearchBar が個別に追加されたときに UIViewController のテーブルビューを制御します。

Swift

// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import GooglePlaces
import UIKit

class PlaceAutocompleteViewController: UIViewController {

  private var tableView: UITableView!
  private var tableDataSource: GMSAutocompleteTableDataSource!

  override func viewDidLoad() {
    super.viewDidLoad()

    let searchBar = UISearchBar(frame: CGRect(x: 0, y: 20, width: self.view.frame.size.width, height: 44.0))
    searchBar.delegate = self
    view.addSubview(searchBar)

    tableDataSource = GMSAutocompleteTableDataSource()
    tableDataSource.delegate = self

    tableView = UITableView(frame: CGRect(x: 0, y: 64, width: self.view.frame.size.width, height: self.view.frame.size.height - 44))
    tableView.delegate = tableDataSource
    tableView.dataSource = tableDataSource

    view.addSubview(tableView)
  }
}

extension PlaceAutocompleteViewController: UISearchBarDelegate {
  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    // Update the GMSAutocompleteTableDataSource with the search text.
    tableDataSource.sourceTextHasChanged(searchText)
  }
}

extension PlaceAutocompleteViewController: GMSAutocompleteTableDataSourceDelegate {
  func didUpdateAutocompletePredictions(for tableDataSource: GMSAutocompleteTableDataSource) {
    // Turn the network activity indicator off.
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
    // Reload table data.
    tableView.reloadData()
  }

  func didRequestAutocompletePredictions(for tableDataSource: GMSAutocompleteTableDataSource) {
    // Turn the network activity indicator on.
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
    // Reload table data.
    tableView.reloadData()
  }

  func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didAutocompleteWith place: GMSPlace) {
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didFailAutocompleteWithError error: Error) {
    // Handle the error.
    print("Error: \(error.localizedDescription)")
  }

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

      

Objective-C

// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#import "PlaceAutocompleteViewController.h"
@import GooglePlaces;
@import UIKit;

@interface PlaceAutocompleteViewController () <GMSAutocompleteTableDataSourceDelegate, UISearchBarDelegate>

@end

@implementation PlaceAutocompleteViewController {
  UITableView *tableView;
  GMSAutocompleteTableDataSource *tableDataSource;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)];
  searchBar.delegate = self;

  [self.view addSubview:searchBar];

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

  tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 44)];
  tableView.delegate = tableDataSource;
  tableView.dataSource = tableDataSource;

  [self.view addSubview:tableView];
}

#pragma mark - GMSAutocompleteTableDataSourceDelegate

- (void)didUpdateAutocompletePredictionsForTableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource {
  // Turn the network activity indicator off.
  UIApplication.sharedApplication.networkActivityIndicatorVisible = NO;

  // Reload table data.
  [tableView reloadData];
}

- (void)didRequestAutocompletePredictionsForTableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource {
  // Turn the network activity indicator on.
  UIApplication.sharedApplication.networkActivityIndicatorVisible = YES;

  // Reload table data.
  [tableView reloadData];
}

- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didAutocompleteWithPlace:(GMSPlace *)place {
  // Do something with the selected place.
  NSLog(@"Place name: %@", place.name);
  NSLog(@"Place address: %@", place.formattedAddress);
  NSLog(@"Place attributions: %@", place.attributions);
}

- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didFailAutocompleteWithError:(NSError *)error {
  // Handle the error
  NSLog(@"Error %@", error.description);
}

- (BOOL)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didSelectPrediction:(GMSAutocompletePrediction *)prediction {
  return YES;
}

#pragma mark - UISearchBarDelegate

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
  // Update the GMSAutocompleteTableDataSource with the search text.
  [tableDataSource sourceTextHasChanged:searchText];
}

@end

      

テキストと背景色のカスタマイズ

予測入力 UI のすべてのテキストと背景の色を設定できます。 ウィジェットをアプリの外観にマッチさせることができます 緊密に統合されていますUI コントロールの色を設定するには、次の 2 つの方法があります。

  • ネイティブの iOS UIAppearance プロトコルを使用し、可能であれば UI コントロールをグローバルにスタイル設定する。これらの設定は、すべてではありませんが、多くの UI コントロールに適用される あります。
  • ウィジェット クラスで SDK のメソッドを使用して、 UIAppearance プロトコルではサポートされていません。

通常、アプリでは UIAppearance プロトコルを組み合わせて使用します。 SDK メソッドがあります次の図は、スタイル設定が可能な要素を示しています。

予測入力 UI コントロールの色

次の表に、すべての UI 要素と、各要素が 1 つはスタイル化する必要があります(UIAppearance プロトコルまたは SDK メソッド)。

UI 要素 メソッド スタイルのハウツー
ナビゲーション バーの色合い(背景) UIAppearance プロトコル UINavigationBar プロキシで setBarTintColor を呼び出します。
ナビゲーション バーの色合い(検索バーのテキスト カーソルと [キャンセル] ボタン) UIAppearance プロトコル UINavigationBar プロキシで setTintColor を呼び出します。
検索バーのテキストの色 UIAppearance プロトコル searchBarTextAttributesNSForegroundColorAttributeName を設定します。
検索バーの色合い なし 検索バーは半透明で、色付きで表示されます。 [ナビゲーション バー] を選択します。
検索バーのプレースホルダ テキストの色(デフォルトの検索テキスト) UIAppearance プロトコル placeholderAttributesNSForegroundColorAttributeName を設定します。
メインテキスト(エラー テキストとメッセージ テキストにも適用) SDK メソッド primaryTextColorまでお電話ください。
メインのテキストのハイライト表示 SDK メソッド primaryTextHighlightColorまでお電話ください。
セカンダリ テキスト SDK メソッド secondaryTextColorまでお電話ください。
エラーとメッセージのテキスト SDK メソッド primaryTextColorまでお電話ください。
表のセルの背景 SDK メソッド tableCellBackgroundColorまでお電話ください。
表のセルの区切りの色 SDK メソッド tableCellSeparatorColorまでお電話ください。
「もう一度お試しください」ボタン SDK メソッド tintColorまでお電話ください。
アクティビティ インジケーター(進行状況スピナー) UIAppearance プロトコル UIActivityIndicatorView プロキシで setColor を呼び出します。
「Powered by Google」ロゴ、悲しい雲の画像 なし 白またはグレーのバージョンは、背景のコントラストに基づいて自動的に選択されます。
検索バーのテキスト フィールドにある虫メガネとクリアテキストのアイコン なし スタイルを設定するには、デフォルトの画像を目的の色の画像に置き換えます。

UIAppearance プロトコルの使用

UIAppearance プロトコルを使用できます。 特定の 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 プロトコルであるため、直接設定する必要があります。次のコード例 前景色と背景色を定義し、それらを UI に適用する例を示します。 acController という名前のコントロール インスタンス。このコードを onLaunchClicked に追加します。 メソッドを以下のように記述します。

UIColor *darkGray = [UIColor darkGrayColor];
UIColor *lightGray = [UIColor lightGrayColor];

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;

プログラムで場所の予測を取得する

カスタム検索 UI を、 予測入力ウィジェットですそのためには、アプリで場所の候補を取得する必要があります。 できます。アプリは、予測される場所の名前や場所のリストを取得できます。 次のいずれかの方法を使用できます。

GMSPlacesClient findAutocompletePredictionsFromQuery: さんに発信しています

予測される場所の名前や住所のリストを取得するには、まず GMSPlacesClient をインスタンス化 次に GMSPlacesClient findAutocompletePredictionsFromQuery: メソッドを次のパラメータで指定:

  • ユーザーが入力したテキストを含む autocompleteQuery 文字列。
  • GMSAutocompleteSessionToken 個々のセッションを識別しますアプリは 予測入力リクエストの呼び出しごとに同じトークンを渡してから、そのトークンを 次の fetchPlacefromPlaceID: の呼び出しで、場所 ID とともに渡されます。 ユーザーが選択した場所の Place Details を取得する。
  • GMSAutocompleteFilter で以下を行います。
    • 特定の地域の結果にバイアスを設定または制限します。
    • 検索結果を特定の場所のタイプに制限します。
    • 緯度と経度の境界で指定された特定のエリアに結果にバイアスをかける GMSPlaceLocationBias/Restriction オブジェクト。
  • 返された予測を処理するコールバック メソッド。

以下のコードサンプルは、findAutocompletePredictionsFromQuery: の呼び出しを示しています。

Swift

/**
 * Create a new session token. Be sure to use the same token for calling
 * findAutocompletePredictions, as well as the subsequent place details request.
 * This ensures that the user's query and selection are billed as a single session.
 */
let token = GMSAutocompleteSessionToken.init()

// Create a type filter.
let filter = GMSAutocompleteFilter()
filter.types = [.bank] 
filter.locationBias = GMSPlaceRectangularLocationOption( northEastBounds,
                                   southWestBounds);

placesClient?.findAutocompletePredictions(fromQuery: "cheesebu",

                                          filter: filter,
                                          sessionToken: token,
                                          callback: { (results, error) 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

/**
 * Create a new session token. Be sure to use the same token for calling
 * findAutocompletePredictionsFromQuery:, as well as the subsequent place details request.
 * This ensures that the user's query and selection are billed as a single session.
 */
GMSAutocompleteSessionToken *token = [[GMSAutocompleteSessionToken alloc] init];

// Create a type filter.
GMSAutocompleteFilter *_filter = [[GMSAutocompleteFilter alloc] init];
_filter.types = @[ kGMSPlaceTypeBank ];

[_placesClient findAutocompletePredictionsFromQuery:@"cheesebu"
filter:_filter sessionToken:token callback:^(NSArray<GMSAutocompletePrediction *> * _Nullable results, NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"An error occurred %@", [error localizedDescription]);
    return;
  }
  if (results != nil) {
    for (GMSAutocompletePrediction *result in results) {
      NSLog(@"Result %@ with PlaceID %@", result.attributedFullText, result.placeID);
    }
  }
}];

API は指定されたコールバック メソッドを呼び出し、 GMSAutocompletePrediction 説明します。

GMSAutocompletePrediction オブジェクトには次の情報が含まれます。

  • attributedFullText - 予測の全文( NSAttributedString。例: 「Sydney Opera House, Sydney, New South」 ウェールズ、オーストラリア」です。ユーザー入力に一致するすべてのテキスト範囲には、 属性 kGMSAutocompleteMatchAttribute。この属性を使用して、 ユーザーのクエリに一致するテキストをハイライト表示します。次に例を示します。
  • placeID - 予測される場所のプレイス ID。プレイス ID とは、 テキストで表される ID で、場所を一意に識別します。詳細については、このモジュールの プレイス ID については、プレイス ID の概要をご覧ください。
  • distanceMeters – 指定された地点からの直線距離 目的地まで originorigin プロパティが設定されていない場合、距離は設定されません。 値が返されます。

次のコード例は、各部分を太字でハイライト表示する方法を示しています。 ユーザーのクエリのテキストと一致する結果の結果を、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;
    

フェッチャーの使用

独自の予測入力コントロールをゼロから作成する場合は、 GMSAutocompleteFetcher これは GMSPlacesClientautocompleteQuery メソッドをラップします。 フェッチャーはリクエストをスロットリングし、直近の 入力した検索テキスト。UI 要素は提供されません。

GMSAutocompleteFetcher を実装する手順は次のとおりです。 手順は次のとおりです。

  1. GMSAutocompleteFetcherDelegate を実装する 構成されます。
  2. GMSAutocompleteFetcher オブジェクトを作成します。
  3. ユーザーが入力したら、フェッチャーで sourceTextHasChanged を呼び出します。
  4. didAutcompleteWithPredictions を使用して予測とエラーを処理する および didFailAutocompleteWithError 使用できます。

次のコードサンプルは、フェッチャーを使用してユーザー入力を取得する方法を示しています。 場所の一致をテキストビューで表示できます場所を選択する機能 は省略されています。FetcherSampleViewControllerUIViewController から派生します。 (FetcherSampleViewController.h 内)。

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)

    // Set up the autocomplete filter.
    let filter = GMSAutocompleteFilter()
    filter.locationRestriction = GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner)

    // Create a new session token.
    let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init()

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

    textField = UITextField(frame: CGRect(x: 5.0, y: 10.0,
                                          width: view.bounds.size.width - 5.0,
                                          height: 64.0))
    textField?.autoresizingMask = .flexibleWidth
    textField?.addTarget(self, action: #selector(textFieldDidChange(textField:)),
                         for: .editingChanged)
    let placeholder = NSAttributedString(string: "Type a query...")

    textField?.attributedPlaceholder = placeholder

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

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

  @objc 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 Primary text: %@\n", prediction.attributedPrimaryText)
      resultsStr.appendFormat("Place ID: %@\n", prediction.placeID)
    }

    resultText?.text = resultsStr as String
  }

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

Objective-C

#import "FetcherSampleViewController.h"
#import <GooglePlaces/GooglePlaces.h>
#import <GoogleMapsBase/GoogleMapsBase.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);

  GMSAutocompleteFilter *autocompleteFilter = [[GMSAutocompleteFilter alloc] init];
  autocompleteFilter.locationRestriction =
        GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner);

  // Create the fetcher.
  _fetcher = [[GMSAutocompleteFetcher alloc] initWithBounds:nil
                                                     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

セッション トークン

セッション トークンは、ユーザーの予測入力のクエリフェーズと選択フェーズをグループ化します 請求のために個別のセッションを検索するセッションが開始されるタイミングは ユーザーが質問を入力し、場所を選択すると回答が終了します。各 セッションに複数のクエリが含まれ、その後に 1 つの場所が選択されます。一度 セッションが終了すると、トークンは無効になります。新しい ReplicaSet の 新しいトークンを生成しています。すべてのセッション トークンにセッション トークンを プログラムによる予測入力のセッション(全画面表示コントローラを使用する場合、 API が自動的に処理します)。

Places SDK for iOS は GMSAutocompleteSessionToken を使用します。 各セッションを特定しますアプリは新しいセッション トークンを その後、同じトークンをプレイス ID とともに渡します。 後続の fetchPlacefromPlaceID: の呼び出しで ユーザーが選択した場所の Place Details を取得する。

セッション トークンの詳細

次のコードを使用して、新しいセッション トークンを生成します。

let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init()

使用量上限

アプリに帰属情報を表示する

  • アプリで予測入力サービスをプログラマティックに使用する場合は、UI で 画面に「Powered by Google」またはスペース内で Google ブランドの地図。
  • アプリで予測入力 UI コントロールを使用している場合は、追加の操作は必要ありません (必要な帰属表示がデフォルトで表示されます)。
  • イベントの後に追加の場所情報を取得して表示し、 ID で場所を取得する サードパーティの属性も表示する必要があります。

詳細については、このモジュールのコースリソースに アトリビューション

ネットワーク アクティビティ インジケーターを制御する

アプリケーションのステータスバーのネットワーク アクティビティ インジケーターを管理するには、 予測入力用に適切なオプションのデリゲート メソッドを実装する必要がある または、ネットワーク インジケーターをご自身でオンまたはオフにできます。

  • GMSAutocompleteViewController では、委譲メソッド didRequestAutocompletePredictions:didUpdateAutocompletePredictions: を実装する必要があります。
  • GMSAutocompleteResultsViewController では、委譲メソッド didRequestAutocompletePredictionsForResultsController:didUpdateAutocompletePredictionsForResultsController: を実装する必要があります。
  • GMSAutocompleteTableDataSource では、委譲メソッド didRequestAutocompletePredictionsForTableDataSource:didUpdateAutocompletePredictionsForTableDataSource: を実装する必要があります。

これらのメソッドを実装し、[UIApplication sharedApplication].networkActivityIndicatorVisible を設定する。 ステータスバーが YESNO に変わり、 予測入力 UI を表示します。

予測入力の結果を制限する

予測入力 UI コントロールを設定して、結果を特定の 検索結果を 1 つ以上の場所のタイプに絞り込むことができます。 特定の国や国を選択したりできます結果を制約するには、次の操作を行います。

  • 指定した領域内の結果を優先(バイアス)するには、locationBias をオンにします。 GMSAutocompleteFilter(定義した領域外からの結果の一部は、 返品されます)。locationRestriction も設定した場合、locationBias は無視されます。
  • 指定した地域内の結果のみを表示(制限)するには、次のように設定します。 GMSAutocompleteFilterlocationRestriction( 返されます)。

    • 注: この制限はルート全体にのみ適用されます。 範囲外にある検索結果は、ルートに基づいて返される場合があります。 地域制限と重複する
  • 特定の場所のタイプに適合する結果のみを返すには、types を設定します。 GMSAutocompleteFilter に対するリクエスト(たとえば、TypeFilter.ADDRESS を指定) 正確な住所を含む検索結果のみが返されます)。

  • 最大 5 つの国を指定して検索結果のみを返すには、 GMSAutocompleteFiltercountries

特定の地域に対する結果にバイアスをかける

指定した領域内の結果を優先(バイアス)するには、locationBias をオンにします。 次のように GMSAutocompleteFilter を追加します。

  northEast = CLLocationCoordinate2DMake(39.0, -95.0);
  southWest = CLLocationCoordinate2DMake(37.5, -100.0);
  GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
  filter.locationBias = GMSPlaceRectangularLocationOption(northEast, southWest);

検索結果を特定の地域に制限する

指定した地域内の結果のみを表示(制限)するには、次のように設定します。 次に示すように、GMSAutocompleteFilter に対する locationRestriction です。

  northEast = CLLocationCoordinate2DMake(39.0, -95.0);
  southWest = CLLocationCoordinate2DMake(37.5, -100.0);
  GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
  filter.locationRestriction = GMSPlaceRectangularLocationOption(northEast, southWest);

国で結果をフィルタする

最大 5 つの指定した国で結果をフィルタするには、countries を設定します 次のように GMSAutocompleteFilter を設定します。

  GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
  filter.countries = @[ @"au", @"nz" ];

場所タイプまたはタイプ コレクションで結果をフィルタする

結果を特定の型または型コレクションに制限するには、 types プロパティ GMSAutoCompleteFilter。 このプロパティを使用して、表 1、2、3 にリストされているフィルタを指定します。 プレイスタイプ。何も指定しないと、すべてのタイプが返されます。

タイプまたはタイプ コレクション フィルタを指定するには:

  • types プロパティを使用して、表 1 から最大 5 つの type 値を指定します。 プレイスタイプの表 2 を参照してください。type の値は、 GMSPlaceType の定数で定義されます。

  • types プロパティを使用して、表 3 のタイプ コレクションを指定します。 プレイスタイプ。タイプ コレクションの値は、 GMSPlaceType の定数。

    リクエストでは、表 3 のタイプのうち、1 つのみが許可されます。Pod の 表 1 または表 2 の値は指定できません。条件 エラーが発生します。

たとえば、特定の場所のタイプに適合する結果のみを返すには、 GMSAutocompleteFiltertypes。次の例では、Pod の フィルタして、正確な住所を含む結果のみを返します。

  GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
  filter.types = @[ kGMSPlaceTypeAirport, kGMSPlaceTypeAmusementPark ];

Place Autocomplete の最適化

このセクションでは、Place Autocomplete サービスを最大限に活用するためのヒントを紹介します。

概要は次のとおりです。

  • 機能的なユーザー インターフェースを最も手早く作成するには、Maps JavaScript API Autocomplete ウィジェット、Places SDK for Android Autocomplete ウィジェット、または Places SDK for iOS Autocomplete UI コントロールを使用します。
  • Place Autocomplete のデータ フィールドの基本を理解します。
  • 位置情報のバイアスと位置情報の制限のフィールドは省略可能ですが、予測入力のパフォーマンスに大きく影響する場合があります。
  • エラー処理を使用して、API がエラーを返した場合に、アプリでグレースフル デグラデーションが行われるようにします。
  • アプリでは、選択肢がない場合でもユーザーが操作を続行できるようにします。

費用の最適化に関するヒント

基本的な費用の最適化

Place Autocomplete サービスの費用を最適化するには、Place Details と Place Autocomplete ウィジェットのフィールド マスクを使用して、必要な場所のデータ フィールドのみを返すよう設定します。

高度な費用の最適化

リクエストあたりの料金設定を利用し、Place Details の代わりに選択された場所に関する Geocoding API の結果をリクエストするためには、Place Autocomplete のプログラマティック実装を行うことをおすすめします。次の両方に該当する場合は、リクエストあたりの料金設定と Geocoding API を組み合わせた方が、セッションあたり(セッション ベース)の料金設定よりも費用対効果が高くなります。

  • ユーザーが選択した場所の緯度 / 経度または住所のみが必要な場合。その場合は、Geocoding API の方が、Place Details の呼び出しよりも少ないコストでこの情報を提供できます。
  • ユーザーが予測結果を選択するまでの予測入力候補リクエストの回数が、平均 4 回以下の場合。その場合は、リクエストあたりの料金設定の方がセッションあたりの料金設定よりも費用対効果が高くなります。
ニーズに合った Place Autocomplete 実装を選ぶ際は、次の質問に対する答えを考え、それに対応するタブを選択するとヒントが表示されます。

アプリケーションで、選択された予測結果の住所と緯度 / 経度以外の情報が必要ですか?

はい。その他の情報も必要です

セッション ベースの Place Autocomplete と Place Details を併用します。
アプリケーションで、場所の名前、お店やサービスのステータス、始業時間などの Place Details が必要になるため、Place Autocomplete 実装では、セッション トークン(プログラマティック実装か、JavaScriptAndroid、または iOS ウィジェットへの組み込み)を使用することをおすすめします。合計では、セッションあたり 0.017 ドルに加え、リクエストするデータ フィールドに応じた対象のプレイスデータ SKU の費用がかかります。1

ウィジェット実装
セッション管理が JavaScriptAndroid、または iOS ウィジェットに自動的に組み込まれます。これには、選択された予測結果での Place Autocomplete リクエストと Place Details リクエストの両方が含まれます。必要なプレイスデータ フィールドのみをリクエストするように、必ず fields パラメータを指定してください。

プログラマティック実装
Place Autocomplete リクエストでセッション トークンを使用します。選択された予測結果に関する Place Details をリクエストする際は、次のパラメータを含めます。

  1. Place Autocomplete レスポンスのプレイス ID
  2. Place Autocomplete リクエストで使用されるセッション トークン
  3. 必要な場所のデータ フィールドを指定する fields パラメータ

いいえ。住所と場所のみが必要です

Place Autocomplete 使用時のパフォーマンスによっては、アプリケーションで Places Details を使用するよりも、Geocoding API を使用した方が費用対効果が高くなる場合があります。アプリケーションの予測入力の効率は、ユーザーの入力内容や、アプリケーションが使用される場所、パフォーマンス最適化のベスト プラクティスが導入されているかどうかによって変わります。

次の質問に答えるためには、ユーザーがアプリケーション内で Place Autocomplete の予測を選択するまでに、平均でどのくらいの文字数を入力するのかを分析する必要があります。

ユーザーが Place Autocomplete の予測を選択するまでに実行されるリクエスト数は、平均で 4 回以下ですか?

はい

セッション トークンを使用せずにプログラムによって Place Autocomplete を実装し、選択された場所の予測で Geocoding API を呼び出します。
Geocoding API は、リクエスト 1 件につき 0.005 ドルで住所と緯度 / 経度の座標が提供されます。Place Autocomplete - Per Request のリクエスト 4 件の料金は 0.01132 ドルになるため、4 件のリクエストと、選択された場所予測に関する Geocoding API の呼び出しを合わせた料金は、0.01632 ドルになります。これは、Per Session Autocomplete でのセッション 1 回あたりの料金 0.017 ドルよりも少ないコストです。1

パフォーマンスに関するベスト プラクティスを導入し、できるだけ少ない入力文字数でユーザーが求める情報を提供できるようすることをおすすめします。

いいえ

セッション ベースの Place Autocomplete と Place Details を併用します。
ユーザーが Place Autocomplete の予測を選択するまでの平均リクエスト回数が、セッションあたりの料金を超えるため、Place Autocomplete 実装では、Place Autocomplete リクエストと、関連する Place Details リクエストの両方でセッション トークンを使用することをおすすめします(合計費用はセッションあたり 0.017 ドル)。1

ウィジェット実装
セッション管理が JavaScriptAndroid、または iOS ウィジェットに自動的に組み込まれます。これには、選択された予測結果での Place Autocomplete リクエストと Place Details リクエストの両方が含まれます。基本データ フィールドのみをリクエストするように、必ず fields パラメータを指定してください。

プログラマティック実装
Place Autocomplete リクエストでセッション トークンを使用します。選択された予測結果に関する Place Details をリクエストする際は、次のパラメータを含めます。

  1. Place Autocomplete レスポンスのプレイス ID
  2. Place Autocomplete リクエストで使用されるセッション トークン
  3. 住所やジオメトリなどの基本データ フィールドを指定する fields パラメータ

Place Autocomplete リクエストを遅らせることを検討する
ユーザーが最初の 3~4 文字を入力するまで Place Autocomplete リクエストを遅らせて、アプリケーションでのリクエスト数を減らすこともできます。たとえば、ユーザーが 3 文字目を入力してから、1 文字ごとに Place Autocomplete リクエストを行うとします。あるユーザーが、7 文字目を入力してから予測を選択し、Geocoding API リクエストが 1 回実行されました。この場合の合計費用は、0.01632 ドル(4 x Autocomplete Per Request 1 回の料金 0.00283 ドル + ジオコーディング 1 回の料金 0.005 ドル)となります。1

リクエストを遅らせることで、プログラマティック リクエストの回数を平均 4 回以下に抑えられる場合は、高パフォーマンスで Place Autocomplete と Geocoding API を併用する実装に関するガイダンスをご覧ください。なお、リクエストを遅らせると、1 文字入力するたびに予測が表示されはずと考えているユーザーには、遅延と受けとられる場合もあります。

パフォーマンスに関するベスト プラクティスを導入し、できるだけ少ない入力文字数でユーザーが求める情報を提供できるようすることをおすすめします。


  1. ここで提示されている料金は米ドルです。料金について詳しくは、Google Maps Platform の課金のページをご覧ください。

パフォーマンスに関するベスト プラクティス

Place Autocomplete のパフォーマンスを最適化するためのガイドラインは次のとおりです。

  • Place Autocomplete 実装に、国別のポリシー、場所のバイアス、言語設定(プログラマティック実装の場合)を追加します。ウィジェットはユーザーのブラウザやモバイル デバイスから言語設定を選択するため、ウィジェットでは言語設定は不要です。
  • Place Autocomplete が地図に関連付けられている場合は、地図のビューポートを基準に場所にバイアスをかけることができます。
  • ユーザーがいずれかの予測入力候補を選択しなかった場合は(通常は目的の住所が候補に挙がらなかったことが原因)、ユーザーの元の入力内容を再利用して、より関連性の高い結果を取得できます。
    • ユーザーが住所情報のみを入力することが予想される場合は、Geocoding API の呼び出しで、ユーザーの元の入力内容を再利用します。
    • ユーザーが特定の場所に関する検索語句(名前や住所)を入力することが予想される場合は、Find Place リクエストを使用します。特定の地域の結果のみが求められる場合は、場所のバイアスを使用します。
    Geocoding API へのフォールバックが最適となるその他のシナリオは次のとおりです。
    • 建物の棟の住所の Place Autocomplete サポートが不完全な国(チェコ、エストニア、リトアニアなど)で、ユーザーが建物の棟の住所を入力する場合。たとえば、チェコ語の住所「Stroupežnického 3191/17, Praha」では、Place Autocomplete で部分的な予測が生成されます。
    • ユーザーがニューヨークの「23-30 29th St, Queens」や、ハワイのカウアイ島の「47-380 Kamehameha Hwy, Kaneohe」など、道路区間のプレフィックスを入力する場合。

トラブルシューティング

さまざまなエラーが発生する可能性がありますが アプリで発生する可能性が高いのは、通常、構成エラー( (例: 間違った API キーが使用されていた、または API キーが構成されていた) など)、割り当てエラー(アプリがその割り当てを超過した)などのエラーが表示されます。詳しくは、 使用量上限 をご覧ください。

予測入力コントロールの使用中に発生したエラーは、 さまざまなデリゲート プロトコルの didFailAutocompleteWithError() メソッド。「 指定された NSError オブジェクトの code プロパティは、次のいずれかの値に設定されます。 GMSPlacesErrorCode 列挙値。