Place Autocomplete

Platform seçin: Android iOS JavaScript Web Hizmeti

iOS için Yerler SDK'sındaki otomatik tamamlama hizmeti, kullanıcı arama sorgularına yanıt olarak tahminler döndürür. Kullanıcı yazarken otomatik tamamlama hizmeti; işletmeler, adresler, artı kodları ve önemli yerler gibi yerler için öneriler döndürür.

Otomatik tamamlamayı uygulamanıza aşağıdaki şekillerde ekleyebilirsiniz:

Otomatik tamamlama kullanıcı arayüzü kontrolü ekleme

Otomatik tamamlama kullanıcı arayüzü kontrolü, yerleşik otomatik tamamlama işlevine sahip bir arama iletişim kutusudur. Kullanıcı arama terimleri girdiğinde kontrol, aralarından seçim yapabileceğiniz tahmin edilen yerlerin bir listesini gösterir. Kullanıcı seçim yaptığında, uygulamanızın seçilen yerle ilgili ayrıntıları almak için kullanabileceği bir GMSPlace örneği döndürülür.

Otomatik tamamlama kullanıcı arayüzü kontrolünü aşağıdaki yöntemlerle uygulamanıza ekleyebilirsiniz:

Tam ekran denetimi ekleme

Kalıcı bir bağlam istediğinizde tam ekran kontrolünü kullanın. Burada otomatik tamamlama kullanıcı arayüzü, kullanıcı seçimini yapana kadar uygulamanızın kullanıcı arayüzünün geçici olarak yerini alır. Bu işlev GMSAutocompleteViewController sınıfı tarafından sağlanır. Kullanıcı bir yer seçtiğinde uygulamanız geri arama alır.

Uygulamanıza tam ekran kontrolü eklemek için:

  1. Otomatik tamamlama kullanıcı arayüzü kontrolünü başlatmak için ana uygulamanızda bir kullanıcı arayüzü öğesi oluşturun (örneğin, UIButton cihazındaki bir dokunma işleyici).
  2. Üst görünüm denetleyicisinde GMSAutocompleteViewControllerDelegate protokolünü uygulayın.
  3. Bir GMSAutocompleteViewController örneği oluşturun ve üst görünüm denetleyicisini yetki verme özelliği olarak atayın.
  4. Döndürülecek yer verisi türlerini tanımlamak için bir GMSPlaceField oluşturun.
  5. Sorguyu belirli bir yer türüyle sınırlamak için GMSAutocompleteFilter ekleyin.
  6. [self presentViewController...] kullanarak GMSAutocompleteViewController'ı sunun.
  7. didAutocompleteWithPlace yetki verme yönteminde kullanıcı seçimini işleyin.
  8. didAutocompleteWithPlace, didFailAutocompleteWithError ve wasCancelled yetki verme yöntemlerinde kumandayı kapatabilirsiniz.

Aşağıdaki örnekte, kullanıcının bir düğmeye dokunmasına yanıt olarak GMSAutocompleteViewController'i başlatmanın olası bir yolu gösterilmektedir.

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:NSSelectorFromString(@"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

Sonuç denetleyici ekleme

Metin girişi kullanıcı arayüzü üzerinde daha fazla kontrol sahibi olmak istediğinizde sonuç denetleyicisi kullanın. Sonuç denetleyici, sonuç listesinin görünürlüğünü giriş kullanıcı arayüzü odağına göre dinamik olarak değiştirir.

Uygulamanıza sonuç denetleyici eklemek için:

  1. Bir GMSAutocompleteResultsViewController oluşturun.
  2. Üst görünüm denetleyicisinde GMSAutocompleteResultsViewControllerDelegate protokolünü uygulayın ve üst görünüm denetleyicisini yetki verilmiş mülk olarak atayın.
  3. Sonuç denetleyici bağımsız değişkeni olarak GMSAutocompleteResultsViewController değerini ileten bir UISearchController nesnesi oluşturun.
  4. GMSAutocompleteResultsViewController değerini, UISearchController öğesinin searchResultsUpdater özelliği olarak ayarlayın.
  5. UISearchController için searchBar bilgisini uygulamanızın kullanıcı arayüzüne ekleyin.
  6. didAutocompleteWithPlace yetki verme yönteminde kullanıcı seçimini işleyin.

UISearchController arama çubuğunu, uygulamanızın kullanıcı arayüzüne yerleştirmenin birkaç yolu vardır:

Gezinme çubuğuna arama çubuğu ekleme

Aşağıdaki kod örneğinde sonuç denetleyicisi ekleme, gezinme çubuğuna searchBar ekleme ve kullanıcı seçimi gösterilmektedir:

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;
}

