이 가이드에 따라 iOS용 Navigation SDK를 사용하여 앱 내에서 단일 목적지까지의 경로를 표시하세요.
개요
- 프로젝트 설정 섹션에 설명된 대로 탐색 SDK를 앱에 통합합니다.
GMSMapView
를 구성합니다.- 사용자에게 이용약관에 동의하고 위치 서비스와 백그라운드 알림을 승인하라는 메시지를 표시합니다.
- 하나 이상의 대상을 포함하는 배열을 만듭니다.
GMSNavigator
를 정의하여 내비게이션 세부 경로 안내를 제어합니다.setDestinations
을 사용하여 대상을 추가합니다.isGuidanceActive
을true
로 설정하여 내비게이션을 시작합니다.simulateLocationsAlongExistingRoute
를 사용하여 테스트, 디버깅, 앱 데모를 위해 경로를 따라 차량의 진행 상황을 시뮬레이션합니다.
코드 보기
사용자에게 필요한 승인 요청
사용자는 탐색 SDK를 사용하기 전에 이용약관에 동의하고 탐색에 필요한 위치 서비스 사용을 승인해야 합니다. 앱이 백그라운드에서 실행되는 경우 사용자에게 안내 알림을 승인하라는 메시지도 표시해야 합니다. 이 섹션에서는 필요한 승인 메시지를 표시하는 방법을 보여줍니다.
위치 서비스 승인
Navigation SDK는 위치 서비스를 사용하며, 이 서비스에는 사용자 승인이 필요합니다. 위치 서비스를 사용 설정하고 승인 대화상자를 표시하려면 다음 단계를 따르세요.
NSLocationAlwaysUsageDescription
키를Info.plist
에 추가합니다.값에는 앱에 위치 서비스가 필요한 이유를 간략하게 설명합니다. 예: '이 앱은 경로 안내를 위해 위치 서비스를 사용할 수 있는 권한이 필요합니다.'
승인 대화상자를 표시하려면 위치 관리자 인스턴스의
requestAlwaysAuthorization()
를 호출합니다.
Swift
self.locationManager.requestAlwaysAuthorization()
Objective-C
[_locationManager requestAlwaysAuthorization];
백그라운드 안내를 위한 알림 승인
앱이 백그라운드에서 실행될 때 알림을 제공하려면 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");
}
}];
이용약관에 동의
다음 코드를 사용하여 약관 대화상자를 표시하고 사용자가 약관에 동의하면 탐색을 사용 설정합니다. 이 예에는 위치 서비스와 안내 경고 알림 (이전에 표시됨) 코드가 포함되어 있습니다.
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
)이 포함된 배열을 사용하여 Navigator의 setDestinations()
메서드를 호출합니다. 계산에 성공하면 경로가 지도에 표시됩니다. 첫 번째 목적지부터 시작하여 경로를 따라 안내를 시작하려면 콜백에서 isGuidanceActive
을 true
로 설정합니다.
다음 예시는 다음과 같은 기능을 보여줍니다.
- 두 개의 목적지가 있는 새 경로를 만듭니다.
- 안내를 시작합니다.
- 백그라운드 안내 알림을 사용 설정합니다.
- 경로를 따라 이동하는 시뮬레이션 (선택사항)
- 카메라 모드를 '따라가기'로 설정합니다(선택사항).
Swift
func startNav() {
var destinations = [GMSNavigationWaypoint]()
destinations.append(GMSNavigationWaypoint.init(placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk",
title: "PCC Natural Market")!)
destinations.append(GMSNavigationWaypoint.init(placeID:"ChIJJ326ROcSkFQRBfUzOL2DSbo",
title:"Marina Park")!)
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"],
[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJJ326ROcSkFQRBfUzOL2DSbo"
title:@"Marina Park"]];
[_mapView.navigator setDestinations:destinations
callback:^(GMSRouteStatus routeStatus){
[_mapView.locationSimulator simulateLocationsAlongExistingRoute];
_mapView.navigator.guidanceActive = YES;
_mapView.cameraMode = GMSNavigationCameraModeFollowing;
}];
}
장소 ID에 대해 알아보려면 장소 ID를 참고하세요.
이동 수단 설정
이동 모드는 가져올 경로의 유형과 사용자의 경로가 결정되는 방식을 결정합니다. 경로에 대해 운전, 자전거, 도보, 택시의 4가지 이동 모드 중 하나를 설정할 수 있습니다. 운전 및 택시 모드에서는 사용자의 경로가 이동 방향을 기반으로 합니다. 자전거 및 도보 모드에서는 경로가 기기가 향하는 방향 (가로 모드에서 기기 상단)으로 표시됩니다.
다음 예와 같이 지도 뷰의 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;
PlaceID 찾기
PlaceID Finder를 사용하여 경로 목적지에 사용할 장소 ID를 찾을 수 있습니다. GMSNavigationWaypoint
가 있는 placeID
에서 대상을 추가합니다.
플로팅 텍스트
Google 저작자 표시가 가려지지 않는 한 앱의 어느 곳에나 플로팅 텍스트를 추가할 수 있습니다. Navigation SDK는 지도상의 위도/경도 또는 라벨에 텍스트를 고정하는 기능을 지원하지 않습니다. 자세한 내용은 정보 창을 참고하세요.