iOS için Yerler SDK'sındaki otomatik tamamlama hizmeti, kullanıcı arama sorgularına yanıt olarak yer tahminlerini döndürür. Kullanıcı yazarken otomatik tamamlama hizmeti işletmeler, adresler, artı kodları ve önemli yerler gibi yerler için öneriler sunar.
Otomatik tamamlama özelliğini uygulamanıza aşağıdaki şekillerde ekleyebilirsiniz:
- Geliştirme zamanından tasarruf etmek ve tutarlı bir kullanıcı deneyimi sağlamak için otomatik tamamlama kullanıcı arayüzü denetimi 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 girdikçe kontrol, seçim yapılacak tahmini yerlerin listesini sunar. Kullanıcı bir seçim yaptığında, uygulamanızın seçili yer hakkındaki ayrıntıları almak için kullanabileceği bir GMSPlace
örneği döndürülür.
Otomatik tamamlama kullanıcı arayüzü kontrolünü uygulamanıza aşağıdaki şekillerde ekleyebilirsiniz:
Tam ekran kontrolü ekleme
Kalıcı bir bağlam istediğinizde tam ekran kontrolünü kullanın. Bu seçenekte, kullanıcı seçimi yapana kadar otomatik tamamlama kullanıcı arayüzü geçici olarak uygulamanızın kullanıcı arayüzünün yerini alır. Bu işlev GMSAutocompleteViewController
sınıfı tarafından sağlanır. Kullanıcı bir yer seçtiğinde uygulamanız geri çağırma alır.
Uygulamanıza tam ekran denetimi eklemek için:
- Otomatik tamamlama kullanıcı arayüzü kontrolünü (örneğin, bir
UIButton
üzerinde dokunma işleyicisi) başlatmak için ana uygulamanızda bir kullanıcı arayüzü öğesi oluşturun. - Üst görünüm denetleyicisinde
GMSAutocompleteViewControllerDelegate
protokolünü uygulayın. - Bir
GMSAutocompleteViewController
örneği oluşturun ve üst görünüm denetleyicisini yetki verilen mülk olarak atayın. - Döndürülecek yer veri türlerini tanımlamak için bir
GMSPlaceField
oluşturun. - Sorguyu belirli bir yer türüyle sınırlandırmak için
GMSAutocompleteFilter
ekleyin. [self presentViewController...]
kullanarakGMSAutocompleteViewController
öğesini gösterin.didAutocompleteWithPlace
seçimi yönteminde kullanıcının seçimini yönetin.didAutocompleteWithPlace
,didFailAutocompleteWithError
vewasCancelled
yetki yöntemlerinde kumandayı kapatın.
Aşağıdaki örnekte, bir düğmeye dokunan kullanıcıya yanıt olarak GMSAutocompleteViewController
'i başlatmanın olası bir yolu gösterilmektedir.
Swift
import UIKit import GooglePlaces class ViewController: UIViewController { override func viewDidLoad() { makeButton() } // Present the Autocomplete view controller when the button is pressed. @objc func autocompleteClicked(_ sender: UIButton) { let autocompleteController = GMSAutocompleteViewController() autocompleteController.delegate = self // Specify the place data types to return. let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) | UInt(GMSPlaceField.placeID.rawValue))! autocompleteController.placeFields = fields // Specify a filter. let filter = GMSAutocompleteFilter() filter.types = [.address] autocompleteController.autocompleteFilter = filter // Display the autocomplete view controller. present(autocompleteController, animated: true, completion: nil) } // Add a button to the view. func makeButton() { let btnLaunchAc = UIButton(frame: CGRect(x: 5, y: 150, width: 300, height: 35)) btnLaunchAc.backgroundColor = .blue btnLaunchAc.setTitle("Launch autocomplete", for: .normal) btnLaunchAc.addTarget(self, action: #selector(autocompleteClicked), for: .touchUpInside) self.view.addSubview(btnLaunchAc) } } extension ViewController: GMSAutocompleteViewControllerDelegate { // Handle the user's selection. func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { print("Place name: \(place.name)") print("Place ID: \(place.placeID)") print("Place attributions: \(place.attributions)") dismiss(animated: true, completion: nil) } func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) { // TODO: handle the error. print("Error: ", error.localizedDescription) } // User canceled the operation. func wasCancelled(_ viewController: GMSAutocompleteViewController) { dismiss(animated: true, completion: nil) } // Turn the network activity indicator on and off again. func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = true } func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = false } }
Objective-C
#import "ViewController.h" @import GooglePlaces; @interface ViewController () <GMSAutocompleteViewControllerDelegate> @end @implementation ViewController { GMSAutocompleteFilter *_filter; } - (void)viewDidLoad { [super viewDidLoad]; [self makeButton]; } // Present the autocomplete view controller when the button is pressed. - (void)autocompleteClicked { GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init]; acController.delegate = self; // Specify the place data types to return. GMSPlaceField fields = (GMSPlaceFieldName | GMSPlaceFieldPlaceID); acController.placeFields = fields; // Specify a filter. _filter = [[GMSAutocompleteFilter alloc] init]; _filter.types = @[ kGMSPlaceTypeBank ]; acController.autocompleteFilter = _filter; // Display the autocomplete view controller. [self presentViewController:acController animated:YES completion:nil]; } // Add a button to the view. - (void)makeButton{ UIButton *btnLaunchAc = [UIButton buttonWithType:UIButtonTypeCustom]; [btnLaunchAc addTarget:self action:NSSelectorFromString(@"autocompleteClicked") forControlEvents:UIControlEventTouchUpInside]; [btnLaunchAc setTitle:@"Launch autocomplete" forState:UIControlStateNormal]; btnLaunchAc.frame = CGRectMake(5.0, 150.0, 300.0, 35.0); btnLaunchAc.backgroundColor = [UIColor blueColor]; [self.view addSubview:btnLaunchAc]; } // Handle the user's selection. - (void)viewController:(GMSAutocompleteViewController *)viewController didAutocompleteWithPlace:(GMSPlace *)place { [self dismissViewControllerAnimated:YES completion:nil]; // Do something with the selected place. NSLog(@"Place name %@", place.name); NSLog(@"Place ID %@", place.placeID); NSLog(@"Place attributions %@", place.attributions.string); } - (void)viewController:(GMSAutocompleteViewController *)viewController didFailAutocompleteWithError:(NSError *)error { [self dismissViewControllerAnimated:YES completion:nil]; // TODO: handle the error. NSLog(@"Error: %@", [error description]); } // User canceled the operation. - (void)wasCancelled:(GMSAutocompleteViewController *)viewController { [self dismissViewControllerAnimated:YES completion:nil]; } // Turn the network activity indicator on and off again. - (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } - (void)didUpdateAutocompletePredictions:(GMSAutocompleteViewController *)viewController { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; } @end
Sonuç denetleyicisi ekleme
Metin giriş kullanıcı arayüzü üzerinde daha fazla kontrol sahibi olmak istiyorsanız sonuç denetleyicisi kullanın. Sonuç denetleyicisi, giriş kullanıcı arayüzü odağına göre sonuç listesinin görünürlüğünü dinamik şekilde açar.
Uygulamanıza sonuç denetleyicisi eklemek için:
GMSAutocompleteResultsViewController
oluşturun.- Üst görünüm denetleyicide
GMSAutocompleteResultsViewControllerDelegate
protokolünü uygulayın ve üst görünüm denetleyiciyi yetki verme özelliği olarak atayın. UISearchController
nesnesi oluşturun veGMSAutocompleteResultsViewController
'i sonuç denetleyicisi bağımsız değişkeni olarak iletin.GMSAutocompleteResultsViewController
öğesiniUISearchController
içinsearchResultsUpdater
özelliği olarak ayarlayın.UISearchController
içinsearchBar
özelliğini uygulamanızın kullanıcı arayüzüne ekleyin.didAutocompleteWithPlace
seçimi yönteminde kullanıcının seçimini yönetin.
UISearchController
uygulamasının arama çubuğunu uygulamanızın kullanıcı arayüzüne yerleştirmenin birkaç yolu vardır:
- Gezinme çubuğuna arama çubuğu ekleyin
- Görünümün üst kısmına arama çubuğu ekleme
- Pop-up sonuçlarını kullanarak arama çubuğu ekleme
Gezinme çubuğuna arama çubuğu ekleme
Aşağıdaki kod örneğinde sonuç denetleyicisi eklenme, gezinme çubuğuna searchBar
ekleme ve kullanıcının seçimini işleme gösterilmiştir:
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ği, searchBar
'nin bir görünümün üst kısmına eklenmesini göstermektedir.
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 sırasında gezinme çubuğunu gizler (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ği, gezinme çubuğunun sağ tarafına arama çubuğu yerleştirmeyi ve sonuçları bir pop-up'ta görüntülemeyi göstermektedir.
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ğını kullanma
Uygulamanızın özel bir arama metni kullanıcı arayüzü varsa sonuçları görüntüleme denetleyicisinde gösteren tablo görünümünü yönlendirmek için GMSAutocompleteTableDataSource
sınıfını kullanabilirsiniz.
Bir görünüm denetleyicide veri kaynağı ve UITableView
yetkisini GMSAutocompleteTableDataSource
olarak kullanmak için:
- Görünüm denetleyicide
GMSAutocompleteTableDataSourceDelegate
veUISearchBarDelegate
protokollerini uygulayın. - Bir
GMSAutocompleteTableDataSource
örneği oluşturun ve görünüm denetleyiciyi yetki verilen mülk olarak atayın. - Görünüm denetleyicide
UITableView
örneğinin veri kaynağı ve yetki verme özellikleri olarakGMSAutocompleteTableDataSource
değerini ayarlayın. - Arama metni girişi için işleyicide
GMSAutocompleteTableDataSource
üzerindensourceTextHasChanged
numarasını arayın. didAutocompleteWithPlace
yetki verme yönteminde kullanıcının seçimini yönetin.didAutocompleteWithPlace
,didFailAutocompleteWithError
vewasCancelled
yetki verilen kumandada kumandayı kapatın.
Aşağıdaki kod örneği, UISearchBar
ayrı olarak eklendiğinde UIViewController
öğesinin tablo görünümünü artırmak için GMSAutocompleteTableDataSource
sınıfının kullanılmasını göstermektedir.
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 yakından eşleşmesini sağlamak için tüm metin ve arka planların renklerini otomatik tamamlama kullanıcı arayüzü kontrolünde 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 şekillendirmek için yerel iOS UIGörünüm protokolü kullanılarak. Bu ayarlar, kullanıcı arayüzü kontrol öğelerinin hepsi için değil, birçoğu için geçerlidir.
- UIView protokolü tarafından desteklenmeyen özellikleri ayarlamak için widget sınıflarındaki SDK yöntemlerini kullanarak.
Uygulamanız genellikle UIView protokolü ile SDK yöntemlerinin bir kombinasyonunu kullanır. Aşağıdaki şemada, hangi öğelerin stilinin ayarlanabileceği gösterilmiştir:
Aşağıdaki tabloda tüm kullanıcı arayüzü öğeleri listelenmiştir ve her birinde nasıl stil oluşturulacağı (kullanıcı arayüzü protokolü veya SDK yöntemi) gösterilmektedir.
Kullanıcı Arayüzü Öğesi | Yöntem | Moda bilgileri |
---|---|---|
Gezinme çubuğu tonu (arka plan) | Arayüz Görünümü protokolü | UINavigationBar proxy'sinde setBarTintColor numarasını arayın. |
Gezinme çubuğu ton rengi (arama çubuğu metin düzeltme işareti ve İptal düğmesi) | Arayüz Görünümü protokolü | UINavigationBar proxy'sinde setTintColor numarasını arayın. |
Arama Çubuğu metin rengi | Arayüz Görünümü protokolü | searchBarTextAttributes uygulamasında NSForegroundColorAttributeName değerini ayarlayın. |
Arama çubuğu tonu rengi | Yok | Arama çubuğu yarı saydamdır ve Gezinme Çubuğunun gölgeli bir sürümü olarak gösterilir. |
Arama çubuğu yer tutucu metin rengi (varsayılan arama metni) | Arayüz Görünümü protokolü | placeholderAttributes uygulamasında NSForegroundColorAttributeName değerini ayarlayın. |
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. |
"Tekrar Dene" düğmesi | SDK yöntemi | tintColor Hizmetleri İçin Arayın. |
Etkinlik göstergesi (ilerleme döner simgesi) | Arayüz Görünümü protokolü | UIActivityIndicatorView proxy'sinde setColor numarasını arayın. |
"Powered by Google" logosu, Sad bulut resmi | Yok | Beyaz veya gri sürüm, arka plan kontrastına göre otomatik olarak seçilir. |
Arama çubuğu metin alanında büyüteç ve boş metin simgeleri | Yok | Stil vermek için varsayılan resimleri istediğiniz renkteki resimlerle değiştirin. |
UIView protokolünü kullanma
Belirli bir kullanıcı arayüzü öğesine ait görünüm proxy'sini almak için kullanıcı arayüzü protokolünü kullanabilirsiniz. Daha sonra bu arayüzü kullanarak kullanıcı arayüzü öğesinin rengini ayarlayabilirsiniz. Değişiklik yapıldığında, belirli bir kullanıcı arayüzü öğesinin tüm örnekleri etkilenir. Örneğin, aşağıdaki örnek global olarak UITextField
sınıflarının metin rengini, bir UISearchBar
içerdiğinde yeşil olarak 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 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 biçimlendirmek için kullanmanız gereken tüm proxy komutlarını gösterir. Bu kodu Appdelegate.m'deki 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, Kullanıcı Arayüzü Protokolü'nden etkilenmeyen özellikler içerdiğinden doğrudan ayarlanmalıdır. Aşağıdaki kod örneği, ön plan ve arka plan renklerini tanımlayıp bunları acController
adlı bir kullanıcı arayüzü kontrol örneğine uygulamayı göstermektedir. Bu kodu ViewController.m içindeki 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;
Programatik olarak yer tahminleri alma
Otomatik tamamlama widget'ının sağladığı kullanıcı arayüzüne alternatif olarak bir özel arama kullanıcı arayüzü oluşturabilirsiniz. Bunu yapmak için uygulamanızın yer tahminlerini programatik olarak alması gerekir. Uygulamanız aşağıdaki yöntemlerden birini kullanarak tahmin edilen yer adlarının ve/veya adreslerin listesini alabilir:
GMSPlacesClient findAutocompletePredictionsFromQuery:
aranıyor
Tahmin edilen yer adlarının ve/veya adreslerin listesini almak için önce GMSPlacesClient yöntemini çalıştırın, ardından aşağıdaki parametrelerle GMSPlacesClient findAutocompletePredictionsFromQuery:
yöntemini çağırın:
- Kullanıcı tarafından yazılan metni içeren bir
autocompleteQuery
dizesi. - Her bir oturumu tanımlamak için kullanılan
GMSAutocompleteSessionToken
. Uygulamanız, kullanıcı tarafından seçilen yerin Yer Ayrıntılarını almak için her otomatik tamamlama isteği çağrısında aynı jetonu, ardından birfetchPlacefromPlaceID:
çağrısında Yer Kimliği ile birlikte iletmelidir. - Aşağıdaki işlemleri yapmak için bir
GMSAutocompleteFilter
:- Sonuçları taraflı hale getirin veya belirli bir bölgeyle sınırlayın.
- Sonuçları belirli bir yer türüyle sınırlandırın.
- Enlem ve boylam sınırlarıyla belirtilen belirli bir alana göre ağırlık veren
GMSPlaceLocationBias
/Kısıtlama nesnesi.
- Döndürülen tahminleri işlemek için geri çağırma yöntemi.
Aşağıdaki kod örnekleri findAutocompletePredictionsFromQuery:
çağrısını göstermektedir.
Swift
/** * Create a new session token. Be sure to use the same token for calling * findAutocompletePredictions, as well as the subsequent place details request. * This ensures that the user's query and selection are billed as a single session. */ let token = GMSAutocompleteSessionToken.init() // Create a type filter. let filter = GMSAutocompleteFilter() filter.types = [.bank] filter.locationBias = GMSPlaceRectangularLocationOption( northEastBounds, southWestBounds); placesClient?.findAutocompletePredictions(fromQuery: "cheesebu", filter: filter, sessionToken: token, callback: { (results, error) in if let error = error { print("Autocomplete error: \(error)") return } if let results = results { for result in results { print("Result \(result.attributedFullText) with placeID \(result.placeID)") } } })
Objective-C
/** * Create a new session token. Be sure to use the same token for calling * findAutocompletePredictionsFromQuery:, as well as the subsequent place details request. * This ensures that the user's query and selection are billed as a single session. */ GMSAutocompleteSessionToken *token = [[GMSAutocompleteSessionToken alloc] init]; // Create a type filter. GMSAutocompleteFilter *_filter = [[GMSAutocompleteFilter alloc] init]; _filter.types = @[ kGMSPlaceTypeBank ]; [_placesClient findAutocompletePredictionsFromQuery:@"cheesebu" filter:_filter sessionToken:token callback:^(NSArray<GMSAutocompletePrediction *> * _Nullable results, NSError * _Nullable error) { if (error != nil) { NSLog(@"An error occurred %@", [error localizedDescription]); return; } if (results != nil) { for (GMSAutocompletePrediction *result in results) { NSLog(@"Result %@ with PlaceID %@", result.attributedFullText, result.placeID); } } }];
API, bir dizi GMSAutocompletePrediction
nesnesiyle geçirerek belirtilen geri çağırma yöntemini çağırır.
Her GMSAutocompletePrediction
nesnesi aşağıdaki bilgileri içerir:
attributedFullText
– Tahmini tam metin olarakNSAttributedString
biçiminde sunulur. Örneğin, "Sidney Opera Binası, Sidney, New South Waales, Avustralya". Kullanıcı girişiyle eşleşen her metin aralığının bir özelliği (kGMSAutocompleteMatchAttribute
) vardır. Bu özelliği, kullanıcının sorgusuyla eşleşen metni (örneğin, aşağıda gösterildiği gibi) vurgulamak için kullanabilirsiniz.placeID
– Tahmin edilen yerin yer kimliği. Yer kimliği, bir yeri benzersiz şekilde tanımlayan metin tanımlayıcısıdır. Yer kimlikleri hakkında daha fazla bilgi için Yer kimliğine genel bakış konusuna bakın.distanceMeters
– Belirtilenorigin
ile varış noktası arasındaki düz çizgi mesafesi.origin
özelliği ayarlanmazsa mesafe değeri döndürülmez.
Aşağıdaki kod örneği, kullanıcının sorgusunda sonuçla eşleşen kısmın enumerateAttribute
kullanılarak kalın metinle nasıl vurgulanacağını gösterir:
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;
Getirme aracını kullanma
Kendi otomatik tamamlama kontrolünüzü sıfırdan oluşturmak istiyorsanız autocompleteQuery
yöntemini GMSPlacesClient
üzerinde sarmalayan GMSAutocompleteFetcher
aracını kullanabilirsiniz.
Getirme, istekleri kısıtlayıp yalnızca en son girilen arama metniyle ilgili sonuçları döndürür. Kullanıcı arayüzü öğesi sağlamaz.
GMSAutocompleteFetcher
aracını uygulamak için aşağıdaki adımları uygulayın:
GMSAutocompleteFetcherDelegate
protokolünü uygulayın.- Bir
GMSAutocompleteFetcher
nesnesi oluşturun. - Kullanıcı yazarken alıcıda
sourceTextHasChanged
adlı kişiyi arayın. - Tahminleri ve hataları yönetmek için
didAutcompleteWithPredictions
vedidFailAutocompleteWithError
protokol yöntemlerini kullanın.
Aşağıdaki kod örneği, metin girişini kullanarak kullanıcı girdisini almak ve yer eşleşmelerini göstermek için getirme aracını kullanmayı göstermektedir. Yer seçme işlevi artık kullanılamamaktadır. FetcherSampleViewController
, FetcherSampleViewController.h'deki UIViewController
kaynağından türetilir.
Swift
import UIKit import GooglePlaces class ViewController: UIViewController { var textField: UITextField? var resultText: UITextView? var fetcher: GMSAutocompleteFetcher? override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white edgesForExtendedLayout = [] // Set bounds to inner-west Sydney Australia. let neBoundsCorner = CLLocationCoordinate2D(latitude: -33.843366, longitude: 151.134002) let swBoundsCorner = CLLocationCoordinate2D(latitude: -33.875725, longitude: 151.200349) // Set up the autocomplete filter. let filter = GMSAutocompleteFilter() filter.locationRestriction = GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner) // Create a new session token. let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init() // Create the fetcher. fetcher = GMSAutocompleteFetcher(bounds: nil, filter: filter) fetcher?.delegate = self fetcher?.provide(token) textField = UITextField(frame: CGRect(x: 5.0, y: 10.0, width: view.bounds.size.width - 5.0, height: 64.0)) textField?.autoresizingMask = .flexibleWidth textField?.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged) let placeholder = NSAttributedString(string: "Type a query...") textField?.attributedPlaceholder = placeholder resultText = UITextView(frame: CGRect(x: 0, y: 65.0, width: view.bounds.size.width, height: view.bounds.size.height - 65.0)) resultText?.backgroundColor = UIColor(white: 0.95, alpha: 1.0) resultText?.text = "No Results" resultText?.isEditable = false self.view.addSubview(textField!) self.view.addSubview(resultText!) } @objc func textFieldDidChange(textField: UITextField) { fetcher?.sourceTextHasChanged(textField.text!) } } extension ViewController: GMSAutocompleteFetcherDelegate { func didAutocomplete(with predictions: [GMSAutocompletePrediction]) { let resultsStr = NSMutableString() for prediction in predictions { resultsStr.appendFormat("\n Primary text: %@\n", prediction.attributedPrimaryText) resultsStr.appendFormat("Place ID: %@\n", prediction.placeID) } resultText?.text = resultsStr as String } func didFailAutocompleteWithError(_ error: Error) { resultText?.text = error.localizedDescription } }
Objective-C
#import "FetcherSampleViewController.h" #import <GooglePlaces/GooglePlaces.h> #import <GoogleMapsBase/GoogleMapsBase.h> @interface FetcherSampleViewController () <GMSAutocompleteFetcherDelegate> @end @implementation FetcherSampleViewController { UITextField *_textField; UITextView *_resultText; GMSAutocompleteFetcher* _fetcher; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.edgesForExtendedLayout = UIRectEdgeNone; // Set bounds to inner-west Sydney Australia. CLLocationCoordinate2D neBoundsCorner = CLLocationCoordinate2DMake(-33.843366, 151.134002); CLLocationCoordinate2D swBoundsCorner = CLLocationCoordinate2DMake(-33.875725, 151.200349); GMSAutocompleteFilter *autocompleteFilter = [[GMSAutocompleteFilter alloc] init]; autocompleteFilter.locationRestriction = GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner); // Create the fetcher. _fetcher = [[GMSAutocompleteFetcher alloc] initWithBounds:nil filter:filter]; _fetcher.delegate = self; // Set up the UITextField and UITextView. _textField = [[UITextField alloc] initWithFrame:CGRectMake(5.0f, 0, self.view.bounds.size.width - 5.0f, 44.0f)]; _textField.autoresizingMask = UIViewAutoresizingFlexibleWidth; [_textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; _resultText =[[UITextView alloc] initWithFrame:CGRectMake(0, 45.0f, self.view.bounds.size.width, self.view.bounds.size.height - 45.0f)]; _resultText.backgroundColor = [UIColor colorWithWhite:0.95f alpha:1.0f]; _resultText.text = @"No Results"; _resultText.editable = NO; [self.view addSubview:_textField]; [self.view addSubview:_resultText]; } - (void)textFieldDidChange:(UITextField *)textField { NSLog(@"%@", textField.text); [_fetcher sourceTextHasChanged:textField.text]; } #pragma mark - GMSAutocompleteFetcherDelegate - (void)didAutocompleteWithPredictions:(NSArray *)predictions { NSMutableString *resultsStr = [NSMutableString string]; for (GMSAutocompletePrediction *prediction in predictions) { [resultsStr appendFormat:@"%@\n", [prediction.attributedPrimaryText string]]; } _resultText.text = resultsStr; } - (void)didFailAutocompleteWithError:(NSError *)error { _resultText.text = [NSString stringWithFormat:@"%@", error.localizedDescription]; } @end
Oturum jetonları
Oturum jetonları, bir kullanıcı otomatik tamamlama sorgusunun sorgu ve seçim aşamalarını faturalandırma amacıyla ayrı bir oturumda gruplandırır. Oturum, kullanıcı bir sorgu yazmaya başladığında başlar ve bir yer seçildiğinde sona erer. Her oturumda birden fazla sorgu ve ardından tek bir yer seçimi olabilir. Oturum sona erdiğinde jeton artık geçerli olmaz. 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ç denetleyicisini kullandığınızda API bu işlemi otomatik olarak gerçekleştirir).
iOS için Yerler SDK'sı, her oturumu tanımlamak için GMSAutocompleteSessionToken
kullanır. Uygulamanız her yeni oturuma başladığında yeni bir oturum jetonu iletmeli, ardından kullanıcı tarafından seçilen yerin Yer Ayrıntılarını almak için sonraki çağrıda fetchPlacefromPlaceID:
çağrısıyla aynı jetonu iletmelidir.
Oturum jetonları hakkında daha fazla bilgi edinin.
Yeni bir oturum jetonu oluşturmak için aşağıdaki kodu kullanın:
let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init()
Kullanım sınırları
GMSPlacesClient findAutocompletePredictionsFromQuery
yönteminin kullanımı, katmanlı sorgu sınırlarına tabidir. Kullanım sınırları ile ilgili belgelere bakın.
İlişkilendirmeleri uygulamanızda gösterme
- Uygulamanız otomatik olarak otomatik tamamlama hizmetini kullanıyorsa kullanıcı arayüzünüz "Google tarafından desteklenmektedir" ilişkilendirmesi görüntülemeli 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şleme gerek yoktur (varsayılan olarak gerekli ilişkilendirme görüntülenir).
- Yere göre kimlik aldıktan sonra ek yer bilgileri alıp gösterirseniz, üçüncü taraf atıflarını da göstermeniz gerekir.
Daha fazla ayrıntı için ilişkilendirmelere ilişkin belgeleri inceleyin.
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ı için uygun isteğe bağlı yetki verme yöntemlerini uygulamanız ve ağ göstergesini kendiniz etkinleştirip devre dışı bırakmanız gerekir.
GMSAutocompleteViewController
içindidRequestAutocompletePredictions:
vedidUpdateAutocompletePredictions:
yetki verme yöntemlerini uygulamanız gerekir.GMSAutocompleteResultsViewController
içindidRequestAutocompletePredictionsForResultsController:
vedidUpdateAutocompletePredictionsForResultsController:
yetki verme yöntemlerini uygulamanız gerekir.GMSAutocompleteTableDataSource
içindidRequestAutocompletePredictionsForTableDataSource:
vedidUpdateAutocompletePredictionsForTableDataSource:
yetki verme yöntemlerini uygulamanız gerekir.
Bu yöntemleri uygulayıp [UIApplication sharedApplication].networkActivityIndicatorVisible
özelliğini sırasıyla YES
ve NO
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ıtla
Otomatik tamamlama kullanıcı arayüzü kontrolünü, sonuçları belirli bir coğrafi bölgeyle sınırlayacak şekilde ayarlayabilir ve/veya sonuçları bir ya da daha fazla yer türüne veya belirli bir ülke ya da ülkeye göre filtreleyebilirsiniz. Sonuçları kısıtlamak için aşağıdakileri yapabilirsiniz:
- Tanımlanan bölgedeki sonuçları tercih etmek (ön yargılı) için
GMSAutocompleteFilter
üzerindelocationBias
değerini ayarlayın (tanımlanmış bölgenin dışındaki sonuçlar yine de döndürülebilir).locationRestriction
de ayarlanırsalocationBias
yoksayılır. Tanımlanan bölgedeki sonuçları göstermek (kısıtlamak) için
GMSAutocompleteFilter
üzerindelocationRestriction
değerini ayarlayın (yalnızca tanımlanan bölgedeki sonuçlar döndürülür).- Not: Bu kısıtlama yalnızca rotaların tümüne uygulanır. Konum kısıtlamasıyla çakışan bir rotaya dayalı, dikdörtgen sınırların dışında kalan yapay sonuçlar döndürülebilir.
Yalnızca belirli bir yer türüne uygun sonuçları döndürmek için
GMSAutocompleteFilter
üzerindetype
özelliğini ayarlayın (örneğin, TypeFiltre.ADDRESS belirtmek widget'ın yalnızca tam adresli sonuçları döndürmesine neden olur).En fazla beş ülke için yalnızca sonuç döndürmek isterseniz
GMSAutocompleteFilter
üzerindecountries
ayarlayın.
Belirli bir bölgeye ilişkin sonuçları ön yargılama
Tanımlanan bölge içinde sonuçları tercih etmek (ön yargılı) için GMSAutocompleteFilter
üzerinde locationBias
öğesini aşağıda gösterildiği gibi ayarlayın:
northEast = CLLocationCoordinate2DMake(39.0, -95.0);
southWest = CLLocationCoordinate2DMake(37.5, -100.0);
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.locationBias = GMSPlaceRectangularLocationOption(northEast, southWest);
Sonuçları belirli bir bölgeyle kısıtla
Sonuçları yalnızca tanımlanan bölgede göstermek (kısıtlamak) için aşağıda gösterildiği gibi GMSAutocompleteFilter
üzerinde locationRestriction
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 filtrele
En fazla beş ülke için sonuçları filtrelemek üzere aşağıda gösterildiği gibi GMSAutocompleteFilter
üzerinde countries
özelliğini ayarlayın:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.countries = @[ @"au", @"nz" ];
Sonuçları yer türüne veya tür koleksiyonuna göre filtreleyin
GMSAutoCompleteFilter
özelliğinin types
özelliğini ayarlayarak sonuçları belirli bir tür veya tür koleksiyonunda olacak şekilde kısıtlayabilirsiniz.
Yer Türleri konusunda 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'nde gösterilen 1. Tablo ve 2. Tablo'da en fazla beş tür değeri belirtmek için
types
özelliğini kullanın. Tür değerleri,GMSPlaceType
'teki sabitlerle tanımlanır.Yer Türleri bölümünde gösterilen 3. Tablo'daki tür koleksiyonu belirtmek için
types
özelliğini kullanın. Tür koleksiyonu değerleri,GMSPlaceType
içindeki sabitlerle tanımlanır.İstekte Tablo 3'ten yalnızca bir türe izin verilir. Tablo 3'ten bir değer belirtirseniz 1. Tablo'dan veya 2. Tablo'dan bir değer belirtemezsiniz. Aksi takdirde bir hata oluşur.
Örneğin, yalnızca belirli bir yer türüne uygun sonuçları döndürmek için GMSAutocompleteFilter
üzerinde types
özelliğini ayarlayın. Aşağıdaki örnekte filtrenin yalnızca tam adresli sonuçları döndürecek şekilde ayarlanması gösterilmektedir:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.types = @[ kGMSPlaceTypeAirport, kGMSPlaceTypeAmusementPark ];
Yer otomatik tamamlama optimizasyonu
Bu bölümde, Otomatik Yer Tamamlama hizmetinden en iyi şekilde yararlanmanıza yardımcı olacak en iyi uygulamalar açıklanmaktadır.
Bazı genel yönergeler şunlardır:
- Çalışan bir kullanıcı arayüzü geliştirmenin en hızlı yolu, Haritalar JavaScript API'si Otomatik tamamlama widget'ını, Android için Yerler SDK'sını Otomatik tamamlama widget'ı veya iOS için Yerler SDK'sını kullanmaktır Otomatik tamamlama kullanıcı arayüzü kontrolü
- Temel Otomatik Tamamlama veri alanları'nı başından itibaren anlayın.
- Konuma ağırlık verme ve konum kısıtlama alanları isteğe bağlıdır ancak otomatik tamamlama performansını önemli ölçüde etkileyebilir.
- API hata döndürürse uygulamanızın düzgün bir şekilde bozulmasını sağlamak için hata işleme yöntemini kullanın.
- Uygulamanızın seçenek olmadığında işlendiğinden ve kullanıcılara devam etmek için bir yol sunduğundan emin olun.
Maliyet optimizasyonu en iyi uygulamaları
Temel maliyet optimizasyonu
Yer Otomatik Tamamlama hizmetini kullanmanın maliyetini optimize etmek için yalnızca ihtiyacınız olan yer verisi alanlarını döndürmek amacıyla Yer Ayrıntıları ve Otomatik Yer Tamamlama widget'larındaki alan maskelerini kullanın.
Gelişmiş maliyet optimizasyonu
İstek Başına Fiyatlandırma özelliğine erişmek için Yer Otomatik Tamamlama özelliğinin programatik olarak uygulanmasını düşünebilirsiniz. Ayrıca, Yer Ayrıntıları yerine seçilen yer hakkında Geocoded API sonuçları isteğinde bulunabilirsiniz. Aşağıdaki koşulların her ikisi de sağlanıyorsa istek başına fiyatlandırma, Geocode API ile eşlenmiş oturum başına fiyatlandırmaya (oturuma dayalı) fiyatlandırmadan daha maliyetlidir:
- Kullanıcının seçtiği yerin enlem/boylamı veya adresine ihtiyacınız varsa Geo kodlama API'si, bu bilgileri Yer Ayrıntıları çağrısından daha düşük bir fiyatla sunar.
- Kullanıcılar ortalama dört veya daha az otomatik tamamlama tahmin isteği içinde bir otomatik tamamlama tahmini seçerse İstek Başına fiyatlandırma, Oturum Başına fiyatlandırmadan daha uygun maliyetli olabilir.
Uygulamanız, seçilen tahminin adresi ve enlem/boylam bilgileri dışında bir bilgi gerektiriyor mu?
Evet, daha fazla ayrıntı gerekiyor
Yer ayrıntılarıyla oturuma dayalı Yer Otomatik Tamamlama özelliğini kullanın.
Uygulamanız yer adı, işletme durumu veya çalışma saatleri gibi yer ayrıntılarını gerektirdiğinden, Yer Otomatik Tamamlama uygulamanızda, istediğiniz yer veri alanına bağlı olarak, toplamda 0,017 ABD doları oturum başına maliyete sahip bir oturum jetonu (programatik olarak veya JavaScript, Android ya da iOS widget'ları kullanılarak ve geçerli Yerler Veri SKU'ları kullanmanız gerekir}.
Widget uygulama
Oturum yönetimi otomatik olarak JavaScript, Android veya iOS widget'larına yerleştirilir. Buna, seçilen tahmindeki hem Yer Otomatik Tamamlama istekleri hem de Yer Ayrıntıları istekleri dahildir. Yalnızca ihtiyacınız olan yer verisi alanlarını istediğinizden emin olmak için fields
parametresini belirttiğinizden emin olun.
Programatik uygulama
Yer Otomatik Tamamlama isteklerinizle birlikte bir oturum jetonu kullanın. Seçilen tahmin hakkında Yer Ayrıntıları isterken aşağıdaki parametreleri ekleyin:
- Otomatik Yer Tamamlama yanıtındaki yer kimliği
- Otomatik Yer Tamamlama isteğinde kullanılan oturum jetonu
- İhtiyacınız olan yer verisi alanlarını belirten
fields
parametresi
Hayır, yalnızca adres ve konum bilgisi gerekiyor
Coğrafi kodlama API'si, Yer Otomatik Tamamlama kullanımınızın performansına bağlı olarak, Yer Ayrıntıları'ndan daha uygun maliyetli bir seçenek olabilir. Her uygulamanın otomatik tamamlama verimliliği, kullanıcıların girdiği işlemlere, uygulamanın kullanıldığı yere ve performans optimizasyonu için en iyi uygulamaların uygulanıp uygulanmadığına bağlı olarak değişiklik gösterir.
Aşağıdaki soruyu yanıtlamak için, uygulamanızda bir Yer Otomatik Tamamlama tahmini seçmeden önce kullanıcının ortalama kaç karakter girdiğini analiz edin.
Kullanıcılarınız otomatik olarak ortalama dört veya daha az istekte Yer Otomatik Tamamlama tahminini mi seçiyor?
Evet
Yer Otomatik Tamamlama'yı oturum jetonları olmadan programatik olarak uygulayın ve seçilen yer tahmininde Geocoded API'yi çağırın.
Geocode API, istek başına 0,005 ABD doları karşılığında adresler ve enlem/boylam koordinatları yayınlar. Dört Yer Otomatik Tamamlama - İstek Başına isteğinde bulunmanın maliyeti 0,01132 ABD dolarıdır. Bu nedenle, dört isteğin toplam maliyetiyle birlikte seçilen yer tahmini hakkında bir Geocoded API çağrısının fiyatı 0,01632 ABD doları olur. Bu durumda, oturum başına 0,017 ABD doları tutarındaki otomatik tamamlama fiyatından düşük olur.1
Kullanıcılarınızın aradıkları tahmini daha az sayıda karakterle elde etmelerine yardımcı olmak için performansla ilgili en iyi uygulamalardan yararlanabilirsiniz.
Hayır
Yer ayrıntılarıyla oturuma dayalı Yer Otomatik Tamamlama özelliğini kullanın.
Bir kullanıcı, Yer Otomatik Tamamlama tahminini seçmeden önce gerçekleştirmeyi beklediğiniz ortalama istek sayısı, Oturum Başına fiyatlandırma maliyetini aştığından, Yer Otomatik Tamamlama uygulamanızda, hem Otomatik Yer Tamamlama istekleri hem de ilişkili Yer Ayrıntıları istekleri için, oturum başına toplam 0,017 ABD doları maliyet karşılığında bir oturum jetonu kullanılmalıdır.1
Widget uygulama
Oturum yönetimi otomatik olarak JavaScript, Android veya iOS widget'larına yerleştirilir. Buna, seçilen tahmindeki hem Yer Otomatik Tamamlama istekleri hem de Yer Ayrıntıları istekleri dahildir. Yalnızca Temel Veri alanları istediğinizden emin olmak için fields
parametresini belirttiğinizden emin olun.
Programatik uygulama
Yer Otomatik Tamamlama isteklerinizle birlikte bir oturum jetonu kullanın. Seçilen tahmin hakkında Yer Ayrıntıları isterken aşağıdaki parametreleri ekleyin:
- Otomatik Yer Tamamlama yanıtındaki yer kimliği
- Otomatik Yer Tamamlama isteğinde kullanılan oturum jetonu
- Adres ve geometri gibi Temel Veriler alanlarını belirten
fields
parametresi
Otomatik Yer Tamamlama isteklerini ertelemeyi düşünün
Kullanıcı ilk üç veya dört karakteri girene kadar Otomatik Otomatik Tamamlama isteklerini erteleme gibi stratejiler uygulayarak uygulamanızın daha az istek göndermesini sağlayabilirsiniz. Örneğin, kullanıcı üçüncü karakteri yazdıktan sonra her karakter için Yer Otomatik Tamamlama isteklerinde bulunursa, kullanıcı yedi karakter yazıp bir coğrafi kodlama API isteğinde bulunduğunuz bir tahmin seçerse toplam maliyet 0,01632 ABD doları olur (4 * 0,00283 İstek Başına Otomatik Tamamlama + 0,005 ABD Doları Coğrafi Kodlama).1
Geciken istekler, ortalama programatik isteğinizin dört adetten daha az olmasına yol açıyorsa coğrafi kodlama API'si ile yüksek performanslı yer otomatik tamamlama yönergelerini uygulayabilirsiniz. Gecikmeli istekler, her yeni tuş vuruşuyla ilgili tahminleri görmeyi bekleyecek kullanıcı tarafından gecikme olarak algılanabilir.
Kullanıcılarınızın aradıkları tahmini daha az karakterle alabilmelerine yardımcı olmak için performansla ilgili en iyi uygulamalardan yararlanabilirsiniz.
-
Burada listelenen maliyetler ABD doları cinsindendir. Tam fiyatlandırma bilgileri için lütfen Google Haritalar Platformu Faturalandırması sayfasına bakın.
Performansla ilgili en iyi uygulamalar
Aşağıdaki yönergelerde, Yer Otomatik Tamamlama performansını optimize etmenin yolları açıklanmaktadır:
- Yer Otomatik Tamamlama uygulamanıza ülke kısıtlamaları, konum ön yargısı ve (programatik uygulamalar için) dil tercihi ekleyin. Widget'larda dil tercihi gerekmez. Çünkü widget'lar, kullanıcının tarayıcısından veya mobil cihazından dil tercihlerini seçer.
- Yer Otomatik Tamamlama'ya bir harita eşlik ediyorsa, harita görüntü alanına göre konuma ağırlık verebilirsiniz.
- Bir kullanıcının Otomatik tamamlama tahminlerinden birini seçmediği durumlarda, genellikle bu tahminlerden hiçbiri istenen sonuç adresi olmadığı için daha alakalı sonuçlar almaya çalışmak için orijinal kullanıcı girişini yeniden kullanabilirsiniz:
- Kullanıcının yalnızca adres bilgilerini girmesini bekliyorsanız Geocode API çağrısında orijinal kullanıcı girişini yeniden kullanın.
- Kullanıcının ada veya adrese göre belirli bir yer için sorgu girmesini bekliyorsanız Yer Bulma isteği kullanın. Yalnızca belirli bir bölgede sonuçlar bekleniyorsa konum ağırlıklandırma kullanın.
- Çek Cumhuriyeti, Estonya ve Litvanya gibi alt kuruluş adreslerini otomatik tamamlama özelliğinin eksik olduğu ülkelerde alt kuruluş adresleri giren kullanıcılar. Örneğin, Çek adresi "Stroupežnického 3191/17, Praha", Yer Otomatik Tamamlama'da kısmi bir tahmin verir.
- Kullanıcılar, New York City'de "23-30 29th St, Queens" gibi yol segmenti ön ekleri veya Hawai'i'deki Kauai adasında yer alan "47-380 Kamehameha Hwy, Kaneohe" gibi adresler giriyor.
Sorun giderme
Uygulamanızın çeşitli hataları oluşsa da genellikle hatalı yapılandırmalar (örneğin, yanlış API anahtarının kullanılması veya API anahtarının yanlış yapılandırılmış olması) ya da kota hataları (uygulamanız kotasını aştı) ortaya çıkar. 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 oluşan hatalar, çeşitli yetki verme protokollerinin didFailAutocompleteWithError()
yönteminde döndürülür. Sağlanan NSError
nesnesinin code
özelliği GMSPlacesErrorCode
sıralama değerinden birine ayarlanır.