주행 전 설정하기 링크 복사

출발지, 경유지 및 목적지 설정과 차량 정보, 원하는 경로 옵션 등 주행 전에 필요한 정보를 설정합니다.

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. 경로 생성하기 링크 복사

KNSDKmakeTripWithStart 함수를 통해 목적지까지의 경로를 생성합니다.

[[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;
코드가 숨겨졌습니다.