Bir görünümün üst kısmına arama çubuğu ekleme

Aşağıdaki kod örneğinde, searchBar öğesinin bir görünümün üst kısmına eklenmesi gösterilmektedir.

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;
}

Varsayılan olarak, UISearchController ekran gösterilirken gezinme çubuğunu gizler (bu özellik devre dışı bırakılabilir). Gezinme çubuğunun görünür ve opak olduğu durumlarda UISearchController, yerleşimi doğru bir şekilde ayarlamaz.

Geçici bir çözüm olarak aşağıdaki kodu kullanın:

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;

Pop-up sonuçlarını kullanarak arama çubuğu ekleme

Aşağıdaki kod örneğinde, gezinme çubuğunun sağ tarafına bir arama çubuğu yerleştirilmesi ve sonuçların bir pop-up penceresinde görüntülenmesi gösterilmektedir.

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;
}

Tablo veri kaynağı kullanma

Uygulamanızın özel arama metni kullanıcı arayüzü varsa sonuçların görünüm denetleyicisinde gösterildiği tablo görünümünü kullanmak için GMSAutocompleteTableDataSource sınıfını kullanabilirsiniz.

GMSAutocompleteTableDataSource'ı bir görünüm denetleyicisinde veri kaynağı ve UITableView yetkisi olarak kullanmak için:

  1. Görünüm denetleyicide GMSAutocompleteTableDataSourceDelegate ve UISearchBarDelegate protokollerini uygulayın.
  2. Bir GMSAutocompleteTableDataSource örneği oluşturun ve görünüm denetleyicisini yetki verme özelliği olarak atayın.
  3. GMSAutocompleteTableDataSource öğesini veri kaynağı olarak ayarlayın ve görünüm denetleyicisinde UITableView örneğinin yetki verme özelliklerini kullanın.
  4. Arama metni girişi işleyicisinde, GMSAutocompleteTableDataSource üzerinde sourceTextHasChanged yöntemini çağırın.
  5. didAutocompleteWithPlace yetki verme yönteminde kullanıcı seçimini yönetin.
  6. didAutocompleteWithPlace, didFailAutocompleteWithError, wasCancelled yetki verme yöntemlerinde kumandayı kapatabilirsiniz.

Aşağıdaki kod örneğinde, UISearchBar ayrı olarak eklendiğinde UIViewController tablo görünümünü çalıştırmak için GMSAutocompleteTableDataSource sınıfının kullanılması gösterilmektedir.

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

      

Metin ve arka plan renklerini özelleştirme

Widget'ın, uygulamanızın görsel görünümüne daha uygun olmasını sağlamak için otomatik tamamlama kullanıcı arayüzü denetiminde tüm metin ve arka planların renklerini ayarlayabilirsiniz. Kullanıcı arayüzü kontrol renklerini ayarlamanın iki yolu vardır:

  • Mümkün olduğunda kullanıcı arayüzü kontrollerinin genel stilini belirlemek için yerel iOS UIViewance protokolünü kullanarak. Bu ayarlar, tüm kullanıcı arayüzü kontrol öğeleri için geçerli olmasa da çoğu için geçerlidir.
  • UIGörünüm protokolü tarafından desteklenmeyen özellikleri ayarlamak için widget sınıflarındaki SDK yöntemlerini kullanarak.

Uygulamanız genellikle UILookance protokolü ve SDK yöntemlerinin bir kombinasyonunu kullanır. Aşağıdaki şemada, hangi öğelere stil eklenebileceği gösterilmektedir:

Otomatik tamamlama kullanıcı arayüzü kontrol renkleri

Aşağıdaki tabloda, tüm kullanıcı arayüzü öğeleri listelenmekte ve her birinin nasıl stil uygulanması gerektiği (UIGörünüm protokolü veya SDK yöntemi) belirtilmiştir.

