iOS için Yerler SDK'sındaki otomatik tamamlama hizmeti, kullanıcı arama sorgularına yanıt olarak tahminler döndürür. Kullanıcı yazarken otomatik tamamlama hizmeti; işletmeler, adresler, artı kodları ve önemli yerler gibi yerler için öneriler döndürür.
Otomatik tamamlamayı uygulamanıza aşağıdaki şekillerde ekleyebilirsiniz:
- Geliştirme zamanından 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 terimleri girdiğinde kontrol, aralarından seçim yapabileceğiniz tahmin edilen yerlerin bir listesini gösterir. Kullanıcı seçim yaptığında, uygulamanızın seçilen yerle ilgili ayrıntıları almak için kullanabileceği bir GMSPlace
örneği döndürülür.
Otomatik tamamlama kullanıcı arayüzü kontrolünü aşağıdaki yöntemlerle uygulamanıza ekleyebilirsiniz:
Tam ekran denetimi ekleme
Kalıcı bir bağlam istediğinizde tam ekran kontrolünü kullanın. Burada otomatik tamamlama kullanıcı arayüzü, kullanıcı seçimini yapana kadar uygulamanızın kullanıcı arayüzünün geçici olarak yerini alır. Bu işlev GMSAutocompleteViewController
sınıfı tarafından sağlanır. Kullanıcı bir yer seçtiğinde uygulamanız geri arama alır.
Uygulamanıza tam ekran kontrolü eklemek için:
- Otomatik tamamlama kullanıcı arayüzü kontrolünü başlatmak için ana uygulamanızda bir kullanıcı arayüzü öğesi oluşturun (örneğin,
UIButton
cihazındaki bir dokunma işleyici). - Ü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 verme özelliği olarak atayın. - Döndürülecek yer verisi türlerini tanımlamak için bir
GMSPlaceField
oluşturun. - Sorguyu belirli bir yer türüyle sınırlamak için
GMSAutocompleteFilter
ekleyin. [self presentViewController...]
kullanarakGMSAutocompleteViewController
'ı sunun.didAutocompleteWithPlace
yetki verme yönteminde kullanıcı seçimini işleyin.didAutocompleteWithPlace
,didFailAutocompleteWithError
vewasCancelled
yetki verme yöntemlerinde kumandayı kapatabilirsiniz.
Aşağıdaki örnekte, kullanıcının bir düğmeye dokunmasına yanıt olarak GMSAutocompleteViewController
'i başlatmanın olası bir yolu gösterilmektedir.
Swift
import UIKit import GooglePlaces class ViewController: UIViewController { override func viewDidLoad() { makeButton() } // Present the Autocomplete view controller when the button is pressed. @objc func autocompleteClicked(_ sender: UIButton) { let autocompleteController = GMSAutocompleteViewController() autocompleteController.delegate = self // Specify the place data types to return. let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) | UInt(GMSPlaceField.placeID.rawValue))! autocompleteController.placeFields = fields // Specify a filter. let filter = GMSAutocompleteFilter() filter.types = [.address] autocompleteController.autocompleteFilter = filter // Display the autocomplete view controller. present(autocompleteController, animated: true, completion: nil) } // Add a button to the view. func makeButton() { let btnLaunchAc = UIButton(frame: CGRect(x: 5, y: 150, width: 300, height: 35)) btnLaunchAc.backgroundColor = .blue btnLaunchAc.setTitle("Launch autocomplete", for: .normal) btnLaunchAc.addTarget(self, action: #selector(autocompleteClicked), for: .touchUpInside) self.view.addSubview(btnLaunchAc) } } extension ViewController: GMSAutocompleteViewControllerDelegate { // Handle the user's selection. func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { print("Place name: \(place.name)") print("Place ID: \(place.placeID)") print("Place attributions: \(place.attributions)") dismiss(animated: true, completion: nil) } func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) { // TODO: handle the error. print("Error: ", error.localizedDescription) } // User canceled the operation. func wasCancelled(_ viewController: GMSAutocompleteViewController) { dismiss(animated: true, completion: nil) } // Turn the network activity indicator on and off again. func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = true } func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = false } }
Objective-C
#import "ViewController.h" @import GooglePlaces; @interface ViewController () <GMSAutocompleteViewControllerDelegate> @end @implementation ViewController { GMSAutocompleteFilter *_filter; } - (void)viewDidLoad { [super viewDidLoad]; [self makeButton]; } // Present the autocomplete view controller when the button is pressed. - (void)autocompleteClicked { GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init]; acController.delegate = self; // Specify the place data types to return. GMSPlaceField fields = (GMSPlaceFieldName | GMSPlaceFieldPlaceID); acController.placeFields = fields; // Specify a filter. _filter = [[GMSAutocompleteFilter alloc] init]; _filter.types = @[ kGMSPlaceTypeBank ]; acController.autocompleteFilter = _filter; // Display the autocomplete view controller. [self presentViewController:acController animated:YES completion:nil]; } // Add a button to the view. - (void)makeButton{ UIButton *btnLaunchAc = [UIButton buttonWithType:UIButtonTypeCustom]; [btnLaunchAc addTarget:self action:@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ç denetleyici ekleme
Metin girişi kullanıcı arayüzü üzerinde daha fazla kontrol sahibi olmak istediğinizde sonuç denetleyicisi kullanın. Sonuç denetleyici, sonuç listesinin görünürlüğünü giriş kullanıcı arayüzü odağına göre dinamik olarak değiştirir.
Uygulamanıza sonuç denetleyici eklemek için:
- Bir
GMSAutocompleteResultsViewController
oluşturun. - Üst görünüm denetleyicisinde
GMSAutocompleteResultsViewControllerDelegate
protokolünü uygulayın ve üst görünüm denetleyicisini yetki verilmiş mülk olarak atayın. - Sonuç denetleyici bağımsız değişkeni olarak
GMSAutocompleteResultsViewController
değerini ileten birUISearchController
nesnesi oluşturun. GMSAutocompleteResultsViewController
değerini,UISearchController
öğesininsearchResultsUpdater
özelliği olarak ayarlayın.UISearchController
içinsearchBar
bilgisini uygulamanızın kullanıcı arayüzüne ekleyin.didAutocompleteWithPlace
yetki verme yönteminde kullanıcı seçimini işleyin.
UISearchController
arama çubuğunu, uygulamanızın kullanıcı arayüzüne yerleştirmenin birkaç yolu vardır:
- Gezinme çubuğuna bir arama çubuğu ekleme
- 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 ekleme, gezinme çubuğuna searchBar
ekleme ve kullanıcı seçimi gösterilmektedir:
Swift
class ViewController: UIViewController { var resultsViewController: GMSAutocompleteResultsViewController? var searchController: UISearchController? var resultView: UITextView? override func viewDidLoad() { super.viewDidLoad() resultsViewController = GMSAutocompleteResultsViewController() resultsViewController?.delegate = self searchController = UISearchController(searchResultsController: resultsViewController) searchController?.searchResultsUpdater = resultsViewController // Put the search bar in the navigation bar. searchController?.searchBar.sizeToFit() navigationItem.titleView = searchController?.searchBar // When UISearchController presents the results view, present it in // this view controller, not one further up the chain. definesPresentationContext = true // Prevent the navigation bar from being hidden when searching. searchController?.hidesNavigationBarDuringPresentation = false } } // Handle the user's selection. extension ViewController: GMSAutocompleteResultsViewControllerDelegate { func resultsController(_ resultsController: GMSAutocompleteResultsViewController, didAutocompleteWith place: GMSPlace) { searchController?.isActive = false // Do something with the selected place. print("Place name: \(place.name)") print("Place address: \(place.formattedAddress)") print("Place attributions: \(place.attributions)") } func resultsController(_ resultsController: GMSAutocompleteResultsViewController, didFailAutocompleteWithError error: Error){ // TODO: handle the error. print("Error: ", error.localizedDescription) } // Turn the network activity indicator on and off again. func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = true } func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = false } }
Objective-C
- (void)viewDidLoad { _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init]; _resultsViewController.delegate = self; _searchController = [[UISearchController alloc] initWithSearchResultsController:_resultsViewController]; _searchController.searchResultsUpdater = _resultsViewController; // Put the search bar in the navigation bar. [_searchController.searchBar sizeToFit]; self.navigationItem.titleView = _searchController.searchBar; // When UISearchController presents the results view, present it in // this view controller, not one further up the chain. self.definesPresentationContext = YES; // Prevent the navigation bar from being hidden when searching. _searchController.hidesNavigationBarDuringPresentation = NO; } // Handle the user's selection. - (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController didAutocompleteWithPlace:(GMSPlace *)place { _searchController.active = NO; // Do something with the selected place. NSLog(@"Place name %@", place.name); NSLog(@"Place address %@", place.formattedAddress); NSLog(@"Place attributions %@", place.attributions.string); } - (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController didFailAutocompleteWithError:(NSError *)error { [self dismissViewControllerAnimated:YES completion:nil]; // TODO: handle the error. NSLog(@"Error: %@", [error description]); } // Turn the network activity indicator on and off again. - (void)didRequestAutocompletePredictionsForResultsController: (GMSAutocompleteResultsViewController *)resultsController { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } - (void)didUpdateAutocompletePredictionsForResultsController: (GMSAutocompleteResultsViewController *)resultsController { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }
Bir görünümün üst kısmına arama çubuğu ekleme
Aşağıdaki kod örneğinde, searchBar
öğesinin bir görünümün üst kısmına eklenmesi gösterilmektedir.
Swift
import UIKit import GooglePlaces class ViewController: UIViewController { var resultsViewController: GMSAutocompleteResultsViewController? var searchController: UISearchController? var resultView: UITextView? override func viewDidLoad() { super.viewDidLoad() resultsViewController = GMSAutocompleteResultsViewController() resultsViewController?.delegate = self searchController = UISearchController(searchResultsController: resultsViewController) searchController?.searchResultsUpdater = resultsViewController let subView = UIView(frame: CGRect(x: 0, y: 65.0, width: 350.0, height: 45.0)) subView.addSubview((searchController?.searchBar)!) view.addSubview(subView) searchController?.searchBar.sizeToFit() searchController?.hidesNavigationBarDuringPresentation = false // When UISearchController presents the results view, present it in // this view controller, not one further up the chain. definesPresentationContext = true } } // Handle the user's selection. extension ViewController: GMSAutocompleteResultsViewControllerDelegate { func resultsController(_ resultsController: GMSAutocompleteResultsViewController, didAutocompleteWith place: GMSPlace) { searchController?.isActive = false // Do something with the selected place. print("Place name: \(place.name)") print("Place address: \(place.formattedAddress)") print("Place attributions: \(place.attributions)") } func resultsController(_ resultsController: GMSAutocompleteResultsViewController, didFailAutocompleteWithError error: Error){ // TODO: handle the error. print("Error: ", error.localizedDescription) } // Turn the network activity indicator on and off again. func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = true } func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = false } }
Objective-C
- (void)viewDidLoad { [super viewDidLoad]; _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init]; _resultsViewController.delegate = self; _searchController = [[UISearchController alloc] initWithSearchResultsController:_resultsViewController]; _searchController.searchResultsUpdater = _resultsViewController; UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 65.0, 250, 50)]; [subView addSubview:_searchController.searchBar]; [_searchController.searchBar sizeToFit]; [self.view addSubview:subView]; // When UISearchController presents the results view, present it in // this view controller, not one further up the chain. self.definesPresentationContext = YES; } // Handle the user's selection. - (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController didAutocompleteWithPlace:(GMSPlace *)place { [self dismissViewControllerAnimated:YES completion:nil]; // Do something with the selected place. NSLog(@"Place name %@", place.name); NSLog(@"Place address %@", place.formattedAddress); NSLog(@"Place attributions %@", place.attributions.string); } - (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController didFailAutocompleteWithError:(NSError *)error { [self dismissViewControllerAnimated:YES completion:nil]; // TODO: handle the error. NSLog(@"Error: %@", [error description]); } // Turn the network activity indicator on and off again. - (void)didRequestAutocompletePredictionsForResultsController: (GMSAutocompleteResultsViewController *)resultsController { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } - (void)didUpdateAutocompletePredictionsForResultsController: (GMSAutocompleteResultsViewController *)resultsController { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }
Varsayılan olarak, UISearchController
ekran gösterilirken gezinme çubuğunu gizler (bu özellik devre dışı bırakılabilir). Gezinme çubuğunun görünür ve opak olduğu durumlarda UISearchController
, yerleşimi doğru bir şekilde ayarlamaz.
Geçici bir çözüm olarak aşağıdaki kodu kullanın:
Swift
navigationController?.navigationBar.translucent = false searchController?.hidesNavigationBarDuringPresentation = false // This makes the view area include the nav bar even though it is opaque. // Adjust the view placement down. self.extendedLayoutIncludesOpaqueBars = true self.edgesForExtendedLayout = .top
Objective-C
self.navigationController.navigationBar.translucent = NO; _searchController.hidesNavigationBarDuringPresentation = NO; // This makes the view area include the nav bar even though it is opaque. // Adjust the view placement down. self.extendedLayoutIncludesOpaqueBars = YES; self.edgesForExtendedLayout = UIRectEdgeTop;
Pop-up sonuçlarını kullanarak arama çubuğu ekleme
Aşağıdaki kod örneğinde, gezinme çubuğunun sağ tarafına bir arama çubuğu yerleştirilmesi ve sonuçların bir pop-up penceresinde görüntülenmesi gösterilmektedir.
Swift
import UIKit import GooglePlaces class ViewController: UIViewController { var resultsViewController: GMSAutocompleteResultsViewController? var searchController: UISearchController? var resultView: UITextView? override func viewDidLoad() { super.viewDidLoad() resultsViewController = GMSAutocompleteResultsViewController() resultsViewController?.delegate = self searchController = UISearchController(searchResultsController: resultsViewController) searchController?.searchResultsUpdater = resultsViewController // Add the search bar to the right of the nav bar, // use a popover to display the results. // Set an explicit size as we don't want to use the entire nav bar. searchController?.searchBar.frame = (CGRect(x: 0, y: 0, width: 250.0, height: 44.0)) navigationItem.rightBarButtonItem = UIBarButtonItem(customView: (searchController?.searchBar)!) // When UISearchController presents the results view, present it in // this view controller, not one further up the chain. definesPresentationContext = true // Keep the navigation bar visible. searchController?.hidesNavigationBarDuringPresentation = false searchController?.modalPresentationStyle = .popover } } // Handle the user's selection. extension ViewController: GMSAutocompleteResultsViewControllerDelegate { func resultsController(_ resultsController: GMSAutocompleteResultsViewController, didAutocompleteWith place: GMSPlace) { searchController?.isActive = false // Do something with the selected place. print("Place name: \(place.name)") print("Place address: \(place.formattedAddress)") print("Place attributions: \(place.attributions)") } func resultsController(_ resultsController: GMSAutocompleteResultsViewController, didFailAutocompleteWithError error: Error){ // TODO: handle the error. print("Error: ", error.localizedDescription) } // Turn the network activity indicator on and off again. func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = true } func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) { UIApplication.shared.isNetworkActivityIndicatorVisible = false } }
Objective-C
- (void)viewDidLoad { [super viewDidLoad]; _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init]; _resultsViewController.delegate = self; _searchController = [[UISearchController alloc] initWithSearchResultsController:_resultsViewController]; _searchController.searchResultsUpdater = _resultsViewController; // Add the search bar to the right of the nav bar, // use a popover to display the results. // Set an explicit size as we don't want to use the entire nav bar. _searchController.searchBar.frame = CGRectMake(0, 0, 250.0f, 44.0f); self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:_searchController.searchBar]; // When UISearchController presents the results view, present it in // this view controller, not one further up the chain. self.definesPresentationContext = YES; // Keep the navigation bar visible. _searchController.hidesNavigationBarDuringPresentation = NO; _searchController.modalPresentationStyle = UIModalPresentationPopover; } // Handle the user's selection. - (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController didAutocompleteWithPlace:(GMSPlace *)place { [self dismissViewControllerAnimated:YES completion:nil]; NSLog(@"Place name %@", place.name); NSLog(@"Place address %@", place.formattedAddress); NSLog(@"Place attributions %@", place.attributions.string); } - (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController didFailAutocompleteWithError:(NSError *)error { [self dismissViewControllerAnimated:YES completion:nil]; // TODO: handle the error. NSLog(@"Error: %@", [error description]); } // Turn the network activity indicator on and off again. - (void)didRequestAutocompletePredictionsForResultsController: (GMSAutocompleteResultsViewController *)resultsController { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } - (void)didUpdateAutocompletePredictionsForResultsController: (GMSAutocompleteResultsViewController *)resultsController { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }
Tablo veri kaynağı kullanma
Uygulamanızın özel arama metni kullanıcı arayüzü varsa sonuçların görünüm denetleyicisinde gösterildiği tablo görünümünü kullanmak için GMSAutocompleteTableDataSource
sınıfını kullanabilirsiniz.
GMSAutocompleteTableDataSource
'ı bir görünüm denetleyicisinde veri kaynağı ve UITableView
yetkisi olarak kullanmak için:
- Görünüm denetleyicide
GMSAutocompleteTableDataSourceDelegate
veUISearchBarDelegate
protokollerini uygulayın. - Bir
GMSAutocompleteTableDataSource
örneği oluşturun ve görünüm denetleyicisini yetki verme özelliği olarak atayın. GMSAutocompleteTableDataSource
öğesini veri kaynağı olarak ayarlayın ve görünüm denetleyicisindeUITableView
örneğinin yetki verme özelliklerini kullanın.- Arama metni girişi işleyicisinde,
GMSAutocompleteTableDataSource
üzerindesourceTextHasChanged
yöntemini çağırın. didAutocompleteWithPlace
yetki verme yönteminde kullanıcı seçimini yönetin.didAutocompleteWithPlace
,didFailAutocompleteWithError
,wasCancelled
yetki verme yöntemlerinde kumandayı kapatabilirsiniz.
Aşağıdaki kod örneğinde, UISearchBar
ayrı olarak eklendiğinde UIViewController
tablo görünümünü çalıştırmak için GMSAutocompleteTableDataSource
sınıfının kullanılması gösterilmektedir.
Swift
// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import GooglePlaces import UIKit class PlaceAutocompleteViewController: UIViewController { private var tableView: UITableView! private var tableDataSource: GMSAutocompleteTableDataSource! override func viewDidLoad() { super.viewDidLoad() let searchBar = UISearchBar(frame: CGRect(x: 0, y: 20, width: self.view.frame.size.width, height: 44.0)) searchBar.delegate = self view.addSubview(searchBar) tableDataSource = GMSAutocompleteTableDataSource() tableDataSource.delegate = self tableView = UITableView(frame: CGRect(x: 0, y: 64, width: self.view.frame.size.width, height: self.view.frame.size.height - 44)) tableView.delegate = tableDataSource tableView.dataSource = tableDataSource view.addSubview(tableView) } } extension PlaceAutocompleteViewController: UISearchBarDelegate { func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { // Update the GMSAutocompleteTableDataSource with the search text. tableDataSource.sourceTextHasChanged(searchText) } } extension PlaceAutocompleteViewController: GMSAutocompleteTableDataSourceDelegate { func didUpdateAutocompletePredictions(for tableDataSource: GMSAutocompleteTableDataSource) { // Turn the network activity indicator off. UIApplication.shared.isNetworkActivityIndicatorVisible = false // Reload table data. tableView.reloadData() } func didRequestAutocompletePredictions(for tableDataSource: GMSAutocompleteTableDataSource) { // Turn the network activity indicator on. UIApplication.shared.isNetworkActivityIndicatorVisible = true // Reload table data. tableView.reloadData() } func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didAutocompleteWith place: GMSPlace) { // Do something with the selected place. print("Place name: \(place.name)") print("Place address: \(place.formattedAddress)") print("Place attributions: \(place.attributions)") } func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didFailAutocompleteWithError error: Error) { // Handle the error. print("Error: \(error.localizedDescription)") } func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didSelect prediction: GMSAutocompletePrediction) -> Bool { return true } }
Objective-C
// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #import "PlaceAutocompleteViewController.h" @import GooglePlaces; @import UIKit; @interface PlaceAutocompleteViewController () <GMSAutocompleteTableDataSourceDelegate, UISearchBarDelegate> @end @implementation PlaceAutocompleteViewController { UITableView *tableView; GMSAutocompleteTableDataSource *tableDataSource; } - (void)viewDidLoad { [super viewDidLoad]; UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)]; searchBar.delegate = self; [self.view addSubview:searchBar]; tableDataSource = [[GMSAutocompleteTableDataSource alloc] init]; tableDataSource.delegate = self; tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 44)]; tableView.delegate = tableDataSource; tableView.dataSource = tableDataSource; [self.view addSubview:tableView]; } #pragma mark - GMSAutocompleteTableDataSourceDelegate - (void)didUpdateAutocompletePredictionsForTableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource { // Turn the network activity indicator off. UIApplication.sharedApplication.networkActivityIndicatorVisible = NO; // Reload table data. [tableView reloadData]; } - (void)didRequestAutocompletePredictionsForTableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource { // Turn the network activity indicator on. UIApplication.sharedApplication.networkActivityIndicatorVisible = YES; // Reload table data. [tableView reloadData]; } - (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didAutocompleteWithPlace:(GMSPlace *)place { // Do something with the selected place. NSLog(@"Place name: %@", place.name); NSLog(@"Place address: %@", place.formattedAddress); NSLog(@"Place attributions: %@", place.attributions); } - (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didFailAutocompleteWithError:(NSError *)error { // Handle the error NSLog(@"Error %@", error.description); } - (BOOL)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didSelectPrediction:(GMSAutocompletePrediction *)prediction { return YES; } #pragma mark - UISearchBarDelegate - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { // Update the GMSAutocompleteTableDataSource with the search text. [tableDataSource sourceTextHasChanged:searchText]; } @end
Metin ve arka plan renklerini özelleştirme
Widget'ın, uygulamanızın görsel görünümüne daha uygun olmasını sağlamak için otomatik tamamlama kullanıcı arayüzü denetiminde tüm metin ve arka planların renklerini ayarlayabilirsiniz. Kullanıcı arayüzü kontrol renklerini ayarlamanın iki yolu vardır:
- Mümkün olduğunda kullanıcı arayüzü kontrollerinin genel stilini belirlemek için yerel iOS UIViewance protokolünü kullanarak. Bu ayarlar, tüm kullanıcı arayüzü kontrol öğeleri için geçerli olmasa da çoğu için geçerlidir.
- UIGörünüm protokolü tarafından desteklenmeyen özellikleri ayarlamak için widget sınıflarındaki SDK yöntemlerini kullanarak.
Uygulamanız genellikle UILookance protokolü ve SDK yöntemlerinin bir kombinasyonunu kullanır. Aşağıdaki şemada, hangi öğelere stil eklenebileceği gösterilmektedir:
Aşağıdaki tabloda, tüm kullanıcı arayüzü öğeleri listelenmekte ve her birinin nasıl stil uygulanması gerektiği (UIGörünüm protokolü veya SDK yöntemi) belirtilmiştir.
Kullanıcı Arayüzü Öğesi | Yöntem | Moda bilgileri |
---|---|---|
Gezinme çubuğu tonu (arka plan) | UIGörünüm protokolü | UINavigationBar proxy'sinde setBarTintColor öğesini çağır. |
Gezinme Çubuğu ton rengi (arama çubuğu metin imleci ve İptal düğmesi) | UIGörünüm protokolü | UINavigationBar proxy'sinde setTintColor öğesini çağır. |
Arama Çubuğu metin rengi | UIGörünüm protokolü | searchBarTextAttributes içinde NSForegroundColorAttributeName ayarlayın. |
Arama çubuğu ton rengi | Yok | Arama çubuğu yarı saydamdır ve Gezinme Çubuğunun gölgeli versiyonu olarak görüntülenir. |
Arama çubuğu yer tutucu metin rengi (varsayılan arama metni) | UIGörünüm protokolü | placeholderAttributes içinde NSForegroundColorAttributeName ayarlayın. |
Birincil metin (hata ve ileti metnine de uygulanır) | SDK yöntemi | primaryTextColor Hizmetleri İçin Arayın. |
Birincil metin vurgulama | SDK yöntemi | primaryTextHighlightColor Hizmetleri İçin Arayın. |
İkincil metin | SDK yöntemi | secondaryTextColor Hizmetleri İçin Arayın. |
Hata ve mesaj metni | SDK yöntemi | primaryTextColor Hizmetleri İçin Arayın. |
Tablo hücre arka planı | SDK yöntemi | tableCellBackgroundColor Hizmetleri İçin Arayın. |
Tablo hücre ayırıcı rengi | SDK yöntemi | tableCellSeparatorColor Hizmetleri İçin Arayın. |
"Tekrar Dene" düğmesi | SDK yöntemi | tintColor Hizmetleri İçin Arayın. |
Etkinlik göstergesi (ilerleme döner simgesi) | UIGörünüm protokolü | UIActivityIndicatorView proxy'sinde setColor öğesini çağır. |
"Google tarafından desteklenmektedir" logosu, Üzgün bulut resmi | Yok | Arka plan kontrastına göre beyaz veya gri sürüm otomatik olarak seçilir. |
Arama Çubuğu metin alanında büyüteç ve temiz metin simgeleri | Yok | Stil için varsayılan resimleri istediğiniz renkteki resimlerle değiştirin. |
UIViewance protokolünü kullanma
Belirli bir kullanıcı arayüzü öğesinin görünüm proxy'sini almak için UIViewance protokolünü kullanabilirsiniz. Daha sonra bunu, UI öğesinin rengini ayarlamak için kullanabilirsiniz. Değişiklik yapıldığında, belirli bir kullanıcı arayüzü öğesinin tüm örnekleri etkilenir. Örneğin, aşağıdaki örnek, UISearchBar
içinde yer alan UITextField
sınıflarının metin rengini genel olarak yeşile dönüştürür:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}];
Renk değerlerini tanımlama hakkında daha fazla bilgi için UIColor Sınıf Referansı'na bakın.
Aşağıdaki kod snippet'leri, tam ekran otomatik tamamlama kullanıcı arayüzü kontrolündeki her şeyin stilini belirlemek için kullanmanız gereken tüm proxy komutlarını gösterir. Bu kodu Appdelegate.m'de didFinishLaunchingWithOptions
yöntemine ekleyin:
// Define some colors. UIColor *darkGray = [UIColor darkGrayColor]; UIColor *lightGray = [UIColor lightGrayColor]; // Navigation bar background. [[UINavigationBar appearance] setBarTintColor:darkGray]; [[UINavigationBar appearance] setTintColor:lightGray]; // Color of typed text in the search bar. NSDictionary *searchBarTextAttributes = @{ NSForegroundColorAttributeName: lightGray, NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]] }; [UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] .defaultTextAttributes = searchBarTextAttributes; // Color of the placeholder text in the search bar prior to text entry. NSDictionary *placeholderAttributes = @{ NSForegroundColorAttributeName: lightGray, NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]] }; // Color of the default search text. // NOTE: In a production scenario, "Search" would be a localized string. NSAttributedString *attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Search" attributes:placeholderAttributes]; [UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] .attributedPlaceholder = attributedPlaceholder; // Color of the in-progress spinner. [[UIActivityIndicatorView appearance] setColor:lightGray]; // To style the two image icons in the search bar (the magnifying glass // icon and the 'clear text' icon), replace them with different images. [[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_clear_x_high"] forSearchBarIcon:UISearchBarIconClear state:UIControlStateHighlighted]; [[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_clear_x"] forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal]; [[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_search"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal]; // Color of selected table cells. UIView *selectedBackgroundView = [[UIView alloc] init]; selectedBackgroundView.backgroundColor = [UIColor lightGrayColor]; [UITableViewCell appearanceWhenContainedIn:[GMSAutocompleteViewController class], nil] .selectedBackgroundView = selectedBackgroundView;
Kullanıcı arayüzü kontrol stili özelliklerini ayarlama
Kullanıcı arayüzü kontrol öğelerinin bir alt grubu, UIViewance protokolünden etkilenmeyen özelliklere sahip olduğundan doğrudan ayarlanmalıdır. Aşağıdaki kod örneğinde, ön ve arka plan renklerinin tanımlanması ve bunların acController
adlı bir kullanıcı arayüzü kontrol örneğine uygulanması gösterilmektedir. Bu kodu ViewController.m'deki onLaunchClicked
yöntemine ekleyin:
UIColor *darkGray = [UIColor darkGrayColor]; UIColor *lightGray = [UIColor lightGrayColor]; acController.secondaryTextColor = [UIColor colorWithWhite:1.0f alpha:0.5f]; acController.primaryTextColor = lightGray; acController.primaryTextHighlightColor = [UIColor grayColor]; acController.tableCellBackgroundColor = darkGray; acController.tableCellSeparatorColor = lightGray; acController.tintColor = lightGray;
Yer tahminlerini programatik olarak alma
Otomatik tamamlama widget'ının sağladığı kullanıcı arayüzüne alternatif olarak özel bir arama kullanıcı arayüzü oluşturabilirsiniz. Bunun için uygulamanızın yer tahminlerini programatik olarak alması gerekir. Uygulamanız, aşağıdaki yöntemlerden birini kullanarak tahmin edilen yer adlarının ve/veya adreslerin listesini alabilir:
GMSPlacesClient findAutocompletePredictionsFromQuery:
aranıyor
Tahmin edilen yer adlarının ve/veya adreslerinin listesini almak için önce GMSPlacesClient uygulamasını başlatın, ardından aşağıdaki parametrelerle GMSPlacesClient findAutocompletePredictionsFromQuery:
yöntemini çağırın:
- Kullanıcının yazdığı metni içeren
autocompleteQuery
dizesi. - Her bir oturumu tanımlamak için kullanılan
GMSAutocompleteSessionToken
. Uygulamanız her otomatik tamamlama isteği çağrısı için aynı jetonu iletmeli, ardından kullanıcı tarafından seçilen yerin Yer Ayrıntılarını almak içinfetchPlacefromPlaceID:
'e yapılan bir sonraki çağrıda Yer Kimliği ile birlikte bu jetonu iletmelidir. GMSAutocompleteFilter
ile:- Yanlı olma veya sonuçları belirli bir bölgeyle sınırlandırma.
- Sonuçları belirli bir yer türüyle sınırlandırın.
- Sonuçlara enlem ve boylam sınırlarıyla belirtilen belirli bir alana ağırlık veren
GMSPlaceLocationBias
/Kısıtlama nesnesi.
- Döndürülen tahminleri işlemek için bir geri çağırma yöntemi.
Aşağıdaki kod örneklerinde bir findAutocompletePredictionsFromQuery:
çağrısı gösterilmektedir.
Swift
/** * Create a new session token. Be sure to use the same token for calling * findAutocompletePredictions, as well as the subsequent place details request. * This ensures that the user's query and selection are billed as a single session. */ let token = GMSAutocompleteSessionToken.init() // Create a type filter. let filter = GMSAutocompleteFilter() filter.types = [.bank] filter.locationBias = GMSPlaceRectangularLocationOption( northEastBounds, southWestBounds); placesClient?.findAutocompletePredictions(fromQuery: "cheesebu", filter: filter, sessionToken: token, callback: { (results, error) in if let error = error { print("Autocomplete error: \(error)") return } if let results = results { for result in results { print("Result \(result.attributedFullText) with placeID \(result.placeID)") } } })
Objective-C
/** * Create a new session token. Be sure to use the same token for calling * findAutocompletePredictionsFromQuery:, as well as the subsequent place details request. * This ensures that the user's query and selection are billed as a single session. */ GMSAutocompleteSessionToken *token = [[GMSAutocompleteSessionToken alloc] init]; // Create a type filter. GMSAutocompleteFilter *_filter = [[GMSAutocompleteFilter alloc] init]; _filter.types = @[ kGMSPlaceTypeBank ]; [_placesClient findAutocompletePredictionsFromQuery:@"cheesebu" filter:_filter sessionToken:token callback:^(NSArray<GMSAutocompletePrediction *> * _Nullable results, NSError * _Nullable error) { if (error != nil) { NSLog(@"An error occurred %@", [error localizedDescription]); return; } if (results != nil) { for (GMSAutocompletePrediction *result in results) { NSLog(@"Result %@ with PlaceID %@", result.attributedFullText, result.placeID); } } }];
API, bir GMSAutocompletePrediction
nesne dizisi ileterek belirtilen geri çağırma yöntemini çağırır.
Her GMSAutocompletePrediction
nesnesi aşağıdaki bilgileri içerir:
attributedFullText
– TahmininNSAttributedString
biçimindeki tam metni. Örneğin, "Sidney Opera Binası, Sidney, Yeni Güney Galler, Avustralya". Kullanıcı girişiyle eşleşen her metin aralığının bir özelliği (kGMSAutocompleteMatchAttribute
) vardır. Bu özelliği, kullanıcının sorgusunda eşleşen metni vurgulamak için kullanabilirsiniz (örneğin, aşağıda gösterildiği gibi).placeID
: Tahmin edilen yerin yer kimliğidir. Yer kimliği, bir yeri benzersiz şekilde tanımlayan metinsel bir tanımlayıcıdır. Yer kimlikleri hakkında daha fazla bilgi için bkz. Yer Kimliğine genel bakış.distanceMeters
– Belirtilenorigin
ile hedefe arasındaki düz çizgi mesafesi.origin
özelliği ayarlanmazsa mesafe değeri döndürülmez.
Aşağıdaki kod örneğinde, kullanıcının sorgusundaki metinle eşleşen sonuç bölümlerinin enumerateAttribute
kullanılarak kalın metinle nasıl vurgulanacağı gösterilmektedir:
Swift
let regularFont = UIFont.systemFont(ofSize: UIFont.labelFontSize) let boldFont = UIFont.boldSystemFont(ofSize: UIFont.labelFontSize) let bolded = prediction.attributedFullText.mutableCopy() as! NSMutableAttributedString bolded.enumerateAttribute(kGMSAutocompleteMatchAttribute, in: NSMakeRange(0, bolded.length), options: []) { (value, range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) -> Void in let font = (value == nil) ? regularFont : boldFont bolded.addAttribute(NSFontAttributeName, value: font, range: range) } label.attributedText = bolded
Objective-C
UIFont *regularFont = [UIFont systemFontOfSize:[UIFont labelFontSize]]; UIFont *boldFont = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]]; NSMutableAttributedString *bolded = [prediction.attributedFullText mutableCopy]; [bolded enumerateAttribute:kGMSAutocompleteMatchAttribute inRange:NSMakeRange(0, bolded.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { UIFont *font = (value == nil) ? regularFont : boldFont; [bolded addAttribute:NSFontAttributeName value:font range:range]; }]; label.attributedText = bolded;
Alıcıyı kullanma
Kendi otomatik tamamlama denetiminizi sıfırdan oluşturmak istiyorsanız GMSPlacesClient
üzerinde autocompleteQuery
yöntemini sarmalayan GMSAutocompleteFetcher
özelliğini kullanabilirsiniz.
Alıcı, istekleri kısıtlayarak yalnızca en son girilen arama metnine ilişkin sonuçları döndürür. Kullanıcı arayüzü öğeleri sağlamaz.
GMSAutocompleteFetcher
'i uygulamak için aşağıdaki adımları uygulayın:
GMSAutocompleteFetcherDelegate
protokolünü uygulayın.GMSAutocompleteFetcher
nesnesi oluşturun.- Kullanıcı yazarken alıcıda
sourceTextHasChanged
komutunu çağırın. didAutcompleteWithPredictions
vedidFailAutocompleteWithError
protokol yöntemlerini kullanarak tahminleri ve hataları işleyin.
Aşağıdaki kod örneğinde, kullanıcı girişi almak ve yer eşleşmelerini metin görünümünde görüntülemek için alıcının kullanılması gösterilmektedir. Yer seçme işlevi atlandı. FetcherSampleViewController
, FetcherSampleViewController.h'deki UIViewController
öğesinden türetilir.
Swift
import UIKit import GooglePlaces class ViewController: UIViewController { var textField: UITextField? var resultText: UITextView? var fetcher: GMSAutocompleteFetcher? override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white edgesForExtendedLayout = [] // Set bounds to inner-west Sydney Australia. let neBoundsCorner = CLLocationCoordinate2D(latitude: -33.843366, longitude: 151.134002) let swBoundsCorner = CLLocationCoordinate2D(latitude: -33.875725, longitude: 151.200349) // Set up the autocomplete filter. let filter = GMSAutocompleteFilter() filter.locationRestriction = GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner) // Create a new session token. let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init() // Create the fetcher. fetcher = GMSAutocompleteFetcher(bounds: nil, filter: filter) fetcher?.delegate = self fetcher?.provide(token) textField = UITextField(frame: CGRect(x: 5.0, y: 10.0, width: view.bounds.size.width - 5.0, height: 64.0)) textField?.autoresizingMask = .flexibleWidth textField?.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged) let placeholder = NSAttributedString(string: "Type a query...") textField?.attributedPlaceholder = placeholder resultText = UITextView(frame: CGRect(x: 0, y: 65.0, width: view.bounds.size.width, height: view.bounds.size.height - 65.0)) resultText?.backgroundColor = UIColor(white: 0.95, alpha: 1.0) resultText?.text = "No Results" resultText?.isEditable = false self.view.addSubview(textField!) self.view.addSubview(resultText!) } @objc func textFieldDidChange(textField: UITextField) { fetcher?.sourceTextHasChanged(textField.text!) } } extension ViewController: GMSAutocompleteFetcherDelegate { func didAutocomplete(with predictions: [GMSAutocompletePrediction]) { let resultsStr = NSMutableString() for prediction in predictions { resultsStr.appendFormat("\n Primary text: %@\n", prediction.attributedPrimaryText) resultsStr.appendFormat("Place ID: %@\n", prediction.placeID) } resultText?.text = resultsStr as String } func didFailAutocompleteWithError(_ error: Error) { resultText?.text = error.localizedDescription } }
Objective-C
#import "FetcherSampleViewController.h" #import <GooglePlaces/GooglePlaces.h> #import <GoogleMapsBase/GoogleMapsBase.h> @interface FetcherSampleViewController () <GMSAutocompleteFetcherDelegate> @end @implementation FetcherSampleViewController { UITextField *_textField; UITextView *_resultText; GMSAutocompleteFetcher* _fetcher; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.edgesForExtendedLayout = UIRectEdgeNone; // Set bounds to inner-west Sydney Australia. CLLocationCoordinate2D neBoundsCorner = CLLocationCoordinate2DMake(-33.843366, 151.134002); CLLocationCoordinate2D swBoundsCorner = CLLocationCoordinate2DMake(-33.875725, 151.200349); GMSAutocompleteFilter *autocompleteFilter = [[GMSAutocompleteFilter alloc] init]; autocompleteFilter.locationRestriction = GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner); // Create the fetcher. _fetcher = [[GMSAutocompleteFetcher alloc] initWithBounds:nil filter:filter]; _fetcher.delegate = self; // Set up the UITextField and UITextView. _textField = [[UITextField alloc] initWithFrame:CGRectMake(5.0f, 0, self.view.bounds.size.width - 5.0f, 44.0f)]; _textField.autoresizingMask = UIViewAutoresizingFlexibleWidth; [_textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; _resultText =[[UITextView alloc] initWithFrame:CGRectMake(0, 45.0f, self.view.bounds.size.width, self.view.bounds.size.height - 45.0f)]; _resultText.backgroundColor = [UIColor colorWithWhite:0.95f alpha:1.0f]; _resultText.text = @"No Results"; _resultText.editable = NO; [self.view addSubview:_textField]; [self.view addSubview:_resultText]; } - (void)textFieldDidChange:(UITextField *)textField { NSLog(@"%@", textField.text); [_fetcher sourceTextHasChanged:textField.text]; } #pragma mark - GMSAutocompleteFetcherDelegate - (void)didAutocompleteWithPredictions:(NSArray *)predictions { NSMutableString *resultsStr = [NSMutableString string]; for (GMSAutocompletePrediction *prediction in predictions) { [resultsStr appendFormat:@"%@\n", [prediction.attributedPrimaryText string]]; } _resultText.text = resultsStr; } - (void)didFailAutocompleteWithError:(NSError *)error { _resultText.text = [NSString stringWithFormat:@"%@", error.localizedDescription]; } @end
Oturum jetonları
Oturum jetonları, faturalandırma amacıyla bir kullanıcı otomatik tamamlama aramasının sorgu ve seçim aşamalarını ayrı bir oturumda gruplandırır. Oturum, kullanıcı bir sorgu yazmaya başladığında başlar ve kullanıcı bir yer seçtiğinde sona erer. Her oturumda birden fazla sorgu bulunabilir ve oturumlarda tek bir yer seçimi yapılabilir. Bir oturum sona erdiğinde jeton artık geçerli olmaz. Bu durumda uygulamanızın her oturum için yeni bir jeton oluşturması gerekir. Tüm programatik otomatik tamamlama oturumları için oturum jetonları kullanmanızı öneririz (tam ekran denetleyicisini veya sonuç denetleyicisini kullandığınızda API bunu otomatik olarak yapar).
iOS için Yerler SDK'sı her oturumu tanımlamak için bir GMSAutocompleteSessionToken
kullanır. Uygulamanız her yeni oturumun başlangıcında yeni bir oturum jetonu iletmeli, ardından kullanıcı tarafından seçilen yerin Yer Ayrıntılarını almak için fetchPlacefromPlaceID:
'e yapılan sonraki çağrıda bir Yer Kimliği ile birlikte aynı jetonu iletmelidir.
Oturum jetonları hakkında daha fazla bilgi edinin.
Yeni bir oturum jetonu oluşturmak için aşağıdaki kodu kullanın:
let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init()
Kullanım sınırları
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 tamamlama hizmetini programatik olarak kullanıyorsa kullanıcı arayüzünüzde "Google tarafından desteklenmektedir" ilişkilendirmesi ya da Google markalı bir haritada yer alması gerekir.
- Uygulamanız otomatik tamamlama kullanıcı arayüzü kontrolünü kullanıyorsa ek bir işlem yapmanız gerekmez (varsayılan olarak gerekli ilişkilendirme gösterilir).
- Bir yeri kimliğe göre aldıktan sonra ek yer bilgileri alıp görüntülerseniz üçüncü taraf ilişkilendirmelerini de göstermeniz gerekir.
Daha fazla bilgi için ilişkilendirmeler hakkındaki belgeleri inceleyin.
Ağ etkinliği göstergesini denetleme
Uygulamaların durum çubuğundaki ağ etkinliği göstergesini kontrol etmek üzere, kullandığınız otomatik tamamlama sınıfı için uygun, isteğe bağlı yetki verme yöntemlerini uygulamanız ve ağ göstergesini kendiniz açıp kapatmanız gerekir.
GMSAutocompleteViewController
iç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 uygulayarak ve [UIApplication sharedApplication].networkActivityIndicatorVisible
politikasını sırasıyla YES
ve NO
olarak ayarladığınızda durum çubuğu, otomatik tamamlama kullanıcı arayüzüyle doğru bir şekilde eşleşir.
Otomatik tamamlama sonuçlarını sınırla
Otomatik tamamlama kullanıcı arayüzü denetimini, sonuçları belirli bir coğrafi bölgeyle sınırlandıracak ve/veya sonuçları bir ya da daha fazla yer türüne ya da belirli bir ülke veya ülkelere göre filtreleyebilirsiniz. Sonuçları sınırlandırmak için aşağıdakileri yapabilirsiniz:
- Tanımlanan bölge dahilindeki sonuçları tercih etmek (önyargı) için
GMSAutocompleteFilter
üzerindelocationBias
öğesini ayarlayın (tanımlanan bölgenin dışından bazı sonuçlar döndürülmeye devam edebilir).locationRestriction
politikası da ayarlanırsalocationBias
yoksayılır. Yalnızca 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 tamamına uygulanır. Dikdörtgen sınırların dışında bulunan sentetik sonuçlar, konum kısıtlamasıyla çakışan bir rotaya göre döndürülebilir.
Yalnızca belirli bir yer türüne uygun sonuçları döndürmek için
GMSAutocompleteFilter
öğesindetypes
öğesini ayarlayın (örneğin, TypeFilter.ADDRESS belirtmek widget'ın yalnızca tam adresli sonuçları döndürmesine neden olur).Yalnızca en fazla beş belirtilen ülkeye ait sonuçları döndürmek için
GMSAutocompleteFilter
üzerindecountries
değerini ayarlayın.
Belirli bir bölge için yanlı sonuçlar
Tanımlanan bölge içindeki sonuçları tercih etmek (önyargı) için GMSAutocompleteFilter
üzerinde locationBias
öğesini burada gösterildiği gibi ayarlayın:
northEast = CLLocationCoordinate2DMake(39.0, -95.0);
southWest = CLLocationCoordinate2DMake(37.5, -100.0);
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.locationBias = GMSPlaceRectangularLocationOption(northEast, southWest);
Sonuçları belirli bir bölgeyle sınırlandırın
Yalnızca tanımlanan bölgedeki sonuçları göstermek (kısıtlamak) için GMSAutocompleteFilter
üzerinde locationRestriction
özelliğini aşağıda gösterildiği gibi ayarlayın:
northEast = CLLocationCoordinate2DMake(39.0, -95.0);
southWest = CLLocationCoordinate2DMake(37.5, -100.0);
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.locationRestriction = GMSPlaceRectangularLocationOption(northEast, southWest);
Sonuçları ülkeye göre filtreleyin
En fazla beş belirtilen ülkedeki sonuçları filtrelemek için GMSAutocompleteFilter
üzerinde countries
öğesini aşağıda gösterildiği gibi ayarlayın:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.countries = @[ @"au", @"nz" ];
Sonuçları yer türüne veya koleksiyon türüne göre filtreleyin
GMSAutoCompleteFilter
öğesinin types
özelliğini ayarlayarak sonuçları belirli bir türde veya tür bir koleksiyonda olacak şekilde kısıtlayın.
Yer Türleri'ndeki 1, 2 ve 3 numaralı Tablo'larda listelenen filtreleri belirtmek için bu özelliği kullanın. Hiçbir şey belirtilmezse tüm türler döndürülür.
Bir tür veya tür koleksiyon filtresi belirtmek için:
Yer Türleri'nde gösterilen Tablo 1 ve Tablo 2'den en fazla beş type değeri belirtmek için
types
özelliğini kullanın. Tür değerleri,GMSPlaceType
içindeki sabitlerle tanımlanır.Yer Türleri'nde gösterilen Tablo 3'ten bir tür koleksiyonu belirtmek için
types
özelliğini kullanın. Tür koleksiyonu değerleri,GMSPlaceType
içindeki sabitlerle tanımlanır.İstekte Tablo 3'ten yalnızca bir türe izin verilir. Tablo 3'ten bir değer belirtirseniz Tablo 1'den veya Tablo 2'den değer belirtemezsiniz. Aksi takdirde bir hata oluşur.
Örneğin, yalnızca belirli bir yer türüne uygun sonuçları döndürmek için GMSAutocompleteFilter
üzerinde types
değerini ayarlayın. Aşağıdaki örnekte, filtrenin yalnızca kesin adres içeren sonuçları döndürecek şekilde ayarlanması gösterilmektedir:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.types = @[ kGMSPlaceTypeAirport, kGMSPlaceTypeAmusementPark ];
Yer Otomatik Tamamlama optimizasyonu
Bu bölümde Otomatik Yer Tamamlama hizmetinden en iyi şekilde yararlanmanıza yardımcı olacak en iyi uygulamalar açıklanmaktadır.
Bazı genel kurallar şunlardır:
- Çalışan bir kullanıcı arayüzü geliştirmenin en hızlı yolu, Maps JavaScript API Otomatik tamamlama widget'ı, Android için Yerler SDK'sı Otomatik tamamlama widget'ı veya iOS için Yerler SDK'sı Otomatik tamamlama kullanıcı arayüzü kontrolü'nü kullanmaktır
- Otomatik Yer Tamamlama veri alanları hakkında en baştan bilgi edinin.
- Konuma ağırlık verme ve konum kısıtlaması alanları isteğe bağlıdır ancak otomatik tamamlama performansı üzerinde önemli bir etkiye sahip olabilir.
- API'nin hata döndürdüğü durumlarda uygulamanızın sorunsuz şekilde geri çekildiğinden emin olmak için hata işlemeyi kullanın.
- Uygulamanızın seçim yapılmadığında bunu işlendiğinden ve kullanıcılara devam etmeleri için bir yol sunduğundan emin olun.
Maliyet optimizasyonuyla ilgili en iyi uygulamalar
Temel maliyet optimizasyonu
Otomatik Yer Tamamlama hizmetini kullanma maliyetini optimize etmek için, Yer Ayrıntıları ve Otomatik Yer Tamamlama widget'larındaki alan maskelerini kullanarak yalnızca ihtiyacınız olan yer verisi alanlarını döndürün.
Gelişmiş maliyet optimizasyonu
İstek Başına Fiyatlandırma'ya erişmek ve seçilen yer hakkında Yer Ayrıntıları yerine Coğrafi Kodlama API'si sonuçlarını istemek için Otomatik Yer Tamamlama özelliğinin programatik olarak uygulanmasını göz önünde bulundurun. Aşağıdaki koşulların her ikisi de karşılanırsa İstek Başına Fiyatlandırma, Geocoding API ile eşleştirilen Oturum Başına (oturuma dayalı) fiyatlandırmadan daha uygun maliyetlidir:
- Yalnızca kullanıcının seçtiği yerin enlem/boylam veya adresine ihtiyaç duyarsanız Coğrafi Kodlama API'si bu bilgileri Yer Ayrıntısı çağrısından daha düşük bir ücret karşılığında sunar.
- Kullanıcılar ortalama dört veya daha az Otomatik Tamamlama tahmin isteği içinde bir otomatik tamamlama tahmini seçerse, İstek Başına fiyatlandırma, Oturum Başına fiyatlandırmadan daha uygun maliyetli olabilir.
Uygulamanız, seçilen tahminin adresi ve enlem/boylam dışında herhangi bir bilgi gerektiriyor mu?
Evet, daha fazla ayrıntı gerekiyor
Yer Ayrıntıları ile oturuma dayalı Otomatik Yer Tamamlama özelliğini kullanın.
Uygulamanız yer adı, işletme durumu veya çalışma saatleri gibi Yer Ayrıntıları gerektirdiğinden, Yer Otomatik Tamamlama özelliği programatik olarak veya JavaScript, Android ya da iOS widget'larında yerleşik olarak bulunan bir oturum jetonu (programatik, Android ya da iOS widget'larında yerleşik) kullanmalıdır.Bunun için toplam maliyet 0, 017 ABD doları (oturum başına ve geçerli Yer Verileri SKU'ları yer verileri SKU'ları olmalıdır{/15).
Widget uygulaması
Oturum yönetimi JavaScript, Android veya iOS widget'larına otomatik olarak eklenir. Buna hem otomatik Yer Tamamlama istekleri hem de seçilen tahmindeki Yer Ayrıntısı isteği dahildir. Yalnızca ihtiyacınız olan yer verisi alanlarını istediğinizden emin olmak için fields
parametresini belirttiğinizden emin olun.
Programatik uygulama
Otomatik Yer Tamamlama isteklerinizle bir oturum jetonu kullanın. Seçilen tahmin hakkında Yer Ayrıntıları isterken aşağıdaki parametreleri ekleyin:
- 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 gerekiyor
Otomatik Yer Tamamlama kullanımınızın performansına bağlı olarak Coğrafi Kodlama API'sı, uygulamanız için Yer Ayrıntıları'ndan daha uygun maliyetli bir seçenek olabilir. Her uygulamanın Otomatik Tamamlama verimliliği, hangi kullanıcıların giriş yaptığına, uygulamanın nerede kullanıldığına ve performans optimizasyonuyla ilgili en iyi uygulamaların uygulanıp uygulanmadığına bağlı olarak değişiklik gösterir.
Aşağıdaki soruyu yanıtlamak için, bir kullanıcının uygulamanızda Yer Otomatik Tamamlama tahmini seçmeden önce ortalama kaç karakter yazdığını analiz edin.
Kullanıcılarınız ortalama olarak dört veya daha az istekte Yer Otomatik Tamamlama tahminini seçiyor mu?
Evet
Otomatik Yer Tamamlama özelliğini oturum jetonları olmadan programatik olarak uygulayın ve seçilen yer tahmininde Coğrafi Kodlama API'sini çağırın.
Geocoding API, adresleri ve enlem/boylam koordinatlarını istek başına 0,005 ABD doları karşılığında sunar. Dört adet Otomatik Otomatik Tamamlama - İstek Başına istek göndermenin maliyeti 0,01132 ABD dolarıdır. Bu nedenle, seçilen yer tahminiyle ilgili dört isteğin toplam maliyeti ile birlikte Coğrafi Kodlama API'si çağrısının toplam maliyeti 0,01632 ABD doları olur. Bu da oturum başına 0,017 ABD doları olan Oturum Başına Otomatik Tamamlama fiyatından daha düşüktür.1
Kullanıcılarınızın aradıkları tahmini daha az karakterle bulmalarına yardımcı olmak için performans en iyi uygulamalarından yararlanmayı düşünebilirsiniz.
Hayır
Yer Ayrıntıları ile oturuma dayalı Otomatik Yer Tamamlama özelliğini kullanın.
Bir kullanıcı Otomatik Yer Tamamlama tahminini seçmeden önce gerçekleştirmeyi beklediğiniz ortalama istek sayısı, Oturum Başına fiyatlandırmayı aştığından, Yer Otomatik Tamamlama özelliği hem Otomatik Yer Tamamlama istekleri hem de bununla ilişkili Yer Ayrıntısı isteği için toplam oturum başına 0,017 ABD doları olmak üzere bir oturum jetonu kullanmalıdır.1
Widget uygulaması
Oturum yönetimi JavaScript, Android veya iOS widget'larına otomatik olarak eklenir. Buna hem otomatik Yer Tamamlama istekleri hem de seçilen tahmindeki Yer Ayrıntısı isteği dahildir. Yalnızca Temel Veriler alanlarını istediğinizden emin olmak için fields
parametresini belirttiğinizden emin olun.
Programatik uygulama
Otomatik Yer Tamamlama isteklerinizle bir oturum jetonu kullanın. Seçilen tahmin hakkında Yer Ayrıntıları isterken aşağıdaki parametreleri ekleyin:
- Otomatik Yer Tamamlama yanıtındaki yer kimliği
- Otomatik Yer Tamamlama isteğinde kullanılan oturum jetonu
- Adres ve geometri gibi Temel Veri alanlarını belirten
fields
parametresi
Otomatik Yer Tamamlama isteklerini ertelemeyi düşünün
Otomatik Yer Tamamlama isteğini, kullanıcı ilk üç veya dört karakteri yazana kadar ertelemek gibi stratejiler kullanarak uygulamanızın daha az istek göndermesini sağlayabilirsiniz. Örneğin, kullanıcı üçüncü karakteri yazdıktan sonra her karakter için Otomatik Tamamlama isteklerinde bulunmak, kullanıcı yedi karakteri yazdıktan sonra bir Coğrafi Kodlama API'si isteği gönderdiğiniz bir tahmin seçerse toplam maliyetin 0,01632 ABD doları (4 * 0,00283 ABD doları Otomatik Tamamlama + 0,005 ABD doları Coğrafi Kodlama) olacağı anlamına gelir.1
İstekleri ertelemek ortalama programatik isteğinizin dörtün altına düşmesine neden oluyorsa Geocoding API ile otomatik yer tamamlama performansı uygulama yönergelerinden yararlanabilirsiniz. İsteklerin geciktirilmesinin, her yeni tuş vuruşunda tahmin görmeyi bekleyen kullanıcılar tarafından gecikme olarak algılanabileceğini unutmayın.
Kullanıcılarınızın aradıkları tahmini daha kısa sürede elde etmelerine yardımcı olmak için performansla ilgili en iyi uygulamalardan yararlanabilirsiniz.
-
Burada listelenen maliyetler ABD doları cinsindendir. Tam fiyatlandırma bilgileri için lütfen Google Haritalar Platformu Faturalandırma sayfasına bakın.
Performansla ilgili en iyi uygulamalar
Aşağıdaki yönergelerde Otomatik Yer Tamamlama performansının optimize edilmesi için izlenecek yöntemler açıklanmaktadır:
- Otomatik Yer Tamamlama uygulamanıza ülke kısıtlamaları, konuma ağırlık verme ve (programatik uygulamalar için) dil tercihi ekleyin. Widget'lar dil tercihlerini kullanıcının tarayıcısından veya mobil cihazdan seçtiği için widget'larda dil tercihi yapmanız gerekmez.
- Otomatik Yer Tamamlama'ya bir harita eşlik ediyorsa, konumu harita görünümüne göre değiştirebilirsiniz.
- Kullanıcının Otomatik Tamamlama tahminlerinden birini seçmediği durumlarda, genellikle bu tahminlerden hiçbiri istenen sonuç adresi olmadığından, daha alakalı sonuçlar elde etmek için orijinal kullanıcı girişini yeniden kullanabilirsiniz:
- Kullanıcının yalnızca adres bilgilerini girmesini bekliyorsanız Geocoding API'ye yapılan bir çağrıda orijinal kullanıcı girişini yeniden kullanın.
- Kullanıcının belirli bir yer için ada veya adrese göre sorgu girmesini bekliyorsanız, Yer Bulma isteğini kullanın. Yalnızca belirli bir bölgede sonuç bekleniyorsa konuma ağırlık vermeyi kullanın.
- Şirket içi adresler için Otomatik Yer Tamamlama desteğinin eksik olduğu ülkelerdeki (ör. Çekya, Estonya ve Litvanya) bina alt adreslerini giren kullanıcılar. Örneğin, Çekçedeki "Stroupežnického 3191/17, Praha" adresi, Yer Otomatik Tamamlama'da kısmi bir tahmin verir.
- New York City'de "23-30 29th St, Queens" veya Hawaii'deki Kauai Adası'nda "47-380 Kamehameha Hwy, Kaneohe" gibi yol segmenti ön ekleriyle adresler giren kullanıcılar.
Sorun giderme
Çok çeşitli hatalar ortaya çıkabilse de uygulamanızın karşılaşabileceği hataların çoğu genellikle yapılandırma hatalarından (örneğin, yanlış API anahtarının kullanılması veya API anahtarının yanlış yapılandırılmış olması) veya kota hatalarından (uygulamanızın kotasını aşması) kaynaklanır. Kotalar hakkında daha fazla bilgi için Kullanım Sınırları bölümüne bakın.
Otomatik tamamlama denetimleri kullanılırken ortaya çıkan hatalar, çeşitli yetki protokollerinin didFailAutocompleteWithError()
yönteminde döndürülür. Sağlanan NSError
nesnesinin code
özelliği, GMSPlacesErrorCode
numaralandırmasının değerlerinden birine ayarlandı.