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 Kodlar ve önemli yerler gibi yerler için öneriler döndürür.
Uygulamanıza otomatik tamamlama özelliğini 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çilebilecek tahmini yerlerin listesini gösterir. Kullanıcı bir seçim yaptığında GMSPlace örneği döndürülür. Uygulamanız daha sonra 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ü geçici olarak değiştirdiği modal 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 geri çağırma alır.
Uygulamanıza tam ekran kontrolü eklemek için:
- Ana uygulamanızda otomatik tamamlama kullanıcı arayüzü kontrolünü başlatmak için 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öğesinin bir örneğini oluşturun ve üst görünüm denetleyicisini temsilci özelliği olarak atayın.- Döndürülecek yer veri 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
didAutocompleteWithPlacedelegate yönteminde işleyin. didAutocompleteWithPlace,didFailAutocompleteWithErrorvewasCancelledtemsilci yöntemlerinde denetleyiciyi kapatın.
Aşağıdaki örnekte, kullanıcının bir düğmeye dokunması üzerine GMSAutocompleteViewController'ı 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 = [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 açıp kapatır.
Uygulamanıza sonuç denetleyicisi eklemek için:
GMSAutocompleteResultsViewControlleroluşturun.- Üst görünüm denetleyicisinde
GMSAutocompleteResultsViewControllerDelegateprotokolünü uygulayın ve üst görünüm denetleyicisini temsilci özelliği olarak atayın.
- Üst 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öğesini uygulamanızın kullanıcı arayüzüne ekleyin.- Kullanıcının seçimini
didAutocompleteWithPlacedelegate 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
- Fareyle üzerine gelindiğinde gösterilen sonuçları kullanarak arama çubuğu ekleme
Gezinme çubuğuna arama çubuğu ekleme
Aşağıdaki kod örneğinde, sonuç denetleyicisi ekleme, gezinme çubuğuna searchBar ekleme ve kullanıcının seçimini işleme 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 ayar 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-over 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ştirme ve sonuçları bir popover'da görüntüleme 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 sonuçları görünüm denetleyicisinde görüntüleyen tablo görünümünü yönlendirmek için GMSAutocompleteTableDataSource sınıfını kullanabilirsiniz.
Bir görünüm denetleyicisinde
GMSAutocompleteTableDataSource
veri kaynağı ve
UITableView temsilcisi olarak kullanmak için:
- Görünüm denetleyicisinde
GMSAutocompleteTableDataSourceDelegateveUISearchBarDelegateprotokollerini uygulayın. GMSAutocompleteTableDataSourceörneği oluşturun ve görünüm denetleyicisini temsilci özelliği olarak atayın.GMSAutocompleteTableDataSourceöğesini veri kaynağı olarak ayarlayın ve görünüm denetleyicisindekiUITableViewörneğinin özelliklerini temsilciye atayın.- Arama metni girişi için işleyicide
sourceTextHasChangedişleviniGMSAutocompleteTableDataSourceüzerinde çağırın.- Kullanıcının seçimini
didAutocompleteWithPlacedelegate yönteminde işleyin.
- Kullanıcının seçimini
didAutocompleteWithPlace,didFailAutocompleteWithError,wasCancelledyetki verilmiş kullanıcı yöntemlerinde denetleyiciyi kapatın.
Aşağıdaki kod örneğinde, UISearchBar ayrı olarak eklendiğinde UIViewController öğesinin tablo görünümünü oluşturmak için GMSAutocompleteTableDataSource sınıfının nasıl kullanılacağı 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üyle daha iyi eşleşmesi için otomatik tamamlama kullanıcı arayüzündeki 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ü 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 kullanma.
Genellikle uygulamanızda UIAppearance protokolü ve SDK yöntemlerinin bir kombinasyonu kullanılır. Aşağıdaki diyagramda, hangi öğelerin stilinin değiştirilebileceği gösterilmektedir:

Aşağıdaki tabloda tüm kullanıcı arayüzü öğeleri listelenmekte ve her birinin nasıl stil verilmesi gerektiği (UIAppearance protokolü veya SDK yöntemi) belirtilmektedir.
| Kullanıcı arayüzü öğesi | Yöntem | Stil bilgileri |
|---|---|---|
| Gezinme çubuğu rengi (arka plan) | UIAppearance protokolü | UINavigationBar proxy'sinden setBarTintColor numaralı telefonu arayın. |
| Gezinme çubuğu ton rengi (arama çubuğu metin imleci ve İptal düğmesi) | UIAppearance protokolü | UINavigationBar proxy'sinden setTintColor numaralı telefonu arayın. |
| Arama çubuğu metin rengi | UIAppearance protokolü | searchBarTextAttributes içinde NSForegroundColorAttributeName olarak ayarlanır. |
| Arama çubuğu ton rengi | 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 ayarlanır. |
| 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ü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'sinden setColor numaralı telefonu arayın. |
| "Powered by Google" 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 temizle simgeleri | Yok | Stil vermek 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
protocol'ü kullanabilirsiniz. Ardından, bu proxy'yi kullanarak kullanıcı arayüzü öğesinin rengini ayarlayabilirsiniz. Bir değişiklik yapıldığında, belirli bir kullanıcı arayüzü öğesinin tüm örnekleri etkilenir. Örneğin, aşağıdaki örnek, UITextField sınıflarının metin rengini UISearchBar içinde yer aldıklarında genel olarak yeşile değiştirir:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}];
Renk değerlerini tanımlama hakkında daha fazla bilgi için UIColor Class Reference başlıklı makaleyi inceleyin.
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 stili ö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 programlı bir şekilde 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'ı örnekleyin,
ardından GMSPlacesClient
findAutocompletePredictionsFromQuery:
yöntemini aşağıdaki parametrelerle çağırın:
- Kullanıcının yazdığı metni içeren bir
autocompleteQuerydizesi. - Her bir oturumu tanımlamak için kullanılan A
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 üzerefetchPlacefromPlaceID:için yapılan sonraki çağrıda bu jetonu bir yer kimliğiyle birlikte iletmelidir. - A
GMSAutocompleteFilterto:- 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ıtlayın.
- Sonuçları enlem ve boylam sınırlarıyla belirtilen belirli bir alana yönlendiren
GMSPlaceLocationBias/Restriction nesnesi.
- Döndürülen tahminleri işlemek için kullanılan 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 GMSAutocompletePrediction nesnelerinden oluşan bir dizi 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şine uyan her metin aralığındakGMSAutocompleteMatchAttributeözelliği bulunur. 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ği genel bakışı başlıklı makaleyi inceleyin.distanceMeters: Belirtilenoriginkonumundan hedefe olan 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 metninin sonuçlarını döndürür. Kullanıcı arayüzü öğesi sağlamaz.
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 bir metin görünümünde göstermek için getiricinin nasıl kullanılacağı gösterilmektedir. Yer seçme işlevi kaldırıldı. FetcherSampleViewController, FetcherSampleViewController.h dosyasındaki UIViewController öğesinden türetilmiştir.
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ının bir sorgu yazmaya başlamasıyla başlar ve bir yer seçmesiyle sona erer. Her oturumda birden fazla sorgu ve ardından bir yer seçimi olabilir. Bir oturum sona erdiğinde jeton geçerliliğini kaybeder. Uygulamanız her oturum için yeni bir jeton oluşturmalıdır. Tüm programatik otomatik tamamlama oturumları için oturum jetonlarını 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 katkıların gösterilmesi
- 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ızda otomatik tamamlama kullanıcı arayüzü kontrolü kullanılıyorsa ek bir işlem yapılmasına gerek yoktur (gerekli ilişkilendirme varsayılan olarak gösterilir).
- Kimliğe göre yer alma işleminden 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 ile ilgili dokümanlara bakın.
Ağ etkinliği göstergesini kontrol etme
Uygulamaların durum çubuğundaki ağ etkinliği göstergesini kontrol etmek için kullandığınız otomatik tamamlama sınıfı için 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 veya daha fazla yer türüne ya da belirli bir ülkeye 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 (yanlılık) için
locationBiasseçeneğiniGMSAutocompleteFilterolarak ayarlayın (tanımlanan bölgenin dışındaki bazı sonuçlar yine de döndürülebilir).locationRestrictionda ayarlanmışsalocationBiasyoksayılır. Sonuçları yalnızca tanımlanan bölge içinde göstermek (kısıtlamak) için
GMSAutocompleteFilterüzerindelocationRestrictiondeğerini ayarlayın (yalnızca tanımlanan bölge içindeki sonuçlar döndürülür).- Not: Bu kısıtlama yalnızca rotaların tamamı için geçerlidir. Dikdörtgen sınırlar dışında bulunan sentetik sonuçlar, konum kısıtlamasıyla çakışan bir rota temel alınarak döndürülebilir.
Yalnızca belirli bir yer türüne uyan 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ş ülke içindeki sonuçları döndürmek için
GMSAutocompleteFilterüzerindecountriesdeğerini ayarlayın.
Sonuçları belirli bir bölgeye göre önyargılı hale getirme
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 sınırlama
Sonuçları yalnızca tanımlanan bölge içinde gösterecek (kısıtlayacak) şekilde ayarlamak için GMSAutocompleteFilter üzerinde locationRestriction seçeneğini aşağıdaki 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ş ülkede filtrelemek için GMSAutocompleteFilter üzerinde countries değerini ayarlayın. Örnek:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.countries = @[ @"au", @"nz" ];
Sonuçları yer türüne veya koleksiyon türüne göre filtreleme
GMSAutoCompleteFilter öğesinin types özelliğini ayarlayarak sonuçları belirli bir tür veya tür koleksiyonuyla sınırlayın.
Yer Türleri bölümündeki 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:
typesmülkünü kullanarak Yer Türleri sayfasında gösterilen Tablo 1 ve Tablo 2'deki tür değerlerinden en fazla beşini belirtin. Tür değerleri,GMSPlaceTypeiçindeki sabitlerle tanımlanır.Yer Türleri sayfasındaki Tablo 3'te gösterilen tür koleksiyonunu belirtmek için
typesmülkünü kullanın. Tür koleksiyonu değerleri,GMSPlaceTypeiçindeki sabitler tarafından tanımlanır.İsteklerde yalnızca Tablo 3'teki 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 types değerini GMSAutocompleteFilter olarak ayarlayın. Aşağıdaki örnekte, filtrenin yalnızca tam adres içeren sonuçları döndürecek şekilde ayarlanması 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.
- Başlangıçtan itibaren temel Yer Adı Otomatik Tamamlama (Eski) veri alanlarını anlayın.
- Konum tercihi ve konum kısıtlama alanları isteğe bağlıdır ancak otomatik tamamlama performansı üzerinde önemli bir etkisi olabilir.
- API hata döndürürse uygulamanızın sorunsuz bir şekilde çalışmaya devam etmesini sağlamak için hata işlemeyi kullanın.
- Uygulamanızın seçim yapılmadığı durumları yönettiğinden ve kullanıcılara devam etme yolu sunduğundan emin olun.
Maliyet optimizasyonu ile ilgili en iyi uygulamalar
Temel maliyet optimizasyonu
Yer Adı Otomatik Tamamlama (Eski) hizmetini kullanmanın maliyetini optimize etmek için Yer Ayrıntıları (Eski) ve Yer Adı Otomatik Tamamlama (Eski) widget'larında yalnızca ihtiyacınız olan Yer Adı Otomatik Tamamlama (Eski) veri alanlarını döndürmek üzere alan maskeleri kullanın.
Gelişmiş maliyet optimizasyonu
Yer Adı Otomatik Tamamlama (Eski) hizmetine programatik olarak erişmek için SKU: Autocomplete - Per Request pricing hizmetini kullanın ve Yer Ayrıntıları (Eski) yerine seçilen yerle ilgili Geocoding API sonuçları isteyin. Aşağıdaki koşulların her ikisi de karşılanıyorsa Geocoding API'si ile birlikte kullanılan istek başına fiyatlandırma, oturum başına (oturum tabanlı) fiyatlandırmaya kıyasla daha uygun maliyetlidir:
- Kullanıcının seçtiği yerin yalnızca enlemi, boylamı veya adresi gerekiyorsa Geocoding API bu bilgileri Place Details (Legacy) çağrısından daha düşük bir maliyetle sağlar.
- Kullanıcılar, ortalama dört veya daha az Yer Adı Otomatik Tamamlama (Eski) tahmin isteği içinde bir otomatik tamamlama tahmini seçerse istek başına fiyatlandırma, oturum başına fiyatlandırmaya göre daha uygun maliyetli olabilir.
Uygulamanız, seçilen tahminin adresi ve enlem/boylamı dışında başka bilgi gerektiriyor mu?
Evet, daha fazla ayrıntı gerekiyor
Yer Ayrıntıları (Eski) ile oturuma dayalı Yer Adı Otomatik Tamamlama (Eski) özelliğini kullanın.
Uygulamanızda yer adı, işletme durumu veya çalışma saatleri gibi Yer Ayrıntıları (Eski) gerekli olduğundan Yer Otomatik Tamamlama (Eski) özelliğinin uygulanmasında oturum jetonu (programatik olarak veya JavaScript, Android ya da iOS widget'larına yerleştirilmiş) oturum başına ve talep ettiğiniz yer verileri alanlarına bağlı olarak geçerli Yer Verileri SKU'ları kullanılmalıdır.1
Widget uygulama
Oturum yönetimi, otomatik olarak
JavaScript,
Android,
veya iOS
widget'larına yerleştirilmiştir. Buna, seçilen tahminde hem Yer Adı Otomatik Tamamlama (Eski) istekleri hem de 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
Hayır, yalnızca adres ve konum gerekiyor
Yer Adı Otomatik Tamamlama (Eski) kullanımınızın performansına bağlı olarak, Geocoding API, uygulamanız için Yer Ayrıntıları (Eski) API'sinden daha uygun maliyetli bir seçenek olabilir. Her uygulamanın Yer Adı Otomatik Tamamlama (Legacy) verimliliği, kullanıcıların ne girdiğine, uygulamanın nerede kullanıldığına ve performans optimizasyonuyla ilgili en iyi uygulamaların uygulanıp uygulanmadığına bağlı olarak değişir.
Aşağıdaki soruyu yanıtlamak için bir kullanıcının uygulamanızda Yer Adı Otomatik Tamamlama (Eski) tahminini seçmeden önce ortalama kaç karakter yazdığını analiz edin.
Kullanıcılarınız, ortalama olarak dört veya daha az istekte bir Yer Adı Otomatik Tamamlama (Eski) tahmini seçiyor mu?
Evet
Oturum jetonları olmadan Yer Adı Otomatik Tamamlama (Eski) 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.
Seçilen yer tahminiyle ilgili dört Autocomplete - Per Request (İstek Başına Otomatik Tamamlama) isteği ve bir Geocoding API (Coğrafi Kodlama API'si) çağrısı yapmak, oturum başına oturum başına Yer 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.
Hayır
Yer Ayrıntıları (Eski) ile oturuma dayalı Yer Adı Otomatik Tamamlama (Eski) özelliğini kullanın.
Bir kullanıcı, Yer Adı Otomatik Tamamlama (Eski) tahmini seçmeden önce yapmayı beklediğiniz ortalama istek sayısı, oturum başına fiyatlandırmanın 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 oturum başına bir oturum jetonu kullanmalıdır.
1
Widget uygulama
Oturum yönetimi,
JavaScript,
Android,
veya iOS
widget'larına otomatik olarak yerleştirilmiştir. 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
fieldsparametresini belirten Temel Veri alanları
Yer Adı Otomatik Tamamlama (Eski) isteklerini geciktirmeyi düşünün
Uygulamanızın daha az istekte bulunması için Yer Adı Otomatik Tamamlama (Eski) isteğini kullanıcı ilk üç veya dört karakteri yazana kadar geciktirmek gibi stratejiler kullanabilirsiniz. Örneğin, kullanıcı üçüncü karakteri yazdıktan sonra her karakter için Yer Adı Otomatik Tamamlama (Eski) isteğinde bulunmak, kullanıcının yedi karakter yazıp bir Geocoding API isteğinde bulunduğunuz bir tahmini seçmesi durumunda toplam maliyetin 4 Yer Adı Otomatik Tamamlama (Eski) İsteği + Coğrafi Kodlama olacağı anlamına gelir.1
İstekleri geciktirerek ortalama programatik istek sayınızı dörtten aşağıya düşürebilirseniz Coğrafi Kodlama API'si ile yüksek performanslı Yer Adı Otomatik Tamamlama (Eski) uygulamasıyla ilgili yönergeleri uygulayabilirsiniz. İsteklerin geciktirilmesinin, her yeni tuş vuruşunda tahmin 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 fiyatlandırma listeleri başlıklı makaleyi inceleyin.
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 ülkeye özgü 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ının, genellikle bu tahminlerden hiçbiri istenen sonuç adresi olmadığı için Yer Adı Otomatik Tamamlama (Eski) tahminlerinden birini seçmediği durumlarda, daha alakalı sonuçlar elde etmek için orijinal kullanıcı girişini yeniden kullanabilirsiniz:
- Kullanıcının yalnızca adres bilgisi 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 yerle ilgili sorguları ad veya adresle 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ıklandırmayı kullanın.
- Kullanıcılar, bir bina içindeki belirli birimlerin veya dairelerin adresleri gibi alt tesis adreslerini girerken. Örneğin, "Stroupežnického 3191/17, Praha" Çekçe adresi, Yer Adı Otomatik Tamamlama (Eski) özelliğinde kısmi bir tahmin oluşturur.
- New York City'de "23-30 29th St, Queens" veya Hawaii'deki Kauai adasında "47-380 Kamehameha Hwy, Kaneohe" gibi yol segmenti önekleri içeren adresleri giren kullanıcılar.
Konum önyargısı
location parametresi ve radius parametresi ileterek sonuçları belirli bir alana göre yönlendirin. Bu, Yer Adı Otomatik Tamamlama (Eski) özelliğine, tanımlanan alan içindeki sonuçları göstermeyi tercih etmesi talimatını verir. Tanımlanan alanın dışındaki sonuçlar yine de gösterilebilir. Sonuçları filtreleyerek yalnızca belirli bir ülke içindeki yerleri göstermek için includedRegionCodes parametresini kullanabilirsiniz.
Konum kısıtlama
locationRestriction parametresini ileterek sonuçları belirli bir alanla kısıtlayın.
Ayrıca, location ve radius parametreleriyle tanımlanan bölgeyle sonuçları kısıtlamak için strictbounds parametresini ekleyebilirsiniz. Bu, Yer Adı Otomatik Tamamlama (Eski) özelliğine yalnızca bu bölgedeki sonuçları döndürmesi talimatını verir.
Sorun giderme
Çok çeşitli hatalar oluşabilse de uygulamanızın karşılaşacağı hataların çoğu genellikle yapılandırma hatalarından (ör. yanlış API anahtarı kullanıldı veya API anahtarı yanlış yapılandırıldı) ya da kota hatalarından (uygulamanız kotasını aştı) 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.