Kullanıcı Arayüzü Öğesi Yöntem Moda bilgileri
Gezinme çubuğu tonu (arka plan) UIGörünüm protokolü UINavigationBar proxy'sinde setBarTintColor öğesini çağır.
Gezinme Çubuğu ton rengi (arama çubuğu metin imleci ve İptal düğmesi) UIGörünüm protokolü UINavigationBar proxy'sinde setTintColor öğesini çağır.
Arama Çubuğu metin rengi UIGörünüm protokolü searchBarTextAttributes içinde NSForegroundColorAttributeName ayarlayın.
Arama çubuğu ton rengi Yok Arama çubuğu yarı saydamdır ve Gezinme Çubuğunun gölgeli versiyonu olarak görüntülenir.
Arama çubuğu yer tutucu metin rengi (varsayılan arama metni) UIGörünüm protokolü placeholderAttributes içinde NSForegroundColorAttributeName ayarlayın.
Birincil metin (hata ve ileti metnine de uygulanır) SDK yöntemi primaryTextColor Hizmetleri İçin Arayın.
Birincil metin vurgulama SDK yöntemi primaryTextHighlightColor Hizmetleri İçin Arayın.
İkincil metin SDK yöntemi secondaryTextColor Hizmetleri İçin Arayın.
Hata ve mesaj metni SDK yöntemi primaryTextColor Hizmetleri İçin Arayın.
Tablo hücre arka planı SDK yöntemi tableCellBackgroundColor Hizmetleri İçin Arayın.
Tablo hücre ayırıcı rengi SDK yöntemi tableCellSeparatorColor Hizmetleri İçin Arayın.
"Tekrar Dene" düğmesi SDK yöntemi tintColor Hizmetleri İçin Arayın.
Etkinlik göstergesi (ilerleme döner simgesi) UIGörünüm protokolü UIActivityIndicatorView proxy'sinde setColor öğesini çağır.
"Google tarafından desteklenmektedir" logosu, Üzgün bulut resmi Yok Arka plan kontrastına göre beyaz veya gri sürüm otomatik olarak seçilir.
Arama Çubuğu metin alanında büyüteç ve temiz metin simgeleri Yok Stil için varsayılan resimleri istediğiniz renkteki resimlerle değiştirin.

UIViewance protokolünü kullanma

Belirli bir kullanıcı arayüzü öğesinin görünüm proxy'sini almak için UIViewance protokolünü kullanabilirsiniz. Daha sonra bunu, UI öğesinin rengini ayarlamak için kullanabilirsiniz. Değişiklik yapıldığında, belirli bir kullanıcı arayüzü öğesinin tüm örnekleri etkilenir. Örneğin, aşağıdaki örnek, UISearchBar içinde yer alan UITextField sınıflarının metin rengini genel olarak yeşile dönüştürür:

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

Renk değerlerini tanımlama hakkında daha fazla bilgi için UIColor Sınıf Referansı'na bakın.

Aşağıdaki kod snippet'leri, tam ekran otomatik tamamlama kullanıcı arayüzü kontrolündeki her şeyin stilini belirlemek için kullanmanız gereken tüm proxy komutlarını gösterir. Bu kodu Appdelegate.m'de didFinishLaunchingWithOptions yöntemine ekleyin:

// 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;

Kullanıcı arayüzü kontrol stili özelliklerini ayarlama

Kullanıcı arayüzü kontrol öğelerinin bir alt grubu, UIViewance protokolünden etkilenmeyen özelliklere sahip olduğundan doğrudan ayarlanmalıdır. Aşağıdaki kod örneğinde, ön ve arka plan renklerinin tanımlanması ve bunların acController adlı bir kullanıcı arayüzü kontrol örneğine uygulanması gösterilmektedir. Bu kodu ViewController.m'deki onLaunchClicked yöntemine ekleyin:

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;

Yer tahminlerini programatik olarak alma

Otomatik tamamlama widget'ının sağladığı kullanıcı arayüzüne alternatif olarak özel bir arama kullanıcı arayüzü oluşturabilirsiniz. Bunun için uygulamanızın yer tahminlerini programatik olarak alması gerekir. Uygulamanız, aşağıdaki yöntemlerden birini kullanarak tahmin edilen yer adlarının ve/veya adreslerin listesini alabilir:

GMSPlacesClient findAutocompletePredictionsFromQuery: aranıyor

Tahmin edilen yer adlarının ve/veya adreslerinin listesini almak için önce GMSPlacesClient uygulamasını başlatın, ardından aşağıdaki parametrelerle GMSPlacesClient findAutocompletePredictionsFromQuery: yöntemini çağırın:

  • Kullanıcının yazdığı metni içeren autocompleteQuery dizesi.
  • Her bir oturumu tanımlamak için kullanılan GMSAutocompleteSessionToken. Uygulamanız her otomatik tamamlama isteği çağrısı için aynı jetonu iletmeli, ardından kullanıcı tarafından seçilen yerin Yer Ayrıntılarını almak için fetchPlacefromPlaceID:'e yapılan bir sonraki çağrıda Yer Kimliği ile birlikte bu jetonu iletmelidir.
  • GMSAutocompleteFilter ile:
    • Yanlı olma veya sonuçları belirli bir bölgeyle sınırlandırma.
    • Sonuçları belirli bir yer türüyle sınırlandırın.
    • Sonuçlara enlem ve boylam sınırlarıyla belirtilen belirli bir alana ağırlık veren GMSPlaceLocationBias/Kısıtlama nesnesi.
  • Döndürülen tahminleri işlemek için bir geri çağırma yöntemi.

