Navigasyon etkinliklerini dinleme

Uygulamanızın, kullanıcı bir rota üzerinde ilerlerken değişen çeşitli etkinlikleri dinlemesini ve bunlara yanıt vermesini sağlamak için bu kılavuzdan yararlanın. Bu kılavuzda rota tanımlama değil, yalnızca bir rota üzerindeki etkinliklere yanıt verme konusu ele alınmaktadır.

Genel Bakış

iOS için Navigation SDK'sı, kullanıcının konumu ve rota üzerindeki koşullarla ilişkili dinleyiciler ile önemli zaman ve mesafe verileri sağlar. Haritanın görünüm denetleyicisinde uygulamanızın şu dinleyiciler için protokolleri benimsemesi gerekir: GMSRoadSnappedLocationProviderListener ve GMSNavigatorListener.

Bu listede, gezinme etkinlikleri için kullanılabilen işleyici yöntemleri gösterilmektedir:

Kodu göster

Gerekli protokollere uygunluk beyan etme

Gezinme yöntemlerini uygulamadan önce görünüm denetleyicisinin aşağıdaki protokolleri kullanması gerekir:

Swift

class ViewController:
  UIViewController,
  GMSNavigatorListener,
  GMSRoadSnappedLocationProviderListener
{
}

Objective-C

@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end

Geçiş protokollerini uyguladıktan sonra dinleyicileri görünüm denetleyicisine ayarlayın. Örneğin, viewDidLoad() yöntemine aşağıdaki kodu ekleyebilirsiniz.

Swift

mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)

Objective-C

[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];

Konum güncellemelerini alma veya durdurma

Kullanıcının haritadaki ilerleme durumunu göstermek için konum güncellemeleri gerekir.

location örneği aşağıdaki özellikleri kullanıma sunar:

Konum özelliği Açıklama
yükseklik Mevcut yükseklik.
coordinate.latitude Mevcut yola sabitlenmiş enlem koordinatı.
coordinate.longitude Yola sabitlenmiş mevcut boylam koordinatı.
kurs Mevcut yön, derece cinsinden.
hız Şu anki hız.
timestamp Mevcut okumanın tarihi/saati.

Sürekli konum güncellemeleri almak için mapView.roadSnappedLocationProvider.startUpdatingLocation işlevini çağırın ve didUpdateLocation etkinliğini işlemek için GMSRoadSnappedLocationProviderListener işlevini kullanın.

Aşağıdaki örnekte startUpdatingLocation işlevinin çağrılması gösterilmektedir:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

Aşağıdaki kod, didUpdateLocation etkinliğini işleyen bir GMSRoadSnappedLocationProviderListener oluşturur.

Swift

func locationProvider(_ locationProvider: GMSRoadSnappedLocationProvider,
                      didUpdate location: CLLocation) {
  print("Location: \(location.description)")
}

Objective-C

- (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider
       didUpdateLocation:(CLLocation *)location {
  NSLog(@"Location: %@", location.description);
}

Uygulama arka plandayken konum güncellemeleri almak için allowsBackgroundLocationUpdates değerini true olarak ayarlayın:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Varış etkinliklerini algılama

Uygulamanız, bir hedefe ne zaman ulaşıldığını algılamak için didArriveAtWaypoint etkinliğini kullanıyor. continueToNextDestinationWithCompletion() tuşuna basıp rehberliği yeniden etkinleştirerek rehberliğe devam edebilir ve sonraki yol noktasına geçebilirsiniz. Uygulamanız, arama yapıldıktan sonra rehberliği yeniden etkinleştirmelidir continueToNextDestinationWithCompletion().

Uygulama continueToNextDestinationWithCompletion işlevini çağırdıktan sonra gezinme aracı artık önceki hedefle ilgili verilere sahip olmaz. Bir rota ayağıyla ilgili bilgileri analiz etmek istiyorsanız continueToNextDestinationWithCompletion() işlevini çağırmadan önce bu bilgileri navigatörden almanız gerekir.

Aşağıdaki kod örneğinde, didArriveAtWaypoint etkinliğinin nasıl işleneceği gösterilmektedir:

Swift

func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSNavigationWaypoint) {
  print("You have arrived at: \(waypoint.title)")
  mapView.navigator?.continueToNextDestinationWithCompletion { _, _ in }
  mapView.navigator?.isGuidanceActive = true
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint {
  NSLog(@"You have arrived at: %@", waypoint.title);
  [_mapView.navigator continueToNextDestinationWithCompletion:^(GMSNavigationWaypoint *waypoint,
                                                                GMSRouteStatus status){
  }];
  _mapView.navigator.guidanceActive = YES;
}

Rota değişikliği güncellemelerini alma

Rota her değiştirildiğinde bildirim almak için navigatorDidChangeRoute etkinliğini işleyecek bir yöntem oluşturun. GMSNavigator'nin routeLegs ve currentRouteLeg özelliklerini kullanarak yeni rotaya erişebilirsiniz.

Swift

func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
  print("The route has changed.")
}

Objective-C

- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
  NSLog(@"The route has changed.");
}

Hedefe varış zamanı güncellemelerini alma

Varış zamanıyla ilgili sürekli güncellemeler almak için didUpdateRemainingTime etkinliğini işleyecek bir yöntem oluşturun. time parametresi, bir sonraki hedefe ulaşılana kadar geçen tahmini süreyi (saniye cinsinden) sağlar.

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingTime time: TimeInterval) {
  print("Time to next destination: \(time)")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator didUpdateRemainingTime:(NSTimeInterval)time {
  NSLog(@"Time to next destination: %f", time);
}

Tahmini süredeki minimum değişikliği bir sonraki varış noktasına ayarlamak için timeUpdateThreshold özelliğini GMSNavigator olarak ayarlayın. Değer saniye cinsinden belirtilir. Bu özellik ayarlanmamışsa hizmetler bir saniyelik varsayılan değeri kullanır.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Hedefe olan mesafeyle ilgili güncellemeleri alma

Hedefe olan mesafeyle ilgili sürekli güncellemeler almak için didUpdateRemainingDistance etkinliğini işleyecek bir yöntem oluşturun. distance parametresi, bir sonraki hedefe olan tahmini mesafeyi metre cinsinden sağlar.

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistance distance: CLLocationDistance)
{
  let miles = distance * 0.00062137
  print("Distance to next destination: \(miles) miles.")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator
    didUpdateRemainingDistance:(CLLocationDistance)distance {
  double miles = distance * 0.00062137;
  NSLog(@"%@", [NSString stringWithFormat:@"Distance to next destination: %.2f.", miles]);
}

Tahmini mesafede bir sonraki hedefe ulaşmak için minimum değişikliği ayarlamak üzere GMSNavigator üzerinde distanceUpdateThreshold özelliğini ayarlayın (değer metre cinsinden belirtilir). Bu özellik ayarlanmamışsa hizmetler varsayılan olarak bir metre değerini kullanır.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Trafik güncellemeleri alma

Rotanın geri kalan kısmındaki trafik akışıyla ilgili sürekli güncellemeler almak için didUpdateDelayCategory etkinliğini işleyecek bir yöntem oluşturun. delayCategoryToNextDestination işlevine yapılan bir çağrı, 0 ile 3 arasında bir değer sağlayan GMSNavigationDelayCategory değerini döndürür. Kategorideki güncellemeler, uygulama kullanıcısının mevcut konumuna göre yapılır. Trafik verileri kullanılamıyorsa GMSNavigationDelayCategory 0 değerini döndürür. 1-3 arasındaki sayılar, akışın hafiften şiddetliye doğru arttığını gösterir.

Swift

func navigator(_ navigator: GMSNavigator,
               didUpdate delayCategory: GMSNavigationDelayCategory)
{
  print("Traffic flow to next destination: \(delayCategory)")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator
    didUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {
  NSLog(@"Traffic flow to next destination: %ld", (long)delayCategory);
}

GMSNavigationDelayCategory özelliği aşağıdaki gecikme düzeylerini gösterir:

Gecikme kategorisi Açıklama
GMSNavigationDelayCategoryNoData 0 - Kullanılamıyor, trafik veya :
rotayı seçin.
GMSNavigationDelayCategoryHeavy 1 - Yoğun.
GMSNavigationDelayCategoryMedium 2 - Orta
GMSNavigationDelayCategoryLight 3 - Açık

Hızla ilgili güncellemeler alma

Sürücü hız sınırını aştığında güncelleme almak için didUpdateSpeedingPercentage etkinliğini işleyecek bir yöntem oluşturun.

Swift

// Listener to handle speeding events.
func navigator(_ navigator: GMSNavigator,
               didUpdateSpeedingPercentage percentageAboveLimit: CGFloat)
{
  print("Speed is \(percentageAboveLimit) above the limit.")
}

Objective-C

// Listener to handle speeding events.
- (void)navigator:(GMSNavigator *)navigator
    didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit {
  NSLog(@"Speed is %f percent above the limit.", percentageAboveLimit);
}

Önerilen ışıklandırma modunu değiştirme

GMSNavigator Günün saatine ve cihazın konumuna göre önerilen aydınlatma modunu hesaplar ve önerilen mod değiştiğinde (ör. gün doğumu veya gün batımında) yalnızca didChangeSuggestedLightingMode dinleyici yöntemini çağırır. Haritanın, kullanıcı uygulamanızı başlattığında uygun aydınlatma moduyla başlamasını sağlamak için başlatma sırasında mapView.lightingMode'ı navigasyon cihazının suggestedLightingMode olarak ayarlayın ve sonraki değişiklikleri işlemek için didChangeSuggestedLightingMode'ı uygulayın.

Aşağıdaki örnekte, ilk ışıklandırma modunun nasıl ayarlanacağı ve önerilen ışıklandırma modu değişikliklerinin nasıl dinleneceği gösterilmektedir:

Swift

// Set the initial lighting mode on launch or setup.
mapView.lightingMode = mapView.navigator?.suggestedLightingMode ?? .normal

// Define a listener for suggested changes to lighting mode.
func navigator(_ navigator: GMSNavigator,
               didChangeSuggestedLightingMode lightingMode: GMSNavigationLightingMode)
{
  print("Suggested lighting mode has changed: \(String(describing: lightingMode))")

  // Make the suggested change.
  mapView.lightingMode = lightingMode
}

Objective-C

// Set the initial lighting mode on launch or setup.
_mapView.lightingMode = _mapView.navigator.suggestedLightingMode;

// Define a listener for suggested changes to lighting mode.
- (void)navigator:(GMSNavigator *)navigator
    didChangeSuggestedLightingMode:(GMSNavigationLightingMode)lightingMode {
  NSLog(@"Suggested lighting mode has changed: %ld", (long)lightingMode);

  // Make the suggested change.
  _mapView.lightingMode = lightingMode;
}

Otomatik ve manuel aydınlatma modu yapılandırması hakkında daha fazla bilgi için Normal ve düşük ışık modlarını yapılandırma başlıklı makaleyi inceleyin.