Yer Adı Otomatik Tamamlama (Eski), kullanıcıların arama sorgularına yanıt olarak yer tahminleri döndürür. Kullanıcı yazarken otomatik tamamlama hizmeti işletmeler, adresler, Plus Code'lar ve önemli yerler gibi yerler için öneriler döndürür.
Otomatik tamamlama özelliğini uygulamanıza aşağıdaki yöntemlerle ekleyebilirsiniz:
- Geliştirme süresinden tasarruf etmek ve tutarlı bir kullanıcı deneyimi sağlamak için otomatik tamamlama kullanıcı arayüzü kontrolü ekleyin.
- Özelleştirilmiş bir kullanıcı deneyimi oluşturmak için yer tahminlerini programatik olarak alın.
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 terimlerini girerken kontrol, seçebileceği tahmini yerlerin listesini sunar. Kullanıcı seçim yaptığında bir GMSPlace örneği döndürülür. Uygulamanız bu örneği kullanarak seçilen yerle ilgili ayrıntıları alabilir.
Otomatik tamamlama kullanıcı arayüzü kontrolünü uygulamanıza aşağıdaki yöntemlerle ekleyebilirsiniz:
Tam ekran kontrolü ekleme
Kullanıcı seçimini yapana kadar otomatik tamamlama kullanıcı arayüzünün uygulamanızın kullanıcı arayüzünün yerini geçici olarak aldığı kalıcı bir bağlam istediğinizde tam ekran kontrolünü kullanın. Bu işlev, GMSAutocompleteViewController sınıfı tarafından sağlanır. Kullanıcı bir yer seçtiğinde uygulamanız bir geri çağırma alır.
Uygulamanıza tam ekran kontrolü eklemek için:
- Otomatik tamamlama kullanıcı arayüzü kontrolünü başlatmak için ana uygulamanızda bir kullanıcı arayüzü öğesi (ör.
UIButtonüzerinde bir dokunma işleyici) oluşturun. - Üst görünüm denetleyicisinde
GMSAutocompleteViewControllerDelegateprotokolünü uygulayın. GMSAutocompleteViewControllerörneği oluşturun ve üst görünüm denetleyiciyi temsilci özelliği olarak atayın.- Döndürülecek yer verisi türlerini tanımlamak için
GMSPlaceFieldoluşturun. - Sorguyu belirli bir yer türüyle sınırlamak için
GMSAutocompleteFilterekleyin. [self presentViewController...]kullanarakGMSAutocompleteViewControllersunun.- Kullanıcının seçimini
didAutocompleteWithPlacetemsilci yönteminde işleyin. didAutocompleteWithPlace,didFailAutocompleteWithErrorvewasCancelledtemsilci yöntemlerinde denetleyiciyi kapatın.
Aşağıdaki örnekte, kullanıcının bir düğmeye dokunmasına yanıt olarak GMSAutocompleteViewController'ın nasıl başlatılabileceği 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 = [kGMSPlaceTypeCollectionAddress] 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
Sonuç denetleyicisi ekleme
Metin girişi kullanıcı arayüzü üzerinde daha fazla kontrol sahibi olmak istediğinizde sonuç denetleyicisi kullanın. Sonuç denetleyicisi, giriş kullanıcı arayüzü odağına göre sonuç listesinin görünürlüğünü dinamik olarak değiştirir.
Uygulamanıza sonuç denetleyicisi eklemek için:
GMSAutocompleteResultsViewControlleroluşturun.- Ebeveyn görünümü denetleyicisinde
GMSAutocompleteResultsViewControllerDelegateprotokolünü uygulayın ve ebeveyn görünümü denetleyiciyi temsilci özelliği olarak atayın.
- Ebeveyn görünümü denetleyicisinde
- Sonuç denetleyici bağımsız değişkeni olarak
GMSAutocompleteResultsViewControllerdeğerini ileterek birUISearchControllernesnesi oluşturun. GMSAutocompleteResultsViewControlleröğesiniUISearchControlleröğesininsearchResultsUpdaterözelliği olarak ayarlayın.UISearchControlleriçinsearchBarözelliğini uygulamanızın kullanıcı arayüzüne ekleyin.- Kullanıcının seçimini
didAutocompleteWithPlacetemsilci yönteminde 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
- Görünümün üst kısmına arama çubuğu ekleme
- Pop-over sonuçları kullanarak arama çubuğu ekleme
Gezinme çubuğuna arama çubuğu ekleme
Aşağıdaki kod örneğinde, sonuç denetleyicisi ekleme, searchBar öğesini gezinme çubuğuna ekleme ve kullanıcının seçimini işleme adımları 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; }
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 nasıl ekleneceği 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, sunum yaparken 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 şekilde ayarlamaz.
Geçici çö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ı kullanarak arama çubuğu ekleme
Aşağıdaki kod örneğinde, gezinme çubuğunun sağ tarafına bir arama çubuğu yerleştirme ve sonuçları bir popover'da gösterme işlemi 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ızda özel bir arama metni kullanıcı arayüzü varsa görünüm denetleyicide sonuçları gösteren tablo görünümünü yönlendirmek için GMSAutocompleteTableDataSource sınıfını kullanabilirsiniz.
Bir görünüm denetleyicisinde veri kaynağı ve UITableView temsilcisi olarak GMSAutocompleteTableDataSource kullanmak için:
- Görünüm denetleyicide
GMSAutocompleteTableDataSourceDelegateveUISearchBarDelegateprotokollerini uygulayın. - Bir
GMSAutocompleteTableDataSourceörneği oluşturun ve görünüm denetleyiciyi temsilci özelliği olarak atayın. - Görünüm denetleyicisinde
GMSAutocompleteTableDataSourcenesnesiniUITableViewörneğinin veri kaynağı ve temsilci özellikleri olarak ayarlayın. - Arama metni girişi için işleyicide
GMSAutocompleteTableDataSourceüzerindesourceTextHasChangedyöntemini çağırın.- Kullanıcının seçimini
didAutocompleteWithPlacetemsilci yönteminde işleyin.
- Kullanıcının seçimini
didAutocompleteWithPlace,didFailAutocompleteWithError,wasCancelledtemsilci yöntemlerinde denetleyiciyi kapatın.
Aşağıdaki kod örneğinde, UISearchBar ayrı olarak eklendiğinde UIViewController öğesinin tablo görünümünü yönlendirmek için GMSAutocompleteTableDataSource sınıfının kullanımı 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
Otomatik tamamlama kullanıcı arayüzü kontrolündeki tüm metinlerin ve arka planların renklerini ayarlayarak widget'ın uygulamanızın görsel görünümüne daha çok uymasını sağlayabilirsiniz. Kullanıcı arayüzü kontrol renklerini ayarlamanın iki yolu vardır:
- Mümkün olduğunda kullanıcı arayüzü kontrollerini genel olarak biçimlendirmek için yerleşik iOS UIAppearance protokolünü kullanarak. Bu ayarlar, kullanıcı arayüzü kontrol öğelerinin tümü için değil, çoğu için geçerlidir.
- UIAppearance protokolü tarafından desteklenmeyen özellikleri ayarlamak için widget sınıflarındaki SDK yöntemlerini kullanarak.
Uygulamanız genellikle UIAppearance protokolü ve SDK yöntemlerinin bir kombinasyonunu kullanır. Aşağıdaki şemada, hangi öğelerin stilinin belirlenebileceği gösterilmektedir:

Aşağıdaki tabloda tüm kullanıcı arayüzü öğeleri listelenmiş ve her birinin nasıl stillendirileceği (UIAppearance protokolü veya SDK yöntemi) belirtilmiştir.
| Kullanıcı arayüzü öğesi | Yöntem | Stil bilgileri |
|---|---|---|
| Gezinme çubuğu tonu (arka plan) | UIAppearance protokolü | UINavigationBar proxy'sinde setBarTintColor çağrısı. |
| Gezinme çubuğu ton rengi (arama çubuğu metin imleci ve İptal düğmesi) | UIAppearance protokolü | UINavigationBar proxy'sinde setTintColor çağrısı. |
| Arama çubuğu metin rengi | UIAppearance protokolü | searchBarTextAttributes içinde NSForegroundColorAttributeName olarak ayarlandı. |
| Arama çubuğu renk tonu | Yok | Arama çubuğu yarı saydamdır ve gezinme çubuğunun gölgeli bir versiyonu olarak gösterilir. |
| Arama çubuğu yer tutucu metin rengi (varsayılan arama metni) | UIAppearance protokolü | placeholderAttributes içinde NSForegroundColorAttributeName olarak ayarlandı. |
| Birincil metin (hata ve mesaj 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ücresi arka planı | SDK yöntemi | tableCellBackgroundColor Hizmetleri İçin Arayın. |
| Tablo hücresi ayırıcı rengi | SDK yöntemi | tableCellSeparatorColor Hizmetleri İçin Arayın. |
| "Yeniden Dene" düğmesi | SDK yöntemi | tintColor Hizmetleri İçin Arayın. |
| Etkinlik göstergesi (ilerleme çarkı) | UIAppearance protokolü | UIActivityIndicatorView proxy'sinde setColor çağrısı. |
| "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 metni temizleme simgeleri | Yok | Stil oluşturmak için varsayılan resimleri istediğiniz renkteki resimlerle değiştirin. |
UIAppearance protokolünü kullanma
Belirli bir kullanıcı arayüzü öğesinin görünüm proxy'sini almak için UIAppearance protokolünü kullanabilirsiniz. Ardından, kullanıcı arayüzü öğesinin rengini ayarlamak için bu proxy'yi kullanabilirsiniz. Bir değişiklik yapıldığında, belirli bir kullanıcı arayüzü öğesinin tüm örnekleri etkilenir. Örneğin, aşağıdaki örnekte UISearchBar içinde yer alan UITextField sınıflarının metin rengi genel olarak yeşil olarak değiştirilir:
[[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 şeyi stillendirmek için kullanmanız gereken tüm proxy komutlarını gösterir. Bu kodu Appdelegate.m dosyasındaki 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ü stil özelliklerini ayarlama
Kullanıcı arayüzü kontrol öğelerinin bir alt kümesi, UIAppearance protokolünden etkilenmeyen özelliklere sahiptir ve bu nedenle doğrudan ayarlanmalıdır. Aşağıdaki kod örneğinde, ön plan ve arka plan renklerinin tanımlanması ve acController adlı bir kullanıcı arayüzü kontrolü örneğine uygulanması gösterilmektedir. Bu kodu ViewController.m dosyasındaki 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'ı tarafından sağlanan 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, tahmin edilen yer adlarının ve/veya adreslerin listesini aşağıdaki yöntemlerden biriyle alabilir:
GMSPlacesClient findAutocompletePredictionsFromQuery: aranıyor
Tahmin edilen yer adlarının ve/veya adreslerin listesini almak için önce GMSPlacesClient'ı örneklendirin, ardından aşağıdaki parametrelerle GMSPlacesClient
findAutocompletePredictionsFromQuery: yöntemini çağırın:
- Kullanıcının yazdığı metni içeren bir
autocompleteQuerydizesi. - Her bir oturumu tanımlamak için kullanılan bir
GMSAutocompleteSessionToken. Uygulamanız her otomatik tamamlama isteği çağrısı için aynı jetonu iletmeli, ardından kullanıcının seçtiği yerle ilgili Yer Ayrıntıları'nı almak üzere bu jetonu bir yer kimliğiyle birlikte sonrakifetchPlacefromPlaceID:çağrısında iletmelidir. GMSAutocompleteFilteriçin:- Sonuçları belirli bir bölgeye göre yönlendirin veya kısıtlayın.
- Sonuçları belirli bir yer türüyle kısıtlar.
- Sonuçları, enlem ve boylam sınırlarıyla belirtilen belirli bir alana yönlendiren bir
GMSPlaceLocationBias/Restriction nesnesi.
- Döndürülen tahminleri işlemek için bir geri çağırma yöntemi.
Aşağıdaki kod örneklerinde 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 = [kGMSPlaceTypeBank] 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, belirtilen geri çağırma yöntemini çağırarak bir GMSAutocompletePrediction nesnesi dizisi iletir.
Her GMSAutocompletePrediction nesnesi aşağıdaki bilgileri içerir:
attributedFullText: Tahminin tam metni,NSAttributedStringbiçiminde. Ö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 vardır:kGMSAutocompleteMatchAttribute. Bu özelliği, kullanıcının sorgusundaki eşleşen metni vurgulamak için kullanabilirsiniz. Örneğin, aşağıda gösterildiği gibi:placeID: Tahmin edilen yerin yer kimliği. Yer kimliği, bir yeri benzersiz şekilde tanımlayan metin tabanlı bir tanımlayıcıdır. Yer kimlikleri hakkında daha fazla bilgi için Yer kimliğine genel bakış başlıklı makaleyi inceleyin.distanceMeters: Belirtilenoriginile hedef arasındaki kuş uçuşu mesafe.originözelliği ayarlanmazsa mesafe değeri döndürülmez.
Aşağıdaki kod örneğinde, enumerateAttribute kullanarak sonucun kullanıcının sorgusundaki metinle eşleşen kısımlarının 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;
Getiriciyi kullanma
Kendi otomatik tamamlama kontrolünüzü sıfırdan oluşturmak istiyorsanız GMSPlacesClient üzerindeki autocompleteQuery yöntemini sarmalayan GMSAutocompleteFetcher yöntemini kullanabilirsiniz. Getirici, istekleri kısıtlar ve yalnızca en son girilen arama metniyle ilgili sonuçları döndürür. Kullanıcı arayüzü öğesi içermez.
GMSAutocompleteFetcher'ı uygulamak için aşağıdaki adımları uygulayın:
GMSAutocompleteFetcherDelegateprotokolünü uygulayın.GMSAutocompleteFetchernesnesi oluşturun.- Kullanıcı yazarken getiricide
sourceTextHasChangedyöntemini çağırın. didAutcompleteWithPredictionsvedidFailAutocompleteWithErrorprotokol yöntemlerini kullanarak tahminleri ve hataları işleyin.
Aşağıdaki kod örneğinde, kullanıcı girişini almak ve yer eşleşmelerini metin görünümünde görüntülemek için getiricinin kullanımı gösterilmektedir. Yer seçme işlevi kaldırıldı. FetcherSampleViewController, FetcherSampleViewController.h içindeki 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> @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ının 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 bir yer seçtiğinde sona erer. Her oturumda birden fazla sorgu ve ardından bir yer seçimi olabilir. Oturum sona erdikten sonra jeton artık geçerli olmaz. 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 denetleyiciyi veya sonuç denetleyiciyi kullandığınızda API bunu otomatik olarak yapar).
iOS için Yerler SDK'sı, her oturumu tanımlamak için GMSAutocompleteSessionToken kullanır. Uygulamanız her yeni oturumun başında yeni bir oturum jetonu iletmeli, ardından kullanıcının seçtiği yerin Yer Ayrıntıları'nı almak için fetchPlacefromPlaceID: yöntemine yapılan sonraki çağrıda aynı jetonu bir yer kimliğiyle birlikte 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ı
GMSPlacesClient findAutocompletePredictionsFromQueryyönteminin kullanımı, katmanlı sorgu sınırlarına tabidir. Kullanım sınırları ile ilgili belgelere bakın.
Uygulamanızda ilişkilendirmeleri gösterme
- Uygulamanız otomatik tamamlama hizmetini programatik olarak kullanıyorsa kullanıcı arayüzünüzde "Google tarafından desteklenmektedir" atfı gösterilmeli veya Google markalı bir harita içinde görünmelidir.
- Uygulamanız otomatik tamamlama kullanıcı arayüzü kontrolünü kullanıyorsa ek bir işlem yapmanız gerekmez (gerekli ilişkilendirme varsayılan olarak gösterilir).
- Kimliğe göre yer aldıktan sonra ek yer bilgilerini alıp gösterirseniz üçüncü taraf atıflarını da göstermeniz gerekir.
Daha fazla bilgi için atıflar ile ilgili belgelere bakın.
Ağ etkinliği göstergesini kontrol etme
Uygulama durum çubuğundaki ağ etkinliği göstergesini kontrol etmek için kullandığınız otomatik tamamlama sınıfına uygun isteğe bağlı temsilci yöntemlerini uygulamanız ve ağ göstergesini kendiniz açıp kapatmanız gerekir.
GMSAutocompleteViewControlleriçindidRequestAutocompletePredictions:vedidUpdateAutocompletePredictions:temsilci yöntemlerini uygulamanız gerekir.GMSAutocompleteResultsViewControlleriçindidRequestAutocompletePredictionsForResultsController:vedidUpdateAutocompletePredictionsForResultsController:temsilci yöntemlerini uygulamanız gerekir.GMSAutocompleteTableDataSourceiçindidRequestAutocompletePredictionsForTableDataSource:vedidUpdateAutocompletePredictionsForTableDataSource:temsilci yöntemlerini uygulamanız gerekir.
Bu yöntemleri uygulayıp [UIApplication
sharedApplication].networkActivityIndicatorVisible ve NO değerlerini sırasıyla YES olarak ayarladığınızda durum çubuğu, otomatik tamamlama kullanıcı arayüzüyle doğru şekilde eşleşir.
Otomatik tamamlama sonuçlarını kısıtlama
Otomatik tamamlama kullanıcı arayüzü kontrolünü, sonuçları belirli bir coğrafi bölgeyle sınırlayacak ve/veya sonuçları bir ya da daha fazla yer türüne ya da belirli bir ülke veya ülkelere göre filtreleyecek şekilde ayarlayabilirsiniz. Sonuçları kısıtlamak için aşağıdakileri yapabilirsiniz:
- Tanımlanan bölgedeki sonuçları tercih etmek (öncelik vermek) için
GMSAutocompleteFilterüzerindelocationBiasdeğerini ayarlayın (tanımlanan bölgenin dışından bazı sonuçlar döndürülmeye devam edebilir).locationRestrictionda ayarlanmışsalocationBiasyoksayılır. Sonuçları yalnızca tanımlanan bölge içinde göstermek (kısıtlamak) için
GMSAutocompleteFilterparametresinilocationRestrictionolarak ayarlayın (yalnızca tanımlanan bölge içindeki sonuçlar döndürülür).- Note: Bu kısıtlama yalnızca tüm rotalara 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üzerindetypesdeğerini ayarlayın (örneğin, kGMSPlaceTypeCollectionAddress değerini belirtmek, widget'ın yalnızca tam adrese sahip sonuçları döndürmesine neden olur).Yalnızca belirtilen en fazla beş ülkedeki sonuçları döndürmek için
GMSAutocompleteFilterüzerindecountriesdeğerini ayarlayın.
Sonuçları belirli bir bölgeye göre önceliklendirme
Tanımlanan bölgedeki sonuçları tercih etmek (öncelik vermek) için GMSAutocompleteFilter üzerinde locationBias değerini 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 kısıtlama
Sonuçları yalnızca tanımlanan bölge içinde göstermek (kısıtlamak) için GMSAutocompleteFilter üzerinde locationRestriction parametresini 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.locationRestriction =
GMSPlaceRectangularLocationOption(northEast, southWest);
Sonuçları ülkeye göre filtreleme
Sonuçları en fazla beş ülke için filtrelemek istiyorsanız GMSAutocompleteFilter üzerinde countries parametresini burada gösterildiği gibi ayarlayın:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.countries = @[ @"au", @"nz" ];
Sonuçları yer türüne veya tür koleksiyonuna göre filtreleme
GMSAutoCompleteFilter öğesinin types özelliğini ayarlayarak sonuçları belirli bir tür veya tür koleksiyonuyla kısıtlayın.
Yer Türleri sayfasındaki Tablo 1, 2 ve 3'te 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 koleksiyonu filtresi belirtmek için:
Yer Türleri sayfasındaki Tablo 1 ve Tablo 2'den en fazla beş type değeri belirtmek için
typesmülkünü kullanın. Tür değerleri,GMSPlaceTypeiçindeki sabitler tarafından tanımlanır.Yer Türleri sayfasındaki Tablo 3'te gösterilen bir tür koleksiyonu belirtmek için
typesmülkünü kullanın. Tür koleksiyonu değerleri,GMSPlaceTypeiçindeki sabitler tarafından tanımlanır.İstekte Tablo 3'ten yalnızca tek bir türe izin verilir. Tablo 3'ten bir değer belirtirseniz Tablo 1 veya Tablo 2'den bir değer belirtemezsiniz. Aksi takdirde 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, yalnızca tam adres içeren sonuçları döndürmek için filtrenin nasıl ayarlanacağı gösterilmektedir:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.types = @[ kGMSPlaceTypeAirport, kGMSPlaceTypeAmusementPark ];
Yer Adı Otomatik Tamamlama (Eski) optimizasyonu
Bu bölümde, Yer Adı Otomatik Tamamlama (Eski) hizmetinden en iyi şekilde yararlanmanıza yardımcı olacak en iyi uygulamalar açıklanmaktadır.
Genel kurallardan bazıları şunlardır:
- Çalışan bir kullanıcı arayüzü geliştirmenin en hızlı yolu, Maps JavaScript API Yer Adı Otomatik Tamamlama (Eski) widget'ını, Android için Yerler SDK'sı Yer Adı Otomatik Tamamlama (Eski) widget'ını veya iOS için Yerler SDK'sı Yer Adı Otomatik Tamamlama (Eski) kullanıcı arayüzü kontrolünü kullanmaktır.
- Yer Adı Otomatik Tamamlama (Eski) veri alanlarını en baştan anlayın.
- Konum tercihi ve konum kısıtlama alanları isteğe bağlıdır ancak otomatik tamamlama performansı üzerinde önemli bir etkiye sahip olabilir.
- API bir hata döndürürse uygulamanızın düzgün bir şekilde çalışmaya devam etmesi için hata işleme özelliğini kullanın.
- Uygulamanızın, seçim yapılmadığında bu durumu ele aldığından ve kullanıcılara devam etme yolu sunduğundan emin olun.
Maliyet optimizasyonuyla ilgili en iyi uygulamalar
Temel maliyet optimizasyonu
Yer Adı Otomatik Tamamlama (Eski) hizmetini kullanma maliyetini optimize etmek için Yer Ayrıntıları (Eski) ve Yer Adı Otomatik Tamamlama (Eski) widget'larında alan maskeleri kullanarak yalnızca ihtiyacınız olan Yer Adı Otomatik Tamamlama (Eski) veri alanlarını döndürün.
Gelişmiş maliyet optimizasyonu
SKU: Otomatik Tamamlama - İstek Başına fiyatlandırmaya erişmek ve Yer Ayrıntıları (Eski) yerine seçilen yerle ilgili Geocoding API sonuçlarını istemek için Yer Adı Otomatik Tamamlama'nın (Eski) programatik uygulamasını kullanabilirsiniz. Geocoding API ile eşlenen istek başına fiyatlandırma, aşağıdaki koşulların her ikisi de karşılandığında oturum başına (oturum tabanlı) fiyatlandırmadan daha uygun maliyetlidir:
- Yalnızca kullanıcının seçtiği yerin enlem ve boylamına veya adresine ihtiyacınız varsa Geocoding API, bu bilgileri Place Details (Legacy) çağrısından daha düşük bir ücret karşılığında sağlar.
- Kullanıcılar ortalama dört veya daha az Yer Adı Otomatik Tamamlama (Eski) tahmini isteği içinde bir otomatik tamamlama tahmini seçerse istek başına fiyatlandırma, oturum başına fiyatlandırmadan daha uygun maliyetli olabilir.
| Uygulamanızın ihtiyaç duyduğu izinler | Kullanıcı bir tahmin seçmeden önceki ortalama Yer Adı Otomatik Tamamlama (Eski) isteği sayısı | Önerilen uygulama |
|---|---|---|
| Adres ve konum dışındaki yer ayrıntıları (ör. yer adı, işletme durumu veya çalışma saatleri) | Herhangi bir sayıda | Yer Ayrıntıları (Eski) ile oturum tabanlı Yer Adı Otomatik Tamamlama (Eski) |
| Yalnızca seçilen tahminin adresi ve enlem/boylamı | Dört veya daha az | Geocoding API ile istek başına Yer Adı Otomatik Tamamlama (Eski) |
| Yalnızca seçilen tahminin adresi ve enlem/boylamı | Dörtten fazla | Yalnızca adres uygulamaları için oturum tabanlı Yer Adı Otomatik Tamamlama (Eski) |
Geocoding API, Place Autocomplete (Eski) kullanımınızın performansına bağlı olarak uygulamanız için Place Details'ten (Eski) daha uygun maliyetli bir seçenek olabilir. Her uygulamanın Yer Adı Otomatik Tamamlama (Eski) verimliliği; kullanıcıların ne girdiğine, uygulamanın nerede kullanıldığına ve performans optimizasyonuyla ilgili en iyi uygulamaların hayata geçirilip geçirilmediğine bağlı olarak değişir.
Tablo için ortalama istek sayısını bulmak üzere, bir kullanıcının uygulamanızda bir Yer Adı Otomatik Tamamlama (Eski) tahminini seçmeden önce ortalama kaç karakter yazdığını analiz edin.
Yer Ayrıntıları (Eski) ile oturuma dayalı Yer Adı Otomatik Tamamlama (Eski)
Oturum tabanlı Yer Adı Otomatik Tamamlama (Eski) özelliğini Yer Ayrıntıları (Eski) ile kullanın.
Uygulamanız yer adı, işletme durumu veya çalışma saatleri gibi Yer Ayrıntıları (Eski) bilgilerini gerektirdiğinden, Yer Adı Otomatik Tamamlama (Eski) uygulamanızda oturum başına bir oturum jetonu (programatik olarak veya JavaScript, Android ya da iOS widget'larına yerleşik olarak) ve istediğiniz yer verisi alanlarına bağlı olarak geçerli Yerler Verisi SKU'ları kullanılmalıdır.1
Widget uygulaması
Oturum yönetimi;
JavaScript,
Android
veya iOS
widget'larına otomatik olarak yerleştirilir. Buna hem Yer Adı Otomatik Tamamlama (Eski) istekleri hem de seçilen tahmindeki Yer Ayrıntıları (Eski) isteği dahildir. Yalnızca ihtiyacınız olan
Yer Adı Otomatik Tamamlama (Eski) veri alanlarını
istediğinizden emin olmak için fields parametresini belirttiğinizden emin olun.
Programatik uygulama
Yer Adı Otomatik Tamamlama (Eski) isteklerinizde oturum jetonu kullanın. Seçilen tahminle ilgili Yer Ayrıntıları (Eski) isteğinde bulunurken aşağıdaki parametreleri ekleyin:
- Yer Adı Otomatik Tamamlama (Eski) yanıtındaki yer kimliği
- Yer Adı Otomatik Tamamlama (Eski) isteğinde kullanılan oturum jetonu
- İhtiyacınız olan Yer Adı Otomatik Tamamlama (Eski) veri alanlarını belirten
fieldsparametresi
Geocoding API ile istek başına Yer Adı Otomatik Tamamlama (Eski)
Yer Adı Otomatik Tamamlama (Eski) özelliğini oturum jetonları olmadan programatik olarak uygulayın ve seçilen yer tahmini için Geocoding API'yi çağırın.
Geocoding API, adresleri ve enlem/boylam koordinatlarını sağlar.
Dört adet
Autocomplete - Per Request
isteği ve seçilen yer tahminiyle ilgili bir Geocoding API çağrısı yapmanın maliyeti, oturum başına Yer Adı Otomatik Tamamlama (Eski) maliyetinden daha düşüktür.1
Kullanıcılarınızın aradıkları tahmini daha az karakterle almalarına yardımcı olmak için performansla ilgili en iyi uygulamalardan yararlanabilirsiniz.
Yalnızca adres içeren uygulamalar için oturuma dayalı Yer Adı Otomatik Tamamlama (Eski)
Oturum tabanlı Yer Adı Otomatik Tamamlama (Eski) özelliğini Yer Ayrıntıları (Eski) ile kullanın.
Kullanıcı bir Yer Adı Otomatik Tamamlama (Eski) tahminini seçmeden önce yapmayı beklediğiniz ortalama istek sayısı, oturum başına fiyatlandırma maliyetini aştığından Yer Adı Otomatik Tamamlama (Eski) uygulamanız hem Yer Adı Otomatik Tamamlama (Eski) istekleri hem de ilişkili Yer Ayrıntıları (Eski) isteği için bir oturum jetonu kullanmalıdır.
oturum başına.
1
Widget uygulaması
Oturum yönetimi;
JavaScript,
Android
veya iOS
widget'larına otomatik olarak yerleştirilir. Buna, seçilen tahmindeki hem Yer Adı Otomatik Tamamlama (Eski) istekleri hem de Yer Ayrıntıları (Eski) isteği dahildir. Yalnızca ihtiyacınız olan alanları istediğinizden emin olmak için fields parametresini belirttiğinizden emin olun.
Programatik uygulama
Yer Adı Otomatik Tamamlama (Eski) isteklerinizde
oturum jetonu
kullanın.
Seçilen tahminle ilgili Yer Ayrıntıları (Eski) isteğinde bulunurken aşağıdaki parametreleri ekleyin:
- Yer Adı Otomatik Tamamlama (Eski) yanıtındaki yer kimliği
- Yer Adı Otomatik Tamamlama (Eski) isteğinde kullanılan oturum jetonu
- Adres ve geometri gibi Temel Veri alanlarını belirten
fieldsparametresi
Yer Adı Otomatik Tamamlama (Eski) isteklerini geciktirmeyi düşünün
Uygulamanızın daha az istek göndermesi için Yer Adı Otomatik Tamamlama (Eski) isteğini kullanıcı ilk üç veya dört karakteri yazana kadar geciktirme gibi stratejiler kullanabilirsiniz. Örneğin, kullanıcı üçüncü karakteri yazdıktan sonra her karakter için Yer Adı Otomatik Tamamlama (Eski) istekleri gönderdiğinizi varsayalım. Kullanıcı yedi karakter yazıp bir tahmin seçerse ve siz de bu tahmin için bir Geocoding API isteği gönderirseniz toplam maliyet, 4 Yer Adı Otomatik Tamamlama (Eski) İstek Başına + Coğrafi Kodlama maliyetine eşit olur.1
İstekleri geciktirmek ortalama programatik istek sayınızı dörtten az yapabiliyorsa Geocoding API ile yüksek performanslı Yer Adı Otomatik Tamamlama (Eski) uygulamasıyla ilgili kılavuzu takip edebilirsiniz. İsteklerin geciktirilmesinin, her yeni tuş vuruşunda tahminleri görmeyi bekleyen kullanıcı tarafından gecikme olarak algılanabileceğini unutmayın.
Kullanıcılarınızın aradıkları tahmini daha az karakterle bulmalarına yardımcı olmak için performansla ilgili en iyi uygulamalardan yararlanabilirsiniz.
-
Maliyetler için Google Haritalar Platformu fiyat listelerine bakın.
Performansla ilgili en iyi uygulamalar
Aşağıdaki yönergelerde, Yer Adı Otomatik Tamamlama (Eski) performansını optimize etme yöntemleri açıklanmaktadır:
- Place Autocomplete (Legacy) uygulamanıza ülke kısıtlamaları, konum ağırlığı ve (programatik uygulamalar için) dil tercihi ekleyin. Widget'lar, dil tercihlerini kullanıcının tarayıcısından veya mobil cihazından aldığı için widget'larda dil tercihine gerek yoktur.
- Yer Adı Otomatik Tamamlama (Eski) özelliğine bir harita eşlik ediyorsa konumu harita görüntü alanına göre yönlendirebilirsiniz.
- Kullanıcı, Yer Adı Otomatik Tamamlama (eski) tahminlerinden birini seçmediğinde (genellikle bu tahminlerden hiçbiri istenen sonuç adresi olmadığı için) daha alakalı sonuçlar elde etmek amacıyla orijinal kullanıcı girişini yeniden kullanabilirsiniz:
- Kullanıcının yalnızca adres bilgisi girmesini bekliyorsanız Geocoding API çağrısında orijinal kullanıcı girişini yeniden kullanın.
- Kullanıcının belirli bir yer için ad veya adresle sorgu girmesini bekliyorsanız Yer Ayrıntıları (Eski) isteği kullanın. Sonuçların yalnızca belirli bir bölgede gösterilmesi bekleniyorsa konum ağırlığı kullanın.
- Kullanıcılar, bir binadaki belirli birimlerin veya dairelerin adresleri gibi alt tesis adreslerini giriyor. Örneğin, Çekçe "Stroupežnického 3191/17, Praha" adresi, Yer Adı Otomatik Tamamlama (Eski) hizmetinde kısmi bir tahmin döndürür.
- Kullanıcılar, New York'ta "23-30 29th St, Queens" veya Hawaii'nin Kauai adasında "47-380 Kamehameha Hwy, Kaneohe" gibi yol segmenti ön ekleri içeren adresler giriyor.
Konuma göre önceliklendirme
location parametresi ve radius parametresi ileterek sonuçları belirli bir alana göre önceliklendirin. Bu, Yer Adı Otomatik Tamamlama'ya (Eski) tanımlanan alan içindeki sonuçları göstermeyi tercih etmesini söyler. Tanımlanan alanın dışındaki sonuçlar gösterilmeye devam edebilir. Sonuçları yalnızca belirtilen bir ülkedeki yerleri gösterecek şekilde filtrelemek için includedRegionCodes parametresini kullanabilirsiniz.
Konum kısıtlama
locationRestriction parametresini ileterek sonuçları belirli bir alanla kısıtlayın.
Ayrıca, strictbounds parametresini ekleyerek sonuçları location ve radius parametresiyle tanımlanan bölgeyle kısıtlayabilirsiniz. Bu, Yer Adı Otomatik Tamamlama'ya (Eski) yalnızca bu bölgedeki sonuçları döndürmesi talimatını verir.
Sorun giderme
Çok çeşitli hatalar meydana gelebilse de uygulamanızın karşılaşabileceği hataların çoğu genellikle yapılandırma hatalarından (örneğin, yanlış API anahtarı kullanılmış veya API anahtarı yanlış yapılandırılmış) ya da kota hatalarından (uygulamanız kotasını aşmış) kaynaklanır. Kotalar hakkında daha fazla bilgi için Kullanım Sınırları bölümüne bakın.
Otomatik tamamlama kontrollerinin kullanımında ortaya çıkan hatalar, çeşitli temsilci protokollerinin didFailAutocompleteWithError() yönteminde döndürülür. Sağlanan NSError nesnesinin code özelliği, GMSPlacesErrorCode numaralandırmasının değerlerinden birine ayarlanır.