준비물 링크 복사
  • iOS 버전 15 이상
  • Xcode 버전 13 이상
  • 카카오디벨로퍼스에서 앱 등록 및 네이티브 앱 키 발급

카카오디벨로퍼스에서 내 애플리케이션 등록하기 링크 복사

길찾기 SDK를 사용하려면 반드시 앱 등록과 SDK 초기화를 위한 네이티브 앱 키를 발급 받아야 합니다.

1. 앱 등록하기 링크 복사

[카카오디벨로퍼스에서 진행]

  1. 카카오디벨로퍼스에 로그인하세요. 계정이 없을 경우, 회원 가입을 한 후 다음 단계를 진행하세요.

  2. 로그인 후, 화면 오른쪽 상단에서 앱 생성을 클릭하세요.

  3. 아래 각 항목에 추가할 내용을 확인하여 앱을 추가하세요.


    • 앱 아이콘: 앱 아이콘으로 사용할 이미지를 추가합니다. 권장하는 이미지의 사이즈는 128 px * 128 px이며 최대 250 KB 크기의 파일을 등록할 수 있습니다. 지원하는 파일 포맷은 JPG, GIF, PNG입니다.

    • 앱 이름: 내 앱(서비스)의 이름을 설정합니다. * 필수 입력 사항

    • 회사명: 사업자명을 입력합니다. 사업자 정보와 동일한 이름을 사용해야 합니다. * 필수 입력 사항

      주의: 앱(서비스) 이름은 공백 포함 30자까지 입력할 수 있습니다.

    • 카테고리: 서비스의 카테고리를 선택합니다. * 필수 입력 사항

    • 앱 대표 도메인: 서비스의 대표 도메인을 입력합니다.

  4. 각 항목을 입력하고, 운영 정책에서 제한하는 사항에 해당하지 않은지 확인 후, 저장을 눌러 앱을 생성하세요.

    생성된 앱은 에서 확인할 수 있습니다.

2. 서비스 정보 등록하기 링크 복사

[카카오디벨로퍼스에서 진행]

SDK 초기화에는 네이티브 앱 키가 필요하며, 사용 전 서비스 정보를 카카오디벨로퍼스에 등록해야 합니다.

  1. → 앱 키를 발급할 앱 선택 → 플랫폼 키을 클릭하세요.

  2. 네이티브 앱 키 추가 또는 생성된 기본 키를 선택하세요.

  3. 필요한 서비스 정보 항목을 등록하세요.

  • 네이티브 앱 키: 발급된 키 값과 상태를 확인하고 복사할 수 있습니다.
  • 키 이름: 키를 식별하기 위한 이름을 지정합니다. * 필수 입력 사항
  • (iOS) 번들 ID: iOS 앱의 고유 식별자로, Xcode의 TargetGeneralIdentity에서 확인할 수 있습니다.
  • (iOS) 스토어 URL: 앱이 설치되지 않은 경우 이동할 App Store URL을 등록합니다. iPhone/iPad용 URL을 각각 추가할 수 있습니다.
  • 스킴: 해당 키에 발급된 앱 스킴 정보를 확인할 수 있습니다.
  • 추가 정보: 키의 활성화 상태와 생성일, 수정일 정보를 확인할 수 있습니다.

3. 네이티브 앱 키 확인하기 링크 복사

[카카오디벨로퍼스에서 진행]

  1. → 앱 키를 발급할 앱 선택 → 플랫폼 키을 클릭하세요.
  2. 네이티브 앱 키 값을 복사하여 사용하세요.

자세한 내용은 카카오디벨로퍼스앱 설정을 참고하세요.


내 프로젝트 시작하기 링크 복사

아래의 절차에 따라 프로젝트를 생성합니다.

이 문서는 Xcode 버전 15.2를 기준으로 작성되었습니다. 사용하는 버전에 따라 화면 및 세부 내용은 문서 내 설명과 다를 수 있습니다.

  1. Xcode를 실행한 후 Create New Project를 클릭합니다.

  2. App을 선택한 후 Next를 클릭합니다.



  3. 프로젝트의 이름을 설정합니다. 설정이 완료되면 Next를 클릭합니다.

    Language는 Objective-C로 설정합니다.



  4. 프로젝트를 저장할 경로를 선택한 다음 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 프로그래밍 언어로 작성되어 맥북에서 설치 후 바로 사용할 수 있습니다.

  1. 터미널을 실행한 후 아래의 명령어를 입력하여 Ruby를 설치합니다.
$ brew install ruby
$ brew install ruby
코드가 숨겨졌습니다.
 2. 아래의 명령어를 입력하여 CocoaPods를 설치합니다.
$ sudo gem install cocoapods
$ sudo gem install cocoapods
코드가 숨겨졌습니다.
 3. 작업할 프로젝트 폴더의 경로를 지정합니다.
$ cd /Users/KNNaviSample
$ cd /Users/KNNaviSample
코드가 숨겨졌습니다.
 4. 아래의 명령어를 입력하여 Podfile을 생성합니다.
$ pod init
$ pod init
코드가 숨겨졌습니다.
 다음과 같이 Podfile이 추가됩니다.


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의 프레임워크를 추가합니다.

  1. Xcode에서 아래의 경로를 따라 클릭합니다.

    경로: TARGETSKNSampleGeneralFramewokrs, Libraries, and Embedded Content+

  2. Add Other...Add Package Dependency를 클릭합니다.

  3. 우측 상단 입력창에 아래의 깃허브(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의 키 값을 추가합니다.

표 1 info.plist
Key Type
Privacy - Location When In Use Usage Description String
App Transport Security Settings String
다음과 같이 info.plist가 추가됩니다.

App Transport Security (ATS) 설정하기 링크 복사

앱과 웹 서비스 사이에 통신 시 보안 향상을 위해 App Transport Security (이하 ATS)를 설정해야 합니다. 세부 정보는 다음과 같습니다. App Transport Security에서 + 눌러 ATS와 도메인의 키 값과 타입을 추가합니다.

표 2 ATS
Key Type Value
Allow Arbitrary Loads Boolean YES
Exception Domains Dictionary (1 items)
표 3 Exception Domains
Key Type Value
kakao.com Dictionary (4 items)
kakaocorp.com Dictionary (4 items)
표 4 Domains 세부 정보(Kakao.com, Kakaocorp.com)
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: String iOS 길찾기 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 시뮬레이터에서 내비게이션 기본 화면이 정상적으로 표시되는지 확인합니다.

  1. Xcode 상단 메뉴에서 XcodeSettings...Platforms을 선택합니다.
  2. 리스트에서 기기를 선택하거나 화면 오른쪽 아래의 + 버튼을 클릭하여 원하는 기기를 추가합니다.
  3. 기기 추가를 완료한 다음 Xcode 화면 오른쪽 위의 재생 버튼을 클릭하여 실행합니다.

올바르게 실행되면 화면이 아래와 같이 표시됩니다.