주행 전 설정하기 링크 복사
출발지, 경유지 및 목적지 설정과 차량 정보, 원하는 경로 옵션 등 주행 전에 필요한 정보를 설정합니다.
1. 출발지 및 목적지 설정하기 링크 복사
출발지와 목적지를 설정하여 주행 경로를 생성합니다. iOS 길찾기 UI SDK는 카텍(KATEC) 좌표계를 사용하여 위도와 경도를 표시합니다. 경로 요청 시 원하는 설정을 추가하여 경로 맞춤 요청을 사용할 수 있습니다.
KNRouteConfiguration
을 생성하여 KNTrip
에 할당하면, 해당 정보를 바탕으로 경로를 요청합니다. 다음과 같은 항목들을 설정할 수 있습니다.
주소 값은 선택 사항이며 위도/경도 값과 주소 값이 다를 경우 위도/경도 값을 우선으로 안내합니다.
// 출발지 설정
KNPOI *start = [[KNPOI alloc] initWithName:name x:longitude y:latitude address:address];
// 목적지 설정
KNPOI *goal = [[KNPOI alloc] initWithName:name x:longitude y:latitude address:address];
// 경로 생성
KNTrip *trip = [KNSDK.sharedInstance makeTripWithStart:start goal:goal vias:vias];
// 출발지 설정
KNPOI *start = [[KNPOI alloc] initWithName:name x:longitude y:latitude address:address];
// 목적지 설정
KNPOI *goal = [[KNPOI alloc] initWithName:name x:longitude y:latitude address:address];
// 경로 생성
KNTrip *trip = [KNSDK.sharedInstance makeTripWithStart:start goal:goal vias:vias];
2. 경로 생성하기 링크 복사
KNSDK
의 makeTripWithStart
함수를 통해 목적지까지의 경로를 생성합니다.
[[KNSDK sharedInstance] makeTripWithStart:start goal:goal vias:vias completion:^(KNError * aError, KNTrip * aTrip) {
if(aError)
{
// 경로 생성 실패
}
else
{
// 경로 생성 성공
}
}];
[[KNSDK sharedInstance] makeTripWithStart:start goal:goal vias:vias completion:^(KNError * aError, KNTrip * aTrip) {
if(aError)
{
// 경로 생성 실패
}
else
{
// 경로 생성 성공
}
}];
3. 상세 정보 설정하기 링크 복사
보다 정확한 길 안내를 위해 차량의 종류, 하이패스 장착 여부, 교통사고 또는 공사 등으로 인한 도로 통행 제한 정보(이하 유고 정보) 반영 여부 등을 설정합니다.
KNRouteConfiguration
클래스를 통해 상세 정보를 설정할 수 있습니다.
KNRouteConfiguration *routeConfig = [[KNRouteConfiguration alloc] initWithCarType:carType usage:usage useHipass:useHipass ignoreTrafficControl:ignoreTrafficControl];
[trip setRouteConfig:routeConfig];
KNRouteConfiguration *routeConfig = [[KNRouteConfiguration alloc] initWithCarType:carType usage:usage useHipass:useHipass ignoreTrafficControl:ignoreTrafficControl];
[trip setRouteConfig:routeConfig];
4. 경로 옵션 설정하기 링크 복사
목적지까지의 여러가지 경로 옵션 중에서 원하는 경로를 선택합니다. KNRoutePriority
클래스를 통해 경로 옵션을 설정할 수 있습니다.
// 경로 옵션 설정
KNRoutePriority routePriority = routePriority;
// 경로 옵션 설정
KNRoutePriority routePriority = routePriority;
5. 경로 회피 옵션 설정하기 링크 복사
목적지까지의 여러가지 경로 회피 옵션 중에서 원하는 경로를 선택합니다. KNRouteAvoidOption
클래스를 통해 경로 옵션을 설정할 수 있습니다.
// 경로 옵션 설정
KNRouteAvoidOption routeAvoidOption = routeAvoidOption;
// 경로 옵션 설정
KNRouteAvoidOption routeAvoidOption = routeAvoidOption;
예를 들어, 추천 경로로 경로를 안내하되 유고 정보 구간과 교통 약자 보호 구간을 경로에서 회피하고 싶다면, 아래와 같이 값을 할당하면 됩니다.
// 추천 경로 안내, 유고 정보 구간과 교통 약자 보호 구간 회피
routePriority = KNRoutePriority_Recommand;
routeAvoidOption = KNRouteAvoidOption_RoadEvent | KNRouteAvoidOption_SZone;
// 추천 경로 안내, 유고 정보 구간과 교통 약자 보호 구간 회피
routePriority = KNRoutePriority_Recommand;
routeAvoidOption = KNRouteAvoidOption_RoadEvent | KNRouteAvoidOption_SZone;
길 안내하기 링크 복사
선택한 옵션들을 바탕으로 routeWithPriority
함수를 통해 경로를 요청하고 요청 성공 시 길 안내를 시작합니다.
경로 요청 시 사용자가 직접 델리게이트 값을 입력하여 자신의 서비스에 맞게 맞춤 설정할 수 있습니다. 입력한 델리게이트 값은 naviView
로 전달해야 합니다.
// 경로 요청
[aTrip routeWithPriority:routePriority avoidOptions:routeAvoidOption completion:^(KNError * _Nullable aError, NSArray<KNRoute *> * _Nullable aRoutes) {
if(aError)
{
// 경로 요청 실패
}
else
{
// 경로 요청 성공
KNGuidance *guidance = [[KNSDK sharedInstance] sharedGuidance];
// 각 가이던스 델리게이트 등록
guidance.guideStateDelegate = self;
guidance.routeGuideDelegate = self;
guidance.voiceGuideDelegate = self;
guidance.safetyGuideDelegate = self;
guidance.locationGuideDelegate = self;
guidance.citsGuideDelegate = self;
// 주행 UI 생성
KNNaviView *naviView = [[KNNaviView alloc] initWithGuidance:guidance trip:nil routeOption:routePriority avoidOption:routeAvoidOption];
naviView.frame = self.bounds;
naviView.guideStateDelegate = self;
naviView.stateDelegate = self;
[naviView sndVolume:volume];
[self addSubview:naviView];
}
}];
// 경로 요청
[aTrip routeWithPriority:routePriority avoidOptions:routeAvoidOption completion:^(KNError * _Nullable aError, NSArray<KNRoute *> * _Nullable aRoutes) {
if(aError)
{
// 경로 요청 실패
}
else
{
// 경로 요청 성공
KNGuidance *guidance = [[KNSDK sharedInstance] sharedGuidance];
// 각 가이던스 델리게이트 등록
guidance.guideStateDelegate = self;
guidance.routeGuideDelegate = self;
guidance.voiceGuideDelegate = self;
guidance.safetyGuideDelegate = self;
guidance.locationGuideDelegate = self;
guidance.citsGuideDelegate = self;
// 주행 UI 생성
KNNaviView *naviView = [[KNNaviView alloc] initWithGuidance:guidance trip:nil routeOption:routePriority avoidOption:routeAvoidOption];
naviView.frame = self.bounds;
naviView.guideStateDelegate = self;
naviView.stateDelegate = self;
[naviView sndVolume:volume];
[self addSubview:naviView];
}
}];
아래의 델리게이트 정보를 참고하여 naviView
와 연동하세요.
정보를 입력한 각각의 델리게이트를 naviView
와 연동하지 않을 시 주행 화면이 정상적으로 표시되지 않습니다. 반드시 연동하여 사용하세요.
// KNGuidance_GuideStateDelegate
// 길 안내 시작 시 호출
- (void)guidanceGuideStarted:(KNGuidance *)aGuidance {
[naviView guidanceGuideStarted:aGuidance];
}
// 경로 변경 시 호출. 교통 변화 또는 경로 이탈로 인한 재탐색 및 사용자 재탐색 시 전달
- (void)guidanceCheckingRouteChange:(KNGuidance *)aGuidance {
[naviView guidanceCheckingRouteChange:aGuidance];
}
// 경로에서 이탈한 뒤 새로운 경로를 요청할 때 호출
- (void)guidanceOutOfRoute:(KNGuidance *)aGuidance {
[naviView guidanceOutOfRoute:aGuidance];
}
// 수신 받은 새 경로가 기존의 안내된 경로와 동일할 경우 호출
- (void)guidanceRouteUnchanged:(KNGuidance *)aGuidance {
[naviView guidanceRouteUnchanged:aGuidance];
}
// 경로에 오류가 발생 시 호출
- (void)guidance:(KNGuidance *)aGuidance routeUnchangedWithError:(KNError *)aError {
[naviView guidance:aGuidance routeUnchangedWithError:aError];
}
// 수신 받은 새 경로가 기존의 안내된 경로와 다를 경우 호출. 여러 개의 경로가 있을 경우 첫 번째 경로를 주행 경로로 사용하고 나머지는 대안 경로로 설정됨
- (void)guidanceRouteChanged:(KNGuidance *)aGuidance {
[naviView guidanceRouteChanged:aGuidance];
}
// 길 안내 종료 시 호출
- (void)guidanceGuideEnded:(KNGuidance *)aGuidance {
[naviView guidanceGuideEnded:aGuidance isShowDriveResultDialog:YES];
};
// 주행 중 기타 요인들로 인해 경로가 변경되었을 때 호출
- (void)guidance:(KNGuidance *)aGuidance didUpdateRoutes:(NSArray<KNRoute *> *)aRoutes multiRouteInfo:(KNMultiRouteInfo * _Nullable)aMultiRouteInfo {
[naviView guidance:aGuidance didUpdateRoutes:aRoutes multiRouteInfo:aMultiRouteInfo];
}
// KNGuidance_LocationGuideDelegate
// 위치 정보가 변경될 경우 호출. `aLocationGuide`의 항목이 1개 이상 변경 시 전달됨.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateLocation:(KNGuide_Location * _Nonnull)aLocationGuide {
[naviView guidance:aGuidance didUpdateLocation:aLocationGuide];
}
// KNGuidance_RouteGuideDelegate
// 경로 안내 정보 업데이트 시 호출. `aRouteGuide`의 항목이 1개 이상 변경 시 전달됨.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateRouteGuide:(KNGuide_Route * _Nonnull)aRouteGuide {
[naviView guidance:aGuidance didUpdateRouteGuide:aRouteGuide];
}
// KNGuidance_SafetyGuideDelegate
// 안전 운행 정보 업데이트 시 호출. `aSafetyGuide`의 항목이 1개 이상 변경 시 전달됨.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateSafetyGuide:(KNGuide_Safety * _Nonnull)aSafetyGuide {
[naviView guidance:aGuidance didUpdateSafetyGuide:aSafetyGuide];
}
// 주변의 안전 운행 정보 업데이트 시 호출
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateAroundSafeties:(NSArray<__kindof KNSafety *> * _Nullable)aSafeties {
[naviView guidance:aGuidance didUpdateAroundSafeties:aSafeties];
}
// KNGuidance_VoiceGuideDelegate
// 음성 안내 사용 여부
- (BOOL)guidance:(KNGuidance * _Nonnull)aGuidance shouldPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide replaceSndData:(NSData **)aNewData{
return [naviView guidance:aGuidance shouldPlayVoiceGuide:aVoiceGuide replaceSndData:aNewData];
}
// 음성 안내 시작
- (void)guidance:(KNGuidance * _Nonnull)aGuidance willPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide {
[naviView guidance:aGuidance willPlayVoiceGuide:aVoiceGuide];
}
// 음성 안내 종료
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didFinishPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide {
[naviView guidance:aGuidance didFinishPlayVoiceGuide:aVoiceGuide];
}
// KNGuidance_CitsGuideDelegate
// C-ITS 정보 변경 시 호출
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateCitsGuide:(KNGuide_Cits * _Nonnull)aCitsGuide {
[naviView guidance:aGuidance didUpdateCitsGuide:aCitsGuide];
}
// KNGuidance_GuideStateDelegate
// 길 안내 시작 시 호출
- (void)guidanceGuideStarted:(KNGuidance *)aGuidance {
[naviView guidanceGuideStarted:aGuidance];
}
// 경로 변경 시 호출. 교통 변화 또는 경로 이탈로 인한 재탐색 및 사용자 재탐색 시 전달
- (void)guidanceCheckingRouteChange:(KNGuidance *)aGuidance {
[naviView guidanceCheckingRouteChange:aGuidance];
}
// 경로에서 이탈한 뒤 새로운 경로를 요청할 때 호출
- (void)guidanceOutOfRoute:(KNGuidance *)aGuidance {
[naviView guidanceOutOfRoute:aGuidance];
}
// 수신 받은 새 경로가 기존의 안내된 경로와 동일할 경우 호출
- (void)guidanceRouteUnchanged:(KNGuidance *)aGuidance {
[naviView guidanceRouteUnchanged:aGuidance];
}
// 경로에 오류가 발생 시 호출
- (void)guidance:(KNGuidance *)aGuidance routeUnchangedWithError:(KNError *)aError {
[naviView guidance:aGuidance routeUnchangedWithError:aError];
}
// 수신 받은 새 경로가 기존의 안내된 경로와 다를 경우 호출. 여러 개의 경로가 있을 경우 첫 번째 경로를 주행 경로로 사용하고 나머지는 대안 경로로 설정됨
- (void)guidanceRouteChanged:(KNGuidance *)aGuidance {
[naviView guidanceRouteChanged:aGuidance];
}
// 길 안내 종료 시 호출
- (void)guidanceGuideEnded:(KNGuidance *)aGuidance {
[naviView guidanceGuideEnded:aGuidance isShowDriveResultDialog:YES];
};
// 주행 중 기타 요인들로 인해 경로가 변경되었을 때 호출
- (void)guidance:(KNGuidance *)aGuidance didUpdateRoutes:(NSArray<KNRoute *> *)aRoutes multiRouteInfo:(KNMultiRouteInfo * _Nullable)aMultiRouteInfo {
[naviView guidance:aGuidance didUpdateRoutes:aRoutes multiRouteInfo:aMultiRouteInfo];
}
// KNGuidance_LocationGuideDelegate
// 위치 정보가 변경될 경우 호출. `aLocationGuide`의 항목이 1개 이상 변경 시 전달됨.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateLocation:(KNGuide_Location * _Nonnull)aLocationGuide {
[naviView guidance:aGuidance didUpdateLocation:aLocationGuide];
}
// KNGuidance_RouteGuideDelegate
// 경로 안내 정보 업데이트 시 호출. `aRouteGuide`의 항목이 1개 이상 변경 시 전달됨.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateRouteGuide:(KNGuide_Route * _Nonnull)aRouteGuide {
[naviView guidance:aGuidance didUpdateRouteGuide:aRouteGuide];
}
// KNGuidance_SafetyGuideDelegate
// 안전 운행 정보 업데이트 시 호출. `aSafetyGuide`의 항목이 1개 이상 변경 시 전달됨.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateSafetyGuide:(KNGuide_Safety * _Nonnull)aSafetyGuide {
[naviView guidance:aGuidance didUpdateSafetyGuide:aSafetyGuide];
}
// 주변의 안전 운행 정보 업데이트 시 호출
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateAroundSafeties:(NSArray<__kindof KNSafety *> * _Nullable)aSafeties {
[naviView guidance:aGuidance didUpdateAroundSafeties:aSafeties];
}
// KNGuidance_VoiceGuideDelegate
// 음성 안내 사용 여부
- (BOOL)guidance:(KNGuidance * _Nonnull)aGuidance shouldPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide replaceSndData:(NSData **)aNewData{
return [naviView guidance:aGuidance shouldPlayVoiceGuide:aVoiceGuide replaceSndData:aNewData];
}
// 음성 안내 시작
- (void)guidance:(KNGuidance * _Nonnull)aGuidance willPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide {
[naviView guidance:aGuidance willPlayVoiceGuide:aVoiceGuide];
}
// 음성 안내 종료
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didFinishPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide {
[naviView guidance:aGuidance didFinishPlayVoiceGuide:aVoiceGuide];
}
// KNGuidance_CitsGuideDelegate
// C-ITS 정보 변경 시 호출
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateCitsGuide:(KNGuide_Cits * _Nonnull)aCitsGuide {
[naviView guidance:aGuidance didUpdateCitsGuide:aCitsGuide];
}
경로 내 정보 확인하기 링크 복사
회전 구간(회전 교차로 및 로터리), 보호 구역, 유고 정보 등 요청한 경로에서 발생하는 정보들을 확인할 수 있습니다.
[trip routeWithPriority:routePriority avoidOptions:routeAvoidOption completion:^(KNError * _Nullable aError, NSArray<KNRoute *> * _Nullable aRoutes) {
if(aError)
{
// 경로 요청 실패
}
else
{
// 경로 요청 성공
// 경로 내 주요 회전 구간 리스트
NSArray<KNDirection > *mainDirectionList = [aRoute[0] mainDirectionList];
// 경로 내 보호 구역 구간 리스트
NSArray<KNSafetyZone > *safetyZoneList = [aRoute[0] safetyZoneList];
// 경로 내 안전 운전 구간 리스트
NSArray<KNSafety > *safetyList = [aRoute[0] safetyList];
// 경로 내 유고 정보 발생 리스트
NSArray<KNRoadEvent > *roadEventList = [aRoute[0] roadEventList];
// 경로 내 주변 정보/서비스 리스트. 현재 주유소 정보만 제공
NSArray<KNAroundInfo > *aroundInfoList = [aRoute[0] aroundInfoList];
}
}];
[trip routeWithPriority:routePriority avoidOptions:routeAvoidOption completion:^(KNError * _Nullable aError, NSArray<KNRoute *> * _Nullable aRoutes) {
if(aError)
{
// 경로 요청 실패
}
else
{
// 경로 요청 성공
// 경로 내 주요 회전 구간 리스트
NSArray<KNDirection > *mainDirectionList = [aRoute[0] mainDirectionList];
// 경로 내 보호 구역 구간 리스트
NSArray<KNSafetyZone > *safetyZoneList = [aRoute[0] safetyZoneList];
// 경로 내 안전 운전 구간 리스트
NSArray<KNSafety > *safetyList = [aRoute[0] safetyList];
// 경로 내 유고 정보 발생 리스트
NSArray<KNRoadEvent > *roadEventList = [aRoute[0] roadEventList];
// 경로 내 주변 정보/서비스 리스트. 현재 주유소 정보만 제공
NSArray<KNAroundInfo > *aroundInfoList = [aRoute[0] aroundInfoList];
}
}];
경로 내 보호 구역 확인하기 링크 복사
요청한 경로에서 어린이 보호구역, 노인 보호 구역, 장애인 보호 구역 등이 포함되어 있는지 확인할 수 있습니다.
containsSafetyZone
을 호출하여 보호 구역 포함 여부를 확인하며, 값은 Bool
형태로 반환됩니다.
[trip routeWithPriority:routePriority avoidOptions:routeAvoidOption completion:^(KNError * _Nullable aError, NSArray<KNRoute *> * _Nullable aRoutes) {
if(aError)
{
// 경로 요청 실패
}
else
{
// 경로 요청 성공
// 어린이 보호 구역
BOOL schoolZone = [aRoute[0].containsSafetyZone:KNSafetyZoneType_SchoolZone];
// 노인 보호 구역
BOOL silverZone = [aRoute[0].containsSafetyZone:KNSafetyZoneType_SilverZone];
// 장애인 보호 구역
BOOL handicappedZone = [aRoute[0].containsSafetyZone:KNSafetyZoneType_HandicappedZone];
}
}];
[trip routeWithPriority:routePriority avoidOptions:routeAvoidOption completion:^(KNError * _Nullable aError, NSArray<KNRoute *> * _Nullable aRoutes) {
if(aError)
{
// 경로 요청 실패
}
else
{
// 경로 요청 성공
// 어린이 보호 구역
BOOL schoolZone = [aRoute[0].containsSafetyZone:KNSafetyZoneType_SchoolZone];
// 노인 보호 구역
BOOL silverZone = [aRoute[0].containsSafetyZone:KNSafetyZoneType_SilverZone];
// 장애인 보호 구역
BOOL handicappedZone = [aRoute[0].containsSafetyZone:KNSafetyZoneType_HandicappedZone];
}
}];
길 안내 종료하기 링크 복사
길 안내 중 길 안내를 종료하거나 안전 운행 중 X를 눌러 주행 화면을 종료할 때, 길 안내 종료에 대한 알림을 제공합니다.
- (void)naviViewGuideEnded:(KNNaviView * _Nonnull)aNaviView;
- (void)naviViewGuideEnded:(KNNaviView * _Nonnull)aNaviView;