경로 탐색

이 가이드에 따라 iOS용 Navigation SDK를 사용하여 앱 내에서 단일 목적지까지의 경로를 표시하세요.

개요

  1. 프로젝트 설정 섹션에 설명된 대로 Navigation SDK를 앱에 통합합니다.
  2. GMSMapView를 구성합니다.
  3. 사용자에게 이용약관에 동의하고 위치 서비스 및 백그라운드 알림을 승인하라는 메시지를 표시합니다.
  4. 하나 이상의 목적지가 포함된 배열을 만듭니다.
  5. GMSNavigator를 정의하여 세부 경로 안내 내비게이션을 제어합니다.

코드 보기

사용자에게 필요한 승인 요청

Navigation SDK를 사용하려면 사용자가 이용약관에 동의하고 내비게이션에 필요한 위치 서비스 사용을 승인해야 합니다. 앱이 백그라운드에서 실행되는 경우 사용자에게 경로 안내 알림을 승인하라는 메시지도 표시해야 합니다. 이 섹션에서는 필수 승인 메시지를 표시하는 방법을 보여줍니다.

위치 서비스 승인

Navigation SDK는 위치 서비스를 사용하므로 사용자 승인이 필요합니다. 위치 서비스를 사용 설정하고 승인 대화상자를 표시하려면 다음 단계를 따르세요.

  1. Xcode에서 위치 및 백그라운드 기능을 사용 설정합니다.

    1. Xcode에서 타겟을 열고 서명 및 기능 탭을 선택합니다. 자세한 내용은 앱에 기능 추가에 관한 Apple 가이드를 참고하세요.
    2. Location (Always) 및 Location (When In Use) 기능을 추가합니다. 각 텍스트 필드에 앱에서 위치 서비스가 필요한 이유를 간단히 설명합니다 (예: '이 앱은 세부 경로 안내 내비게이션을 위해 위치 서비스를 사용할 권한이 필요합니다').
    3. 백그라운드 모드 기능을 추가한 다음 위치 업데이트 체크박스를 선택합니다. 이 기능이 없으면 내비게이션을 시작할 때 앱이 비정상 종료됩니다. 자세한 내용은 백그라운드에서 위치 업데이트 처리에 관한 Apple 가이드를 참고하세요.
  2. 승인 대화상자를 표시하려면 위치 관리자 인스턴스의 requestAlwaysAuthorization() 메서드를 호출합니다.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

위치 서비스 승인에 관한 전체 Apple 문서 보기

백그라운드 안내를 위한 알림 승인

Navigation SDK는 앱이 백그라운드에서 실행 중일 때 알림을 제공하기 위해 사용자 권한이 필요합니다. 다음 코드를 추가하여 사용자에게 이러한 알림을 표시할 권한을 요청합니다.

Swift

UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
  granted, error in
    // Handle denied authorization to display notifications.
    if !granted || error != nil {
      print("User rejected request to display notifications.")
    }
}

Objective-C

// Request authorization for alert notifications.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions options = UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:options
                      completionHandler:
 ^(
   BOOL granted,
   NSError *_Nullable error) {
     if (!error && granted) {
       NSLog(@"iOS Notification Permission: newly Granted");
     } else {
       NSLog(@"iOS Notification Permission: Failed or Denied");
     }
   }];

움직임 감지 센서 승인

향후 주요 출시 버전에서 iOS용 Navigation SDK는 핵심 위치 데이터를 기기 움직임 감지 센서 (CMAltimeter)와 결합하여 경로 고도를 계산합니다. SDK가 고도계에 액세스하면 iOS는 이 문자열을 자동으로 사용하여 사용자에게 권한을 요청합니다.

지금 이 키를 추가해도 현재 동작에는 영향을 미치지 않지만 나중에 SDK를 업그레이드할 때 초기화 비정상 종료가 방지됩니다.

SDK의 향후 업그레이드를 준비하려면 다음과 같이 움직임 감지 센서 승인을 구성합니다.

  1. Xcode에서 타겟을 열고 정보 탭으로 이동하거나 Info.plist 파일을 엽니다.

  2. 새 키 Privacy - Motion Usage Description(NSMotionUsageDescription)을 추가합니다.

  3. 사용자에게 간단한 설명을 추가합니다. 예: '이 앱은 고도를 계산하고 지도 경로의 정확성을 개선하기 위해 움직임 감지 센서 액세스가 필요합니다.'

이용약관에 동의합니다.

다음 코드를 사용하여 이용약관 대화상자를 표시하고 사용자가 약관에 동의하면 내비게이션을 사용 설정합니다. 이 예에는 위치 서비스 및 안내 알림 (이전에 표시됨)의 코드가 포함되어 있습니다.

Swift

  let termsAndConditionsOptions = GMSNavigationTermsAndConditionsOptions(companyName: "Ride Sharing Co.")

  GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
    with: termsAndConditionsOptions) { termsAccepted in
    if termsAccepted {
      // Enable navigation if the user accepts the terms.
      self.mapView.isNavigationEnabled = true
      self.mapView.settings.compassButton = true

      // Request authorization to use location services.
      self.locationManager.requestAlwaysAuthorization()

      // Request authorization for alert notifications which deliver guidance instructions
      // in the background.
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
      granted, error in
        // Handle rejection of notification authorization.
        if !granted || error != nil {
          print("Authorization to deliver notifications was rejected.")
        }
      }
    } else {
      // Handle rejection of terms and conditions.
    }
  }

Objective-C

GMSNavigationTermsAndConditionsOptions *termsAndConditionsOptions = [[GMSNavigationTermsAndConditionsOptions alloc] initWithCompanyName:@"Ride Sharing Co."];

[GMSNavigationServices
  showTermsAndConditionsDialogIfNeededWithOptions:termsAndConditionsOptions
  callback:^(BOOL termsAccepted) {
   if (termsAccepted) {
     // Enable navigation if the user accepts the terms.
     _mapView.navigationEnabled = YES;
     _mapView.settings.compassButton = YES;

     // Request authorization to use the current device location.
     [_locationManager requestAlwaysAuthorization];

     // Request authorization for alert notifications which deliver guidance instructions
     // in the background.
     UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
     UNAuthorizationOptions options = UNAuthorizationOptionAlert;
     [center requestAuthorizationWithOptions:options
                           completionHandler:
     ^(
       BOOL granted,
       NSError *_Nullable error) {
         if (!error && granted) {
           NSLog(@"iOS Notification Permission: newly Granted");
         } else {
           NSLog(@"iOS Notification Permission: Failed or Denied");
         }
       }];
   } else {
     // Handle rejection of the terms and conditions.
   }
 }];

경로를 만들고 안내 시작하기

경로를 표시하려면 방문할 하나 이상의 GMSNavigationWaypoint 목적지 배열을 사용하여 내비게이터의 setDestinations 메서드를 호출합니다. 경로가 성공적으로 계산되면 지도에 표시됩니다. 경로를 따라 안내를 시작하려면 콜백에서 isGuidanceActive를 true로 설정합니다.

다음 예시는 다음과 같은 기능을 보여줍니다.

  • 목적지가 하나인 새 경로를 만듭니다.
  • 안내를 시작합니다.
  • 백그라운드 안내 알림 사용 설정
  • 경로를 따라 이동 시뮬레이션 (선택사항)
  • 카메라 모드를 '팔로우'로 설정(선택사항)

Swift

func startNav() {
  var destinations = [GMSNavigationWaypoint]()
  destinations.append(GMSNavigationWaypoint.init(placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk",
                                                 title: "PCC Natural Market")!)

  mapView.navigator?.setDestinations(destinations) { routeStatus in
    self.mapView.navigator?.isGuidanceActive = true
    self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
    self.mapView.cameraMode = .following
  }
}

Objective-C

- (void)startNav {
  NSArray<GMSNavigationWaypoint *> *destinations =
  @[[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJnUYTpNASkFQR_gSty5kyoUk"
                                             title:@"PCC Natural Market"]];

  [_mapView.navigator setDestinations:destinations
                             callback:^(GMSRouteStatus routeStatus){
                               [_mapView.locationSimulator simulateLocationsAlongExistingRoute];
                               _mapView.navigator.guidanceActive = YES;
                               _mapView.cameraMode = GMSNavigationCameraModeFollowing;
                             }];
}

장소 ID에 대해 알아보려면 장소 ID를 참고하세요.

여러 경유지 시나리오

경유지는 최대 25개까지 구성할 수 있습니다.

setDestinations 메서드는 여러 경유지가 있는 여정을 지원하지 않습니다. continueToNextDestinationWithCompletion()를 사용하여 경유지를 여정의 다음 구간으로 진행합니다.

이동 모드 설정

이동 수단은 가져올 경로 유형과 사용자의 경로를 결정하는 방법을 모두 정의합니다. 경로에 운전, 자전거, 도보, 택시의 네 가지 이동 수단 중 하나를 설정할 수 있습니다. 운전 및 택시 모드에서 사용자의 경로는 이동 방향을 기반으로 합니다. 자전거 및 도보 모드에서 경로는 기기가 향하는 방향 (가로 모드에서 기기 상단 방향)으로 표시됩니다.

다음 예와 같이 지도 뷰의 travelMode 속성을 설정합니다.

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

피해야 할 도로 설정

avoidsHighways 및 avoidsTolls BOOL 속성을 사용하여 경로에서 고속도로, 유료 도로 또는 둘 다를 피합니다.

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

오디오 안내 볼륨 설정하기

음성 안내 볼륨을 조정하려면 내비게이터의 volumeLevel 속성을 낮음, 보통 또는 높음으로 설정합니다. 내비게이터는 마지막으로 유지된 볼륨 수준을 사용하거나 기본적으로 보통으로 설정됩니다.

Swift

self.mapView.navigator?.volumeLevel = .low

Objective-C

_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;

장소 ID 찾기

장소 ID 찾기 도구를 사용하여 경로 목적지에 사용할 장소 ID를 찾을 수 있습니다. GMSNavigationWaypoint를 사용하여 placeID에서 대상을 추가합니다.

플로팅 텍스트

Google 저작자 표시를 가리지 않는 한 앱의 어느 위치에나 플로팅 텍스트를 추가할 수 있습니다. Navigation SDK는 지도의 특정 좌표 (위도, 경도) 또는 라벨에 텍스트를 고정하는 것을 지원하지 않습니다. 자세한 내용은 정보 창을 참고하세요.