Aşağıdaki kod örneklerinde bir findAutocompletePredictionsFromQuery: çağrısı gösterilmektedir.

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, bir GMSAutocompletePrediction nesne dizisi ileterek belirtilen geri çağırma yöntemini çağırır.

Her GMSAutocompletePrediction nesnesi aşağıdaki bilgileri içerir:

  • attributedFullText – Tahminin NSAttributedString biçimindeki tam metni. Örneğin, "Sidney Opera Binası, Sidney, Yeni Güney Galler, Avustralya". Kullanıcı girişiyle eşleşen her metin aralığının bir özelliği (kGMSAutocompleteMatchAttribute) vardır. Bu özelliği, kullanıcının sorgusunda eşleşen metni vurgulamak için kullanabilirsiniz (örneğin, aşağıda gösterildiği gibi).
  • placeID: Tahmin edilen yerin yer kimliğidir. Yer kimliği, bir yeri benzersiz şekilde tanımlayan metinsel bir tanımlayıcıdır. Yer kimlikleri hakkında daha fazla bilgi için bkz. Yer Kimliğine genel bakış.
  • distanceMeters – Belirtilen origin ile hedefe arasındaki düz çizgi mesafesi. origin özelliği ayarlanmazsa mesafe değeri döndürülmez.

Aşağıdaki kod örneğinde, kullanıcının sorgusundaki metinle eşleşen sonuç bölümlerinin enumerateAttribute kullanılarak kalın metinle nasıl vurgulanacağı gösterilmektedir:

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;
    

Alıcıyı kullanma

Kendi otomatik tamamlama denetiminizi sıfırdan oluşturmak istiyorsanız GMSPlacesClient üzerinde autocompleteQuery yöntemini sarmalayan GMSAutocompleteFetcher özelliğini kullanabilirsiniz. Alıcı, istekleri kısıtlayarak yalnızca en son girilen arama metnine ilişkin sonuçları döndürür. Kullanıcı arayüzü öğeleri sağlamaz.

GMSAutocompleteFetcher'i uygulamak için aşağıdaki adımları uygulayın:

  1. GMSAutocompleteFetcherDelegate protokolünü uygulayın.
  2. GMSAutocompleteFetcher nesnesi oluşturun.
  3. Kullanıcı yazarken alıcıda sourceTextHasChanged komutunu çağırın.
  4. didAutcompleteWithPredictions ve didFailAutocompleteWithError protokol yöntemlerini kullanarak tahminleri ve hataları işleyin.

Aşağıdaki kod örneğinde, kullanıcı girişi almak ve yer eşleşmelerini metin görünümünde görüntülemek için alıcının kullanılması gösterilmektedir. Yer seçme işlevi atlandı. FetcherSampleViewController, FetcherSampleViewController.h'deki UIViewController öğesinden türetilir.

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

Oturum jetonları

Oturum jetonları, faturalandırma amacıyla bir kullanıcı otomatik tamamlama aramasının sorgu ve seçim aşamalarını ayrı bir oturumda gruplandırır. Oturum, kullanıcı bir sorgu yazmaya başladığında başlar ve kullanıcı bir yer seçtiğinde sona erer. Her oturumda birden fazla sorgu bulunabilir ve oturumlarda tek bir yer seçimi yapılabilir. Bir oturum sona erdiğinde jeton artık geçerli olmaz. Bu durumda uygulamanızın her oturum için yeni bir jeton oluşturması gerekir. Tüm programatik otomatik tamamlama oturumları için oturum jetonları kullanmanızı öneririz (tam ekran denetleyicisini veya sonuç denetleyicisini kullandığınızda API bunu otomatik olarak yapar).

iOS için Yerler SDK'sı her oturumu tanımlamak için bir GMSAutocompleteSessionToken kullanır. Uygulamanız her yeni oturumun başlangıcında yeni bir oturum jetonu iletmeli, ardından kullanıcı tarafından seçilen yerin Yer Ayrıntılarını almak için fetchPlacefromPlaceID:'e yapılan sonraki çağrıda bir Yer Kimliği ile birlikte aynı jetonu iletmelidir.

Oturum jetonları hakkında daha fazla bilgi edinin.

Yeni bir oturum jetonu oluşturmak için aşağıdaki kodu kullanın:

let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init()

Kullanım sınırları

İlişkilendirmeleri uygulamanızda gösterme

  • Uygulamanız otomatik tamamlama hizmetini programatik olarak kullanıyorsa kullanıcı arayüzünüzde "Google tarafından desteklenmektedir" ilişkilendirmesi ya da Google markalı bir haritada yer alması gerekir.
  • Uygulamanız otomatik tamamlama kullanıcı arayüzü kontrolünü kullanıyorsa ek bir işlem yapmanız gerekmez (varsayılan olarak gerekli ilişkilendirme gösterilir).
  • Bir yeri kimliğe göre aldıktan sonra ek yer bilgileri alıp görüntülerseniz üçüncü taraf ilişkilendirmelerini de göstermeniz gerekir.

Daha fazla bilgi için ilişkilendirmeler hakkındaki belgeleri inceleyin.

Ağ etkinliği göstergesini denetleme

Uygulamaların durum çubuğundaki ağ etkinliği göstergesini kontrol etmek üzere, kullandığınız otomatik tamamlama sınıfı için uygun, isteğe bağlı yetki verme yöntemlerini uygulamanız ve ağ göstergesini kendiniz açıp kapatmanız gerekir.

  • GMSAutocompleteViewController için didRequestAutocompletePredictions: ve didUpdateAutocompletePredictions: yetki verme yöntemlerini uygulamanız gerekir.
  • GMSAutocompleteResultsViewController için didRequestAutocompletePredictionsForResultsController: ve didUpdateAutocompletePredictionsForResultsController: yetki verme yöntemlerini uygulamanız gerekir.
  • GMSAutocompleteTableDataSource için didRequestAutocompletePredictionsForTableDataSource: ve didUpdateAutocompletePredictionsForTableDataSource: yetki verme yöntemlerini uygulamanız gerekir.

Bu yöntemleri uygulayarak ve [UIApplication sharedApplication].networkActivityIndicatorVisible politikasını sırasıyla YES ve NO olarak ayarladığınızda durum çubuğu, otomatik tamamlama kullanıcı arayüzüyle doğru bir şekilde eşleşir.

Otomatik tamamlama sonuçlarını sınırla

Otomatik tamamlama kullanıcı arayüzü denetimini, sonuçları belirli bir coğrafi bölgeyle sınırlandıracak ve/veya sonuçları bir ya da daha fazla yer türüne ya da belirli bir ülke veya ülkelere göre filtreleyebilirsiniz. Sonuçları sınırlandırmak için aşağıdakileri yapabilirsiniz:

  • Tanımlanan bölge dahilindeki sonuçları tercih etmek (önyargı) için GMSAutocompleteFilter üzerinde locationBias öğesini ayarlayın (tanımlanan bölgenin dışından bazı sonuçlar döndürülmeye devam edebilir). locationRestriction politikası da ayarlanırsa locationBias yoksayılır.
  • Yalnızca tanımlanan bölgedeki sonuçları göstermek (kısıtlamak) için GMSAutocompleteFilter üzerinde locationRestriction değerini ayarlayın (yalnızca tanımlanan bölgedeki sonuçlar döndürülür).

    • Not: Bu kısıtlama yalnızca rotaların tamamına uygulanır. Dikdörtgen sınırların dışında bulunan sentetik sonuçlar, konum kısıtlamasıyla çakışan bir rotaya göre döndürülebilir.
  • Yalnızca belirli bir yer türüne uygun sonuçları döndürmek için GMSAutocompleteFilter öğesinde types öğesini ayarlayın (örneğin, TypeFilter.ADDRESS belirtmek widget'ın yalnızca tam adresli sonuçları döndürmesine neden olur).

  • Yalnızca en fazla beş belirtilen ülkeye ait sonuçları döndürmek için GMSAutocompleteFilter üzerinde countries değerini ayarlayın.

Belirli bir bölge için yanlı sonuçlar

Tanımlanan bölge içindeki sonuçları tercih etmek (önyargı) için GMSAutocompleteFilter üzerinde locationBias öğesini burada gösterildiği gibi ayarlayın:

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

Sonuçları belirli bir bölgeyle sınırlandırın

Yalnızca tanımlanan bölgedeki sonuçları göstermek (kısıtlamak) için GMSAutocompleteFilter üzerinde locationRestriction özelliğini aşağıda gösterildiği gibi ayarlayın:

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

Sonuçları ülkeye göre filtreleyin

En fazla beş belirtilen ülkedeki sonuçları filtrelemek için GMSAutocompleteFilter üzerinde countries öğesini aşağıda gösterildiği gibi ayarlayın:

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

Sonuçları yer türüne veya koleksiyon türüne göre filtreleyin

GMSAutoCompleteFilter öğesinin types özelliğini ayarlayarak sonuçları belirli bir türde veya tür bir koleksiyonda olacak şekilde kısıtlayın. Yer Türleri'ndeki 1, 2 ve 3 numaralı Tablo'larda listelenen filtreleri belirtmek için bu özelliği kullanın. Hiçbir şey belirtilmezse tüm türler döndürülür.

Bir tür veya tür koleksiyon filtresi belirtmek için:

  • Yer Türleri'nde gösterilen Tablo 1 ve Tablo 2'den en fazla beş type değeri belirtmek için types özelliğini kullanın. Tür değerleri, GMSPlaceType içindeki sabitlerle tanımlanır.

  • Yer Türleri'nde gösterilen Tablo 3'ten bir tür koleksiyonu belirtmek için types özelliğini kullanın. Tür koleksiyonu değerleri, GMSPlaceType içindeki sabitlerle tanımlanır.

    İstekte Tablo 3'ten yalnızca bir türe izin verilir. Tablo 3'ten bir değer belirtirseniz Tablo 1'den veya Tablo 2'den değer belirtemezsiniz. Aksi takdirde bir hata oluşur.

Örneğin, yalnızca belirli bir yer türüne uygun sonuçları döndürmek için GMSAutocompleteFilter üzerinde types değerini ayarlayın. Aşağıdaki örnekte, filtrenin yalnızca kesin adres içeren sonuçları döndürecek şekilde ayarlanması gösterilmektedir:

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

Yer Otomatik Tamamlama optimizasyonu

Bu bölümde Otomatik Yer Tamamlama hizmetinden en iyi şekilde yararlanmanıza yardımcı olacak en iyi uygulamalar açıklanmaktadır.

Bazı genel kurallar şunlardır:

  • Çalışan bir kullanıcı arayüzü geliştirmenin en hızlı yolu, Maps JavaScript API Otomatik tamamlama widget'ı, Android için Yerler SDK'sı Otomatik tamamlama widget'ı veya iOS için Yerler SDK'sı Otomatik tamamlama kullanıcı arayüzü kontrolü'nü kullanmaktır
  • Otomatik Yer Tamamlama veri alanları hakkında en baştan bilgi edinin.
  • Konuma ağırlık verme ve konum kısıtlaması alanları isteğe bağlıdır ancak otomatik tamamlama performansı üzerinde önemli bir etkiye sahip olabilir.
  • API'nin hata döndürdüğü durumlarda uygulamanızın sorunsuz şekilde geri çekildiğinden emin olmak için hata işlemeyi kullanın.
  • Uygulamanızın seçim yapılmadığında bunu işlendiğinden ve kullanıcılara devam etmeleri için bir yol sunduğundan emin olun.

Maliyet optimizasyonuyla ilgili en iyi uygulamalar

Temel maliyet optimizasyonu

Otomatik Yer Tamamlama hizmetini kullanma maliyetini optimize etmek için, Yer Ayrıntıları ve Otomatik Yer Tamamlama widget'larındaki alan maskelerini kullanarak yalnızca ihtiyacınız olan yer verisi alanlarını döndürün.

Gelişmiş maliyet optimizasyonu

İstek Başına Fiyatlandırma'ya erişmek ve seçilen yer hakkında Yer Ayrıntıları yerine Coğrafi Kodlama API'si sonuçlarını istemek için Otomatik Yer Tamamlama özelliğinin programatik olarak uygulanmasını göz önünde bulundurun. Aşağıdaki koşulların her ikisi de karşılanırsa İstek Başına Fiyatlandırma, Geocoding API ile eşleştirilen Oturum Başına (oturuma dayalı) fiyatlandırmadan daha uygun maliyetlidir:

  • Yalnızca kullanıcının seçtiği yerin enlem/boylam veya adresine ihtiyaç duyarsanız Coğrafi Kodlama API'si bu bilgileri Yer Ayrıntısı çağrısından daha düşük bir ücret karşılığında sunar.
  • Kullanıcılar ortalama dört veya daha az Otomatik Tamamlama tahmin isteği içinde bir otomatik tamamlama tahmini seçerse, İstek Başına fiyatlandırma, Oturum Başına fiyatlandırmadan daha uygun maliyetli olabilir.
İhtiyaçlarınıza uyan Otomatik Yer Tamamlama uygulamasını seçme konusunda yardım almak için aşağıdaki soruya vereceğiniz yanıta karşılık gelen sekmeyi seçin.

Uygulamanız, seçilen tahminin adresi ve enlem/boylam dışında herhangi bir bilgi gerektiriyor mu?

Evet, daha fazla ayrıntı gerekiyor

Yer Ayrıntıları ile oturuma dayalı Otomatik Yer Tamamlama özelliğini kullanın.
Uygulamanız yer adı, işletme durumu veya çalışma saatleri gibi Yer Ayrıntıları gerektirdiğinden, Yer Otomatik Tamamlama özelliği programatik olarak veya JavaScript, Android ya da iOS widget'larında yerleşik olarak bulunan bir oturum jetonu (programatik, Android ya da iOS widget'larında yerleşik) kullanmalıdır.Bunun için toplam maliyet 0, 017 ABD doları (oturum başına ve geçerli Yer Verileri SKU'ları yer verileri SKU'ları olmalıdır{/15).

Widget uygulaması
Oturum yönetimi JavaScript, Android veya iOS widget'larına otomatik olarak eklenir. Buna hem otomatik Yer Tamamlama istekleri hem de seçilen tahmindeki Yer Ayrıntısı isteği dahildir. Yalnızca ihtiyacınız olan yer verisi alanlarını istediğinizden emin olmak için fields parametresini belirttiğinizden emin olun.

Programatik uygulama
Otomatik Yer Tamamlama isteklerinizle bir oturum jetonu kullanın. Seçilen tahmin hakkında Yer Ayrıntıları isterken aşağıdaki parametreleri ekleyin:

  1. Otomatik Yer Tamamlama yanıtındaki yer kimliği
  2. Otomatik Yer Tamamlama isteğinde kullanılan oturum jetonu
  3. İhtiyacınız olan yer verisi alanlarını belirten fields parametresi

Hayır, yalnızca adres ve konum gerekiyor

Otomatik Yer Tamamlama kullanımınızın performansına bağlı olarak Coğrafi Kodlama API'sı, uygulamanız için Yer Ayrıntıları'ndan daha uygun maliyetli bir seçenek olabilir. Her uygulamanın Otomatik Tamamlama verimliliği, hangi kullanıcıların giriş yaptığına, uygulamanın nerede kullanıldığına ve performans optimizasyonuyla ilgili en iyi uygulamaların uygulanıp uygulanmadığına bağlı olarak değişiklik gösterir.

Aşağıdaki soruyu yanıtlamak için, bir kullanıcının uygulamanızda Yer Otomatik Tamamlama tahmini seçmeden önce ortalama kaç karakter yazdığını analiz edin.

Kullanıcılarınız ortalama olarak dört veya daha az istekte Yer Otomatik Tamamlama tahminini seçiyor mu?

Evet

Otomatik Yer Tamamlama özelliğini oturum jetonları olmadan programatik olarak uygulayın ve seçilen yer tahmininde Coğrafi Kodlama API'sini çağırın.
Geocoding API, adresleri ve enlem/boylam koordinatlarını istek başına 0,005 ABD doları karşılığında sunar. Dört adet Otomatik Otomatik Tamamlama - İstek Başına istek göndermenin maliyeti 0,01132 ABD dolarıdır. Bu nedenle, seçilen yer tahminiyle ilgili dört isteğin toplam maliyeti ile birlikte Coğrafi Kodlama API'si çağrısının toplam maliyeti 0,01632 ABD doları olur. Bu da oturum başına 0,017 ABD doları olan Oturum Başına Otomatik Tamamlama fiyatından daha düşüktür.1

Kullanıcılarınızın aradıkları tahmini daha az karakterle bulmalarına yardımcı olmak için performans en iyi uygulamalarından yararlanmayı düşünebilirsiniz.

Hayır

Yer Ayrıntıları ile oturuma dayalı Otomatik Yer Tamamlama özelliğini kullanın.
Bir kullanıcı Otomatik Yer Tamamlama tahminini seçmeden önce gerçekleştirmeyi beklediğiniz ortalama istek sayısı, Oturum Başına fiyatlandırmayı aştığından, Yer Otomatik Tamamlama özelliği hem Otomatik Yer Tamamlama istekleri hem de bununla ilişkili Yer Ayrıntısı isteği için toplam oturum başına 0,017 ABD doları olmak üzere bir oturum jetonu kullanmalıdır.1

Widget uygulaması
Oturum yönetimi JavaScript, Android veya iOS widget'larına otomatik olarak eklenir. Buna hem otomatik Yer Tamamlama istekleri hem de seçilen tahmindeki Yer Ayrıntısı isteği dahildir. Yalnızca Temel Veriler alanlarını istediğinizden emin olmak için fields parametresini belirttiğinizden emin olun.

Programatik uygulama
Otomatik Yer Tamamlama isteklerinizle bir oturum jetonu kullanın. Seçilen tahmin hakkında Yer Ayrıntıları isterken aşağıdaki parametreleri ekleyin:

  1. Otomatik Yer Tamamlama yanıtındaki yer kimliği
  2. Otomatik Yer Tamamlama isteğinde kullanılan oturum jetonu
  3. Adres ve geometri gibi Temel Veri alanlarını belirten fields parametresi

Otomatik Yer Tamamlama isteklerini ertelemeyi düşünün
Otomatik Yer Tamamlama isteğini, kullanıcı ilk üç veya dört karakteri yazana kadar ertelemek gibi stratejiler kullanarak uygulamanızın daha az istek göndermesini sağlayabilirsiniz. Örneğin, kullanıcı üçüncü karakteri yazdıktan sonra her karakter için Otomatik Tamamlama isteklerinde bulunmak, kullanıcı yedi karakteri yazdıktan sonra bir Coğrafi Kodlama API'si isteği gönderdiğiniz bir tahmin seçerse toplam maliyetin 0,01632 ABD doları (4 * 0,00283 ABD doları Otomatik Tamamlama + 0,005 ABD doları Coğrafi Kodlama) olacağı anlamına gelir.1

İstekleri ertelemek ortalama programatik isteğinizin dörtün altına düşmesine neden oluyorsa Geocoding API ile otomatik yer tamamlama performansı uygulama yönergelerinden yararlanabilirsiniz. İsteklerin geciktirilmesinin, her yeni tuş vuruşunda tahmin görmeyi bekleyen kullanıcılar tarafından gecikme olarak algılanabileceğini unutmayın.

Kullanıcılarınızın aradıkları tahmini daha kısa sürede elde etmelerine yardımcı olmak için performansla ilgili en iyi uygulamalardan yararlanabilirsiniz.


  1. Burada listelenen maliyetler ABD doları cinsindendir. Tam fiyatlandırma bilgileri için lütfen Google Haritalar Platformu Faturalandırma sayfasına bakın.

Performansla ilgili en iyi uygulamalar

Aşağıdaki yönergelerde Otomatik Yer Tamamlama performansının optimize edilmesi için izlenecek yöntemler açıklanmaktadır:

  • Otomatik Yer Tamamlama uygulamanıza ülke kısıtlamaları, konuma ağırlık verme ve (programatik uygulamalar için) dil tercihi ekleyin. Widget'lar dil tercihlerini kullanıcının tarayıcısından veya mobil cihazdan seçtiği için widget'larda dil tercihi yapmanız gerekmez.
  • Otomatik Yer Tamamlama'ya bir harita eşlik ediyorsa, konumu harita görünümüne göre değiştirebilirsiniz.
  • Kullanıcının Otomatik Tamamlama tahminlerinden birini seçmediği durumlarda, genellikle bu tahminlerden hiçbiri istenen sonuç adresi olmadığından, daha alakalı sonuçlar elde etmek için orijinal kullanıcı girişini yeniden kullanabilirsiniz:
    • Kullanıcının yalnızca adres bilgilerini girmesini bekliyorsanız Geocoding API'ye yapılan bir çağrıda orijinal kullanıcı girişini yeniden kullanın.
    • Kullanıcının belirli bir yer için ada veya adrese göre sorgu girmesini bekliyorsanız, Yer Bulma isteğini kullanın. Yalnızca belirli bir bölgede sonuç bekleniyorsa konuma ağırlık vermeyi kullanın.
    Geocoding API'nin en iyi seçenek olduğu diğer senaryolar şunlardır:
    • Şirket içi adresler için Otomatik Yer Tamamlama desteğinin eksik olduğu ülkelerdeki (ör. Çekya, Estonya ve Litvanya) bina alt adreslerini giren kullanıcılar. Örneğin, Çekçedeki "Stroupežnického 3191/17, Praha" adresi, Yer Otomatik Tamamlama'da kısmi bir tahmin verir.
    • New York City'de "23-30 29th St, Queens" veya Hawaii'deki Kauai Adası'nda "47-380 Kamehameha Hwy, Kaneohe" gibi yol segmenti ön ekleriyle adresler giren kullanıcılar.

Sorun giderme

Çok çeşitli hatalar ortaya çıkabilse de uygulamanızın karşılaşabileceği hataların çoğu genellikle yapılandırma hatalarından (örneğin, yanlış API anahtarının kullanılması veya API anahtarının yanlış yapılandırılmış olması) veya kota hatalarından (uygulamanızın kotasını aşması) kaynaklanır. Kotalar hakkında daha fazla bilgi için Kullanım Sınırları bölümüne bakın.

Otomatik tamamlama denetimleri kullanılırken ortaya çıkan hatalar, çeşitli yetki protokollerinin didFailAutocompleteWithError() yönteminde döndürülür. Sağlanan NSError nesnesinin code özelliği, GMSPlacesErrorCode numaralandırmasının değerlerinden birine ayarlandı.