탐색 이벤트 리슨

이 가이드를 사용하여 사용자가 경로를 따라 이동할 때 변경되는 다양한 이벤트를 앱에서 수신 대기하고 응답하도록 설정하세요. 이 가이드에서는 경로를 정의하는 방법을 다루지 않으며 경로를 따라 발생하는 이벤트에 응답하는 방법만 다룹니다.

개요

iOS용 Navigation SDK는 사용자의 위치, 경로를 따라가는 조건, 중요한 시간 및 거리 데이터와 관련된 리스너를 제공합니다. 지도의 뷰 컨트롤러에서 앱은 GMSRoadSnappedLocationProviderListener 및 GMSNavigatorListener 리스너의 프로토콜을 채택해야 합니다.

이 목록에는 탐색 이벤트에 사용할 수 있는 리스너 메서드가 표시됩니다.

코드 보기

필수 프로토콜 준수 선언

탐색 메서드를 구현하기 전에 뷰 컨트롤러는 프로토콜을 채택해야 합니다.

Swift

class ViewController:
  UIViewController,
  GMSNavigatorListener,
  GMSRoadSnappedLocationProviderListener
{
}

Objective-C

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

탐색 프로토콜을 채택한 후 리스너를 뷰 컨트롤러로 설정합니다. 예를 들어 viewDidLoad() 메서드에 다음 코드를 추가할 수 있습니다.

Swift

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

Objective-C

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

위치 업데이트 수신 또는 중지

지도에 사용자의 진행 상황을 표시하려면 위치 업데이트가 필요합니다.

location 인스턴스는 다음 속성을 노출합니다.

위치 속성 설명
고도 현재 고도입니다.
coordinate.latitude 현재 도로에 스냅된 위도 좌표입니다.
coordinate.longitude 현재 도로에 스냅된 경도 좌표입니다.
강의 현재 방위(도)입니다.
속도 현재 속도입니다.
타임스탬프 현재 측정값의 날짜/시간입니다.

지속적인 위치 업데이트를 받으려면 mapView.roadSnappedLocationProvider.startUpdatingLocation를 호출하고 GMSRoadSnappedLocationProviderListener를 사용하여 didUpdateLocation 이벤트를 처리합니다.

다음은 startUpdatingLocation를 호출하는 예를 보여줍니다.

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

다음 코드는 didUpdateLocation 이벤트를 처리하는 GMSRoadSnappedLocationProviderListener를 만듭니다.

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);
}

앱이 백그라운드에 있을 때 위치 업데이트를 받으려면 allowsBackgroundLocationUpdates를 true로 설정합니다.

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

도착 이벤트 감지

앱은 didArriveAtWaypoint 이벤트를 사용하여 목적지에 도달한 시점을 감지합니다. continueToNextDestinationWithCompletion()를 호출한 후 안내를 다시 사용 설정하여 안내를 재개하고 다음 경유지로 이동할 수 있습니다. 앱은 continueToNextDestinationWithCompletion()를 호출한 후 안내를 다시 사용 설정해야 합니다.

앱이 continueToNextDestinationWithCompletion를 호출한 후에는 내비게이터에 더 이상 이전 목적지에 관한 데이터가 없습니다. 경로 구간에 대한 정보를 분석하려면 continueToNextDestinationWithCompletion()를 호출하기 전에 내비게이터에서 이 정보를 가져와야 합니다.

다음 코드 예는 didArriveAtWaypoint 이벤트를 처리하는 메서드를 보여줍니다.

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;
}

경로 변경 업데이트 수신

경로가 변경될 때마다 알림을 받으려면 navigatorDidChangeRoute 이벤트를 처리하는 메서드를 만듭니다. GMSNavigator의 routeLegs 및 currentRouteLeg 속성을 사용하여 새 경로에 액세스할 수 있습니다.

Swift

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

Objective-C

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

목적지까지 걸리는 시간 업데이트 받기

목적지까지의 시간 업데이트를 지속적으로 받으려면 didUpdateRemainingTime 이벤트를 처리하는 메서드를 만듭니다. time 매개변수는 다음 목적지에 도달할 때까지의 예상 시간(초)을 제공합니다.

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);
}

다음 목적지까지의 예상 시간의 최소 변경사항을 설정하려면 GMSNavigator에서 timeUpdateThreshold 속성을 설정합니다. 값은 초 단위로 지정됩니다. 이 속성을 설정하지 않으면 서비스는 기본값인 1초를 사용합니다.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

목적지까지의 거리 업데이트 받기

목적지까지의 거리를 지속적으로 업데이트하려면 didUpdateRemainingDistance 이벤트를 처리하는 메서드를 만듭니다. distance 매개변수는 다음 목적지까지의 예상 거리(미터)를 제공합니다.

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]);
}

다음 목적지까지의 예상 거리의 최소 변경사항을 설정하려면 GMSNavigator에서 distanceUpdateThreshold 속성을 설정합니다 (값은 미터 단위로 지정됨). 이 속성을 설정하지 않으면 서비스에서 기본값인 1미터를 사용합니다.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

교통정보 업데이트 받기

남은 경로의 교통 흐름에 대한 지속적인 업데이트를 받으려면 didUpdateDelayCategory 이벤트를 처리하는 메서드를 만듭니다. delayCategoryToNextDestination를 호출하면 0~3의 값을 제공하는 GMSNavigationDelayCategory가 반환됩니다. 카테고리 업데이트는 앱 사용자의 현재 위치를 기반으로 합니다. 트래픽 데이터를 사용할 수 없는 경우 GMSNavigationDelayCategory은 0을 반환합니다. 1~3의 숫자는 생리 양이 적음에서 많음으로 증가함을 나타냅니다.

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 속성은 다음과 같은 지연 수준을 노출합니다.

지연 카테고리 설명
GMSNavigationDelayCategoryNoData 0 - 사용할 수 없음, 트래픽 데이터 없음 또는 :
경로를 업데이트합니다.
GMSNavigationDelayCategoryHeavy 1 - 많음
GMSNavigationDelayCategoryMedium 2 - 보통
GMSNavigationDelayCategoryLight 3 - 가벼움

과속 업데이트 수신

운전자가 제한 속도를 초과할 때 업데이트를 받으려면 didUpdateSpeedingPercentage 이벤트를 처리하는 메서드를 만듭니다.

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);
}

추천 조명 모드 변경

GMSNavigator는 시간과 기기 위치를 기반으로 추천 조명 모드를 계산하고 추천 모드가 변경될 때만 (예: 일출 또는 일몰 시) didChangeSuggestedLightingMode 리스너 메서드를 호출합니다. 사용자가 앱을 실행할 때 지도가 적절한 조명 모드로 시작되도록 하려면 초기화 중에 mapView.lightingMode를 내비게이터의 suggestedLightingMode로 설정하고 didChangeSuggestedLightingMode를 구현하여 이후 변경사항을 처리합니다.

다음 예에서는 초기 조명 모드를 설정하고 추천 조명 모드 변경사항을 수신 대기하는 방법을 보여줍니다.

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;
}

자동 및 수동 조명 모드 구성에 관한 자세한 내용은 일반 및 저조도 모드 구성을 참고하세요.