준비물 링크 복사
- iOS 버전 15 이상
- Xcode 버전 13 이상
- 카카오디벨로퍼스에서 앱 등록 및 네이티브 앱 키 발급
카카오디벨로퍼스에서 내 애플리케이션 등록하기 링크 복사
길찾기 SDK를 사용하려면 반드시 앱 등록과 SDK 초기화를 위한 네이티브 앱 키를 발급 받아야 합니다.
1. 앱 등록하기 링크 복사
[카카오디벨로퍼스에서 진행]
로그인 후, 화면 오른쪽 상단에서 앱 → 앱 생성을 클릭하세요.
아래 각 항목에 추가할 내용을 확인하여 앱을 추가하세요.
앱 아이콘: 앱 아이콘으로 사용할 이미지를 추가합니다. 권장하는 이미지의 사이즈는 128 px * 128 px이며 최대 250 KB 크기의 파일을 등록할 수 있습니다. 지원하는 파일 포맷은 JPG, GIF, PNG입니다.
앱 이름: 내 앱(서비스)의 이름을 설정합니다. * 필수 입력 사항
회사명: 사업자명을 입력합니다. 사업자 정보와 동일한 이름을 사용해야 합니다. * 필수 입력 사항
주의: 앱(서비스) 이름은 공백 포함 30자까지 입력할 수 있습니다.
카테고리: 서비스의 카테고리를 선택합니다. * 필수 입력 사항
앱 대표 도메인: 서비스의 대표 도메인을 입력합니다.
각 항목을 입력하고, 운영 정책에서 제한하는 사항에 해당하지 않은지 확인 후, 저장을 눌러 앱을 생성하세요.
생성된 앱은 앱에서 확인할 수 있습니다.
2. 서비스 정보 등록하기 링크 복사
[카카오디벨로퍼스에서 진행]
SDK 초기화에는 네이티브 앱 키가 필요하며, 사용 전 서비스 정보를 카카오디벨로퍼스에 등록해야 합니다.
앱 → 앱 키를 발급할 앱 선택 → 앱 → 플랫폼 키을 클릭하세요.
네이티브 앱 키 추가 또는 생성된 기본 키를 선택하세요.
필요한 서비스 정보 항목을 등록하세요.
- 네이티브 앱 키: 발급된 키 값과 상태를 확인하고 복사할 수 있습니다.
- 키 이름: 키를 식별하기 위한 이름을 지정합니다. * 필수 입력 사항
- (iOS) 번들 ID: iOS 앱의 고유 식별자로, Xcode의 Target → General → Identity에서 확인할 수 있습니다.
- (iOS) 스토어 URL: 앱이 설치되지 않은 경우 이동할 App Store URL을 등록합니다. iPhone/iPad용 URL을 각각 추가할 수 있습니다.
- 스킴: 해당 키에 발급된 앱 스킴 정보를 확인할 수 있습니다.
- 추가 정보: 키의 활성화 상태와 생성일, 수정일 정보를 확인할 수 있습니다.
3. 네이티브 앱 키 확인하기 링크 복사
[카카오디벨로퍼스에서 진행]
- 앱 → 앱 키를 발급할 앱 선택 → 앱 → 플랫폼 키을 클릭하세요.
- 네이티브 앱 키 값을 복사하여 사용하세요.
내 프로젝트 시작하기 링크 복사
아래의 절차에 따라 프로젝트를 생성합니다.
이 문서는 Xcode 버전 15.2를 기준으로 작성되었습니다. 사용하는 버전에 따라 화면 및 세부 내용은 문서 내 설명과 다를 수 있습니다.
Xcode를 실행한 후 Create New Project를 클릭합니다.
App을 선택한 후 Next를 클릭합니다.
프로젝트의 이름을 설정합니다. 설정이 완료되면 Next를 클릭합니다.
Language는 Objective-C로 설정합니다.
프로젝트를 저장할 경로를 선택한 다음 Create를 클릭합니다.
프레임워크 추가하기 링크 복사
iOS 길찾기 SDK 1.6.0 버전부터 CocoaPods를 사용하여 레파지토리를 설정할 수 있으며, 1.6.7 버전부터는 Swift Package Manager도 지원합니다. 사용하고 있는 SDK의 버전에 따라 적절한 방법으로 프레임워크를 추가합니다.
[iOS 길찾기 SDK 버전에 따른 레파지토리 설정 방법]
- 1.6.7 버전 이상: Swift Package Manager
- 1.6.0 버전 이상: CocoaPods
방법 1. CocoaPods를 통한 레파지토리 설정 링크 복사
CocoaPods를 이용하여 iOS 길찾기 SDK의 프레임워크를 추가합니다. CocoaPods는 Ruby 프로그래밍 언어로 작성되어 맥북에서 설치 후 바로 사용할 수 있습니다.
- 터미널을 실행한 후 아래의 명령어를 입력하여 Ruby를 설치합니다.
$ brew install ruby
$ brew install ruby
$ sudo gem install cocoapods
$ sudo gem install cocoapods
$ cd /Users/KNNaviSample
$ cd /Users/KNNaviSample
$ pod init
$ pod init
5. 생성된 Podfile을 텍스트 편집기로 열어 아래와 같이 수정한 다음 저장합니다.
IPHONEOS_DEPLOYMENT_TARGET은 현재 프로젝트의 Minimum Deployments와 동일하게 입력합니다.
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'KNNaviSample' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for KNNaviSample
pod 'KNSDK-UI', '1.9.6'
target 'KNNaviSampleTests' do
inherit! :search_paths
# Pods for testing
end
target 'KNNaviSampleUITests' do
# Pods for testing
end
end
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
end
end
end
end
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'KNNaviSample' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for KNNaviSample
pod 'KNSDK-UI', '1.9.6'
target 'KNNaviSampleTests' do
inherit! :search_paths
# Pods for testing
end
target 'KNNaviSampleUITests' do
# Pods for testing
end
end
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
end
end
end
end
6. 아래의 명령어를 입력하여 프레임워크를 설치합니다.
$ pod cache clean --all // 캐시 삭제. 캐시 삭제가 필요할 경우 입력
$ pod repo update // 설치하는 프레임워크가 업데이트 되었을 경우 입력
$ pod install // 프레임워크 설치
$ pod cache clean --all // 캐시 삭제. 캐시 삭제가 필요할 경우 입력
$ pod repo update // 설치하는 프레임워크가 업데이트 되었을 경우 입력
$ pod install // 프레임워크 설치
7. 생성된 .xcworkspace 확장자 파일을 실행하여 프로젝트를 엽니다.
방법 2. Swift Package Manager를 통한 레파지토리 설정 링크 복사
Swift Package Manager를 이용하여 iOS 길찾기 SDK의 프레임워크를 추가합니다.
- Xcode에서 아래의 경로를 따라 클릭합니다.
경로: TARGETS 내 KNSample → General → Framewokrs, Libraries, and Embedded Content → + - Add Other... → Add Package Dependency를 클릭합니다.
- 우측 상단 입력창에 아래의 깃허브(GitHub) 주소를 입력한 다음 Dependency Rule에서 원하는 버전을 선택하고 Add Package를 클릭하여 프레임워크를 설치합니다.
주소: https://github.com/kakaomob/KNSDK.git
info.plist 설정하기 링크 복사
앱 실행 허용 목록(Allowlist) 등록하기 링크 복사
iOS 길찾기 SDK를 통해 앱을 실행시키는 기능을 이용하려면 Info.plist 파일에 설정을 추가해야 합니다. 이 설정은 사용자 정보 보호를 위한 OS 정책에 따라 필요한 것으로, 자세한 내용은 Privacy and Your App을 참고합니다.
프로젝트 하위의 info.plist 파일을 클릭하고 Information Property List에서 + 눌러 info.plist의 키 값을 추가합니다.
| Key | Type |
|---|---|
| Privacy - Location When In Use Usage Description | String |
| App Transport Security Settings | String |
App Transport Security (ATS) 설정하기 링크 복사
앱과 웹 서비스 사이에 통신 시 보안 향상을 위해 App Transport Security (이하 ATS)를 설정해야 합니다. 세부 정보는 다음과 같습니다. App Transport Security에서 + 눌러 ATS와 도메인의 키 값과 타입을 추가합니다.
| Key | Type | Value |
|---|---|---|
| Allow Arbitrary Loads | Boolean | YES |
| Exception Domains | Dictionary | (1 items) |
| Key | Type | Value |
|---|---|---|
| kakao.com | Dictionary | (4 items) |
| kakaocorp.com | Dictionary | (4 items) |
| Key | Type | Value |
|---|---|---|
| NSExceptionAllowsInsecureHTTPLoads | Boolean | YES |
| NSExceptionRequiresForwardSecrecy | Boolean | NO |
| NSIncludesSubdomains | Boolean | YES |
| NSTemporaryExceptionMinimumTLSVersion | String | TLSv1.0 |
다음과 같이 ATS가 설정됩니다.
AVAudioSession 추가하기 링크 복사
AVAudioSession을 추가하지 않을 시 내비게이션의 음성 안내가 중단될 수 있습니다.
#import <KNSDK/KNSoundPlayer.h>
...
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;
[session setActive:NO error:&error];
AVAudioSessionCategoryOptions category = AVAudioSessionCategoryOptionMixWithOthers;
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:category error:&error];
[session setActive:YES error:&error];
#import <KNSDK/KNSoundPlayer.h>
...
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;
[session setActive:NO error:&error];
AVAudioSessionCategoryOptions category = AVAudioSessionCategoryOptionMixWithOthers;
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:category error:&error];
[session setActive:YES error:&error];
주행 화면 구성하기 링크 복사
SDK 불러오기 링크 복사
iOS 앱에서 iOS 길찾기 SDK를 사용하려면 iOS 길찾기 SDK 파일을 아래와 같이 임포트(import) 해야 합니다.
#import <KNSDK/KNSDK.h> // 인증 및 경로 탐색 SDK
#import <KNSDK/KNNaviView.h> // 내비게이션 UI SDK
#import <KNSDK/KNSDK.h> // 인증 및 경로 탐색 SDK
#import <KNSDK/KNNaviView.h> // 내비게이션 UI SDK
내비게이션 뷰 컨트롤러 구현하기 링크 복사
여러 Delegate 프로토콜을 통해 내비게이션의 다양한 상태와 이벤트를 처리하는 과정을 다룹니다. 이를 통해 경로 안내나 위치 정보 등의 기능을 구현할 수 있습니다.
// 사용할 델리게이트
@interface ViewController () <KNNaviView_GuideStateDelegate, KNNaviView_StateDelegate, KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate, KNGuidance_SafetyGuideDelegate, KNGuidance_CitsGuideDelegate, KNGuidance_VoiceGuideDelegate>
@end
// 내비 뷰 선언
@implementation ViewController
{
KNNaviView *naviView;
}
// 내비 뷰 메모리 해제
- (void)dealloc
{
naviView = nil;
}
// 사용할 델리게이트
@interface ViewController () <KNNaviView_GuideStateDelegate, KNNaviView_StateDelegate, KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate, KNGuidance_SafetyGuideDelegate, KNGuidance_CitsGuideDelegate, KNGuidance_VoiceGuideDelegate>
@end
// 내비 뷰 선언
@implementation ViewController
{
KNNaviView *naviView;
}
// 내비 뷰 메모리 해제
- (void)dealloc
{
naviView = nil;
}
초기화하기 링크 복사
iOS 길찾기 SDK를 사용하려면 네이티브 앱 키를 사용하여 초기화해야 합니다.
초기화에 실패할 경우 문제 해결하기에서 인증 오류에 대한 상세 내용을 확인합니다.
사용할 수 있는 키 값에 대한 정보는 아래와 같습니다.
- AppKey:
StringiOS 길찾기 SDK를 사용하기 위해 필요한 네이티브 앱 키로 카카오디벨로퍼스에서 발급받을 수 있습니다. 이를 통해 SDK를 초기화하고 길찾기 기능을 사용할 수 있습니다. - UserKey:
String사용자의 구분이 필요한 경우 임의로 값을 지정하여 사용할 수 있는 키로 사용 환경에 맞게 자유롭게 설정 가능합니다. 예를 들어, 기존에 사용하고 있던 회원 번호를 키 값으로 부여하여 사용할 수 있습니다. - ClientVersion: iOS 길찾기 SDK를 적용할 클라이언트의 버전명입니다.
- (void)viewWillAppear:(BOOL)animated
{
// 로그인하기
NSString *appkey = @""; // 카카오디벨로퍼스에서 발급 받은 네이티브 앱 키
NSString *appVersion = NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"]; // 현재 앱 버전
NSString *userKey = @"1111"; // 사용자를 구별할 수 있는 키값
[[KNSDK sharedInstance] initializeWithAppKey:AppKey clientVersion:ClientVersion userKey:UserKey completion:^(KNError *error) {
if (error)
{
NSLog(@"KNSDK Init Failed(%@, %@)", error.code, error.msg);
}
else
{
NSLog(@"인증 성공");
}
}];
- (void)viewWillAppear:(BOOL)animated
{
// 로그인하기
NSString *appkey = @""; // 카카오디벨로퍼스에서 발급 받은 네이티브 앱 키
NSString *appVersion = NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"]; // 현재 앱 버전
NSString *userKey = @"1111"; // 사용자를 구별할 수 있는 키값
[[KNSDK sharedInstance] initializeWithAppKey:AppKey clientVersion:ClientVersion userKey:UserKey completion:^(KNError *error) {
if (error)
{
NSLog(@"KNSDK Init Failed(%@, %@)", error.code, error.msg);
}
else
{
NSLog(@"인증 성공");
}
}];
경로 요청 구성하기 링크 복사
길찾기 SDK는 출발지와 목적지의 위치를 KATEC 좌표계로 표현합니다.
WGS84 좌표계를 사용한 경우, KATEC 좌표계로 변환하여 사용해야 합니다.
[KATEC 좌표로 변환하기] 링크 복사
// 좌표 변환 예시
강남역 WGS84좌표: 37.4979052300861,127.027636408648
IntPoint point = [[KNSDK sharedInstance] convertWGS84ToKATECWithLongitude:37.4979052300861 latitude:127.027636408648];
KNPOI *goalPoi = [[KNPOI alloc] initWithName:@"강남역 2호선 입구" x:point.x y:point.y]; // 목적지
// 좌표 변환 예시
강남역 WGS84좌표: 37.4979052300861,127.027636408648
IntPoint point = [[KNSDK sharedInstance] convertWGS84ToKATECWithLongitude:37.4979052300861 latitude:127.027636408648];
KNPOI *goalPoi = [[KNPOI alloc] initWithName:@"강남역 2호선 입구" x:point.x y:point.y]; // 목적지
아래의 코드를 입력하여 서버에 목적지까지의 경로를 요청합니다.
- (void)makeTrip
{
// KATEC 좌표 사용
KNPOI *startPoi = [[KNPOI alloc] initWithName:@"광화문" x:309840 y:552483]; // 출발지
KNPOI *goalPoi = [[KNPOI alloc] initWithName:@"강남역 2호선 입구" x:314217 y:544415]; // 목적지
// 내비게이션에서 사용한 최신 GPS 정보 가지고 오기
// POI 좌표로 사용 시 Int 형태로 좌표 변환 후 사용
KNGPSData *gpsData = KNSDK.sharedInstance.sharedGpsManager.recentGpsData;
// 주행을 하기 위한 Trip 생성
[[KNSDK sharedInstance] makeTripWithStart:startPoi goal:goalPoi vias:nil completion:^(KNError * _Nullable aError, KNTrip * _Nullable aTrip) {
if(aError)
{
NSLog(@"aError");
}
else
{
if(aTrip)
{
[self naviStart:aTrip]; // 내비 뷰 생성 및 안내 시작
}
}
}];
}
- (void)makeTrip
{
// KATEC 좌표 사용
KNPOI *startPoi = [[KNPOI alloc] initWithName:@"광화문" x:309840 y:552483]; // 출발지
KNPOI *goalPoi = [[KNPOI alloc] initWithName:@"강남역 2호선 입구" x:314217 y:544415]; // 목적지
// 내비게이션에서 사용한 최신 GPS 정보 가지고 오기
// POI 좌표로 사용 시 Int 형태로 좌표 변환 후 사용
KNGPSData *gpsData = KNSDK.sharedInstance.sharedGpsManager.recentGpsData;
// 주행을 하기 위한 Trip 생성
[[KNSDK sharedInstance] makeTripWithStart:startPoi goal:goalPoi vias:nil completion:^(KNError * _Nullable aError, KNTrip * _Nullable aTrip) {
if(aError)
{
NSLog(@"aError");
}
else
{
if(aTrip)
{
[self naviStart:aTrip]; // 내비 뷰 생성 및 안내 시작
}
}
}];
}
주행 구성하기 링크 복사
요청한 경로를 바탕으로 주행을 시작할 준비를 합니다.
- (void)naviStart:(KNTrip *)aTrip
{
KNGuidance *guidance = [[KNSDK sharedInstance] sharedGuidance]; // 주행 가이던스 생성
guidance.guideStateDelegate = self; // guideStateDelegate 연결
guidance.routeGuideDelegate = self; // routeGuideDelegate 연결
guidance.voiceGuideDelegate = self; // voiceGuideDelegate 연결
guidance.safetyGuideDelegate = self; // safetyGuideDelegate 연결
guidance.locationGuideDelegate = self; // locationGuideDelegate 연결
guidance.citsGuideDelegate = self; // locationGuideDelegate 연결
KNRoutePriority routePriority = KNRoutePriority_Recommand; // 추천 경로 우선
KNRouteAvoidOption routeAvoidOption = KNRouteAvoidOption_None; // 회피 옵션 없음
// 내비 뷰 생성
naviView = [[KNNaviView alloc] initWithGuidance:guidance trip:aTrip routeOption:routePriority avoidOption:routeAvoidOption];
naviView.frame = [UIScreen mainScreen].bounds; // 스크린 크기로 설정
[naviView sndVolume:1.0f]; // 볼륨 설정
naviView.guideStateDelegate = self; // guideStateDelegate 연결
naviView.stateDelegate = self; // stateDelegate 연결
[self.view addSubview:naviView]; // 현재 화면 위에 내비 뷰 생성
}
- (void)naviStart:(KNTrip *)aTrip
{
KNGuidance *guidance = [[KNSDK sharedInstance] sharedGuidance]; // 주행 가이던스 생성
guidance.guideStateDelegate = self; // guideStateDelegate 연결
guidance.routeGuideDelegate = self; // routeGuideDelegate 연결
guidance.voiceGuideDelegate = self; // voiceGuideDelegate 연결
guidance.safetyGuideDelegate = self; // safetyGuideDelegate 연결
guidance.locationGuideDelegate = self; // locationGuideDelegate 연결
guidance.citsGuideDelegate = self; // locationGuideDelegate 연결
KNRoutePriority routePriority = KNRoutePriority_Recommand; // 추천 경로 우선
KNRouteAvoidOption routeAvoidOption = KNRouteAvoidOption_None; // 회피 옵션 없음
// 내비 뷰 생성
naviView = [[KNNaviView alloc] initWithGuidance:guidance trip:aTrip routeOption:routePriority avoidOption:routeAvoidOption];
naviView.frame = [UIScreen mainScreen].bounds; // 스크린 크기로 설정
[naviView sndVolume:1.0f]; // 볼륨 설정
naviView.guideStateDelegate = self; // guideStateDelegate 연결
naviView.stateDelegate = self; // stateDelegate 연결
[self.view addSubview:naviView]; // 현재 화면 위에 내비 뷰 생성
}
Delegate 연결하기 링크 복사
주행 정보 및 상태를 KNNaviView로 넘겨 주기 위한 Delegate를 연결합니다. 각 델리게이트의 항목 중 하나라도 바뀌면 내비게이션 화면에 전달하여 최신 정보를 표시합니다.
아래의 코드들을 입력하여 주행에 필요한 기능을 연결하세요.
KNNaviView_StateDelegate 링크 복사
KNNaviView의 상태를 나타내는 델리게이트로 KNNaviView의 상태가 변경될 때 호출됩니다.
// 내비 볼륨 변경 시 호출
- (void)naviViewDidUpdateSndVolume:(float)aVolume
{
}
// 주 <-> 야간 변경 시 호출
- (void)naviViewDidUpdateUseDarkMode:(BOOL)aDarkMode
{
}
// 카메라 모드 변경 시 호출
- (void)naviViewDidUpdateMapCameraMode:(MapViewCameraMode)aMapViewCameraMode
{
}
// 추가된 커스텀 버튼의 이벤트 동작 시 호출
// aId 커스텀 버튼 아이디
// aToggle 커스텀 버튼이 토글 버튼일 경우의 상태 값
- (void)naviViewDidMenuItemWithId:(int)aId toggle:(BOOL)aToggle
{
}
// ViewState 상태 변경 시 호출
- (void)naviViewScreenState:(KNNaviViewState)aKNNaviViewState
{
}
// popUpView 상태 변경 시 호출
- (void)naviViewPopupOpenCheck:(BOOL)aOpen
{
}
// bottom 도착 시간 <-> 소요 시간 변경 시 호출 yes: 도착 시간 no: 소요 시간
- (void)naviViewIsArrival:(BOOL)aIsArrival
{
}
// 내비 볼륨 변경 시 호출
- (void)naviViewDidUpdateSndVolume:(float)aVolume
{
}
// 주 <-> 야간 변경 시 호출
- (void)naviViewDidUpdateUseDarkMode:(BOOL)aDarkMode
{
}
// 카메라 모드 변경 시 호출
- (void)naviViewDidUpdateMapCameraMode:(MapViewCameraMode)aMapViewCameraMode
{
}
// 추가된 커스텀 버튼의 이벤트 동작 시 호출
// aId 커스텀 버튼 아이디
// aToggle 커스텀 버튼이 토글 버튼일 경우의 상태 값
- (void)naviViewDidMenuItemWithId:(int)aId toggle:(BOOL)aToggle
{
}
// ViewState 상태 변경 시 호출
- (void)naviViewScreenState:(KNNaviViewState)aKNNaviViewState
{
}
// popUpView 상태 변경 시 호출
- (void)naviViewPopupOpenCheck:(BOOL)aOpen
{
}
// bottom 도착 시간 <-> 소요 시간 변경 시 호출 yes: 도착 시간 no: 소요 시간
- (void)naviViewIsArrival:(BOOL)aIsArrival
{
}
KNNaviView_GuideStateDelegate 링크 복사
KNNaviView의 가이드 상태를 나타내는 델리게이트로 주행 중 내비게이션의 가이드 상태가 변경될 때 호출됩니다.
// 현재 내비 뷰 길 안내 뷰 닫기 호출 시
- (void)naviViewGuideEnded:(KNNaviView *)aNaviView
{
if(naviView)
{
[naviView removeFromSuperview];
naviView = nil;
}
}
// GuideState 상태 변경 시 호출
- (void)naviViewGuideState:(KNGuideState)aGuideState
{
}
// 현재 내비 뷰 길 안내 뷰 닫기 호출 시
- (void)naviViewGuideEnded:(KNNaviView *)aNaviView
{
if(naviView)
{
[naviView removeFromSuperview];
naviView = nil;
}
}
// GuideState 상태 변경 시 호출
- (void)naviViewGuideState:(KNGuideState)aGuideState
{
}
KNGuidance_GuideStateDalegate 링크 복사
아래의 델리게이트 정보를 참고하여 naviView와 연동합니다.
정보를 입력한 각각의 델리게이트를 naviView와 연동하지 않을 시 주행 화면이 정상적으로 표시되지 않습니다. 반드시 연동하여 사용하세요.
// 안내 시작
- (void)guidanceGuideStarted:(KNGuidance *)aGuidance
{
// 안내 시작 시 호출됨
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceGuideStarted:aGuidance];
}
}
// 경로 변경 확인: 교통 상황 변화로 인한 재탐색, 경로 이탈 시 재탐색 및 사용자 요청에 의한 재탐색 시 전달됨
- (void)guidanceCheckingRouteChange:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceCheckingRouteChange:aGuidance];
}
}
// 경로 이탈 시 호출됨
- (void)guidanceOutOfRoute:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceOutOfRoute:aGuidance];
}
}
// 경로 변경 없음: 교통 상황 변화 감지 후 경로 변동이 없거나, 교통 상황 변화로 새로운 경로를 요청했으나 기존 경로와 동일한 경우 전달됨
- (void)guidanceRouteUnchanged:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceRouteUnchanged:aGuidance];
}
}
// 경로 에러 발생 시
- (void)guidance:(KNGuidance *)aGuidance routeUnchangedWithError:(KNError *)aError
{
if(naviView)
{
[naviView guidance:aGuidance routeUnchangedWithError:aError];
}
}
// 경로 변경 시 전달. 복수 경로 존재 시 첫 번째가 주행 경로, 나머지는 대안 경로
- (void)guidanceRouteChanged:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceRouteChanged:aGuidance];
}
}
// 안내 종료됨
- (void)guidanceGuideEnded:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceGuideEnded:aGuidance isShowDriveResultDialog:YES];
}
};
// 경로 변경됨
- (void)guidance:(KNGuidance *)aGuidance didUpdateRoutes:(NSArray<KNRoute *> *)aRoutes multiRouteInfo:(KNMultiRouteInfo * _Nullable)aMultiRouteInfo
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateRoutes:aRoutes multiRouteInfo:aMultiRouteInfo];
}
}
// 안내 시작
- (void)guidanceGuideStarted:(KNGuidance *)aGuidance
{
// 안내 시작 시 호출됨
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceGuideStarted:aGuidance];
}
}
// 경로 변경 확인: 교통 상황 변화로 인한 재탐색, 경로 이탈 시 재탐색 및 사용자 요청에 의한 재탐색 시 전달됨
- (void)guidanceCheckingRouteChange:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceCheckingRouteChange:aGuidance];
}
}
// 경로 이탈 시 호출됨
- (void)guidanceOutOfRoute:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceOutOfRoute:aGuidance];
}
}
// 경로 변경 없음: 교통 상황 변화 감지 후 경로 변동이 없거나, 교통 상황 변화로 새로운 경로를 요청했으나 기존 경로와 동일한 경우 전달됨
- (void)guidanceRouteUnchanged:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceRouteUnchanged:aGuidance];
}
}
// 경로 에러 발생 시
- (void)guidance:(KNGuidance *)aGuidance routeUnchangedWithError:(KNError *)aError
{
if(naviView)
{
[naviView guidance:aGuidance routeUnchangedWithError:aError];
}
}
// 경로 변경 시 전달. 복수 경로 존재 시 첫 번째가 주행 경로, 나머지는 대안 경로
- (void)guidanceRouteChanged:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceRouteChanged:aGuidance];
}
}
// 안내 종료됨
- (void)guidanceGuideEnded:(KNGuidance *)aGuidance
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidanceGuideEnded:aGuidance isShowDriveResultDialog:YES];
}
};
// 경로 변경됨
- (void)guidance:(KNGuidance *)aGuidance didUpdateRoutes:(NSArray<KNRoute *> *)aRoutes multiRouteInfo:(KNMultiRouteInfo * _Nullable)aMultiRouteInfo
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateRoutes:aRoutes multiRouteInfo:aMultiRouteInfo];
}
}
KNGuidance_LocationGuideDalegate 링크 복사
사용자의 위치가 변경될 때 실행됩니다.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateLocation:(KNGuide_Location * _Nonnull)aLocationGuide
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateLocation:aLocationGuide];
}
}
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateLocation:(KNGuide_Location * _Nonnull)aLocationGuide
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateLocation:aLocationGuide];
}
}
KNGuidance_RouteGuideDelegate 링크 복사
경로 안내 정보가 변경될 때 실행됩니다.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateRouteGuide:(KNGuide_Route * _Nonnull)aRouteGuide
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateRouteGuide:aRouteGuide];
}
}
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateRouteGuide:(KNGuide_Route * _Nonnull)aRouteGuide
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateRouteGuide:aRouteGuide];
}
}
KNGuidance_SafetyGuideDelegate 링크 복사
안전 운행 정보가 변경될 때 실행됩니다.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateSafetyGuide:(KNGuide_Safety * _Nonnull)aSafetyGuide
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateSafetyGuide:aSafetyGuide];
}
}
// 주변의 안전주의 데이터
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateAroundSafeties:(NSArray<__kindof KNSafety *> * _Nullable)aSafeties
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateAroundSafeties:aSafeties];
}
}
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateSafetyGuide:(KNGuide_Safety * _Nonnull)aSafetyGuide
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateSafetyGuide:aSafetyGuide];
}
}
// 주변의 안전주의 데이터
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateAroundSafeties:(NSArray<__kindof KNSafety *> * _Nullable)aSafeties
{
if(naviView)
{
// 내비 뷰에 정보 전달
[naviView guidance:aGuidance didUpdateAroundSafeties:aSafeties];
}
}
KNGuidance_VoiceGuideDelegate 링크 복사
음성 안내의 재생 여부를 결정합니다. NO를 반환하면 음성이 재생되지 않습니다. aNewData 매개변수를 통해 새로운 음성을 설정하면, 그 음성으로 변경되어 재생됩니다. 음성 안내 재생 시작과 종료 시점도 처리합니다.
- (BOOL)guidance:(KNGuidance * _Nonnull)aGuidance shouldPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide replaceSndData:(NSData **)aNewData
{
if(naviView)
{
return [naviView guidance:aGuidance shouldPlayVoiceGuide:aVoiceGuide replaceSndData:aNewData];
}
else
{
return YES;
}
}
// 음성 안내 재생 시작
- (void)guidance:(KNGuidance * _Nonnull)aGuidance willPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide
{
if(naviView)
{
[naviView guidance:aGuidance willPlayVoiceGuide:aVoiceGuide];
}
}
// 음성 안내 재생 종료
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didFinishPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide
{
if(naviView)
{
[naviView guidance:aGuidance didFinishPlayVoiceGuide:aVoiceGuide];
}
}
- (BOOL)guidance:(KNGuidance * _Nonnull)aGuidance shouldPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide replaceSndData:(NSData **)aNewData
{
if(naviView)
{
return [naviView guidance:aGuidance shouldPlayVoiceGuide:aVoiceGuide replaceSndData:aNewData];
}
else
{
return YES;
}
}
// 음성 안내 재생 시작
- (void)guidance:(KNGuidance * _Nonnull)aGuidance willPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide
{
if(naviView)
{
[naviView guidance:aGuidance willPlayVoiceGuide:aVoiceGuide];
}
}
// 음성 안내 재생 종료
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didFinishPlayVoiceGuide:(KNGuide_Voice * _Nonnull)aVoiceGuide
{
if(naviView)
{
[naviView guidance:aGuidance didFinishPlayVoiceGuide:aVoiceGuide];
}
}
KNGuidance_CitsGuideDelegate 링크 복사
C-ITS(Cooperative-Intelligent Transport Systems, 협력 지능형 교통 체계) 정보가 변경될 때 실행됩니다.
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateCitsGuide:(KNGuide_Cits * _Nonnull)aCitsGuide
{
if(naviView)
{
[naviView guidance:aGuidance didUpdateCitsGuide:aCitsGuide];
}
}
- (void)guidance:(KNGuidance * _Nonnull)aGuidance didUpdateCitsGuide:(KNGuide_Cits * _Nonnull)aCitsGuide
{
if(naviView)
{
[naviView guidance:aGuidance didUpdateCitsGuide:aCitsGuide];
}
}
내비게이션 실행하기 링크 복사
Xcode 시뮬레이터에서 내비게이션 기본 화면이 정상적으로 표시되는지 확인합니다.
- Xcode 상단 메뉴에서 Xcode → Settings... → Platforms을 선택합니다.
- 리스트에서 기기를 선택하거나 화면 오른쪽 아래의 + 버튼을 클릭하여 원하는 기기를 추가합니다.
- 기기 추가를 완료한 다음 Xcode 화면 오른쪽 위의 재생 버튼을 클릭하여 실행합니다.
올바르게 실행되면 화면이 아래와 같이 표시됩니다.