본문으로 건너뛰기

iOS 종속성 추가

Apple SDK 종속성(예: Foundation 또는 Core Bluetooth)은 Kotlin Multiplatform 프로젝트에서 미리 빌드된 라이브러리 세트로 사용할 수 있습니다. 추가 구성은 필요하지 않습니다.

iOS 소스 세트에서 iOS 에코시스템의 다른 라이브러리 및 프레임워크를 재사용할 수도 있습니다. Kotlin은 @objc 속성으로 해당 API가 Objective-C로 내보내지는 경우 Objective-C 종속성 및 Swift 종속성과의 상호 운용성을 지원합니다. 순수 Swift 종속성은 아직 지원되지 않습니다.

Kotlin Multiplatform 프로젝트에서 iOS 종속성을 처리하기 위해 cinterop 도구를 사용하여 관리하거나 CocoaPods 종속성 관리자를 사용할 수 있습니다(순수 Swift pod는 지원되지 않음).

cinterop 사용

cinterop 도구를 사용하여 Objective-C 또는 Swift 선언에 대한 Kotlin 바인딩을 생성할 수 있습니다. 이렇게 하면 Kotlin 코드에서 이를 호출할 수 있습니다.

단계는 라이브러리프레임워크에 따라 약간 다르지만 일반적인 워크플로는 다음과 같습니다.

  1. 종속성을 다운로드합니다.
  2. 종속성을 빌드하여 해당 바이너리를 가져옵니다.
  3. cinterop에 이 종속성을 설명하는 특수한 .def 정의 파일을 만듭니다.
  4. 빌드 중에 바인딩을 생성하도록 빌드 스크립트를 조정합니다.

라이브러리 추가

  1. 라이브러리 소스 코드를 다운로드하여 프로젝트에서 참조할 수 있는 위치에 놓습니다.

  2. 라이브러리를 빌드하고(라이브러리 작성자는 일반적으로 이 작업을 수행하는 방법에 대한 가이드를 제공함) 바이너리 경로를 가져옵니다.

  3. 프로젝트에서 .def 파일(예: DateTools.def)을 만듭니다.

  4. 이 파일에 첫 번째 문자열 language = Objective-C를 추가합니다. 순수 C 종속성을 사용하려면 language 속성을 생략합니다.

  5. 두 개의 필수 속성에 대한 값을 제공합니다.

    • headers는 cinterop에서 처리할 헤더를 설명합니다.
    • package는 이러한 선언을 넣을 패키지 이름을 설정합니다.

    예시:

    headers = DateTools.h
    package = DateTools
  6. 이 라이브러리와의 상호 운용성에 대한 정보를 빌드 스크립트에 추가합니다.

    • .def 파일의 경로를 전달합니다. .def 파일의 이름이 cinterop와 같고 src/nativeInterop/cinterop/ 디렉터리에 있는 경우 이 경로는 생략할 수 있습니다.
    • includeDirs 옵션을 사용하여 cinterop에 헤더 파일을 찾을 위치를 알려줍니다.
    • 라이브러리 바이너리에 대한 링크를 구성합니다.
    kotlin {
    iosArm64() {
    compilations.getByName("main") {
    val DateTools by cinterops.creating {
    // Path to the .def file
    definitionFile.set(project.file("src/nativeInterop/cinterop/DateTools.def"))

    // Directories for header search (an analogue of the -I<path> compiler option)
    includeDirs("include/this/directory", "path/to/another/directory")
    }
    val anotherInterop by cinterops.creating { /* ... */ }
    }

    binaries.all {
    // Linker options required to link to the library.
    linkerOpts("-L/path/to/library/binaries", "-lbinaryname")
    }
    }
    }
  7. 프로젝트를 빌드합니다.

이제 Kotlin 코드에서 이 종속성을 사용할 수 있습니다. 이렇게 하려면 .def 파일의 package 속성에서 설정한 패키지를 가져옵니다. 위의 예에서는 다음과 같습니다.

import DateTools.*

프레임워크 추가

  1. 프레임워크 소스 코드를 다운로드하여 프로젝트에서 참조할 수 있는 위치에 놓습니다.

  2. 프레임워크를 빌드하고(프레임워크 작성자는 일반적으로 이 작업을 수행하는 방법에 대한 가이드를 제공함) 바이너리 경로를 가져옵니다.

  3. 프로젝트에서 .def 파일(예: MyFramework.def)을 만듭니다.

  4. 이 파일에 첫 번째 문자열 language = Objective-C를 추가합니다. 순수 C 종속성을 사용하려면 language 속성을 생략합니다.

  5. 다음 두 개의 필수 속성에 대한 값을 제공합니다.

    • modules – cinterop에서 처리해야 하는 프레임워크의 이름입니다.
    • package – 이러한 선언을 넣을 패키지의 이름입니다.

    예시:

    modules = MyFramework
    package = MyFramework
  6. 프레임워크와의 상호 운용성에 대한 정보를 빌드 스크립트에 추가합니다.

    • .def 파일의 경로를 전달합니다. 이 경로는 .def 파일의 이름이 cinterop와 같고 src/nativeInterop/cinterop/ 디렉터리에 있는 경우 생략할 수 있습니다.
    • -framework 옵션을 사용하여 프레임워크 이름을 컴파일러 및 링커에 전달합니다. -F 옵션을 사용하여 프레임워크 소스 및 바이너리 경로를 컴파일러 및 링커에 전달합니다.
    kotlin {
    iosArm64() {
    compilations.getByName("main") {
    val DateTools by cinterops.creating {
    // Path to the .def file
    definitionFile.set(project.file("src/nativeInterop/cinterop/DateTools.def"))

    compilerOpts("-framework", "MyFramework", "-F/path/to/framework/")
    }
    val anotherInterop by cinterops.creating { /* ... */ }
    }

    binaries.all {
    // Tell the linker where the framework is located.
    linkerOpts("-framework", "MyFramework", "-F/path/to/framework/")
    }
    }
    }
  7. 프로젝트를 빌드합니다.

이제 Kotlin 코드에서 이 종속성을 사용할 수 있습니다. 이를 위해 package 속성에서 설정한 패키지를 가져옵니다. 위의 예에서는 다음과 같습니다.

import MyFramework.*

Objective-C 및 Swift interopGradle에서 cinterop 구성에 대해 자세히 알아보세요.

CocoaPods 사용

  1. 초기 CocoaPods 통합 설정을 수행합니다.

  2. 프로젝트의 build.gradle(.kts)pod() 함수 호출을 포함하여 사용하려는 CocoaPods 리포지토리에서 Pod 라이브러리에 대한 종속성을 추가합니다.

    kotlin {
    cocoapods {
    version = "2.0"
    //..
    pod("SDWebImage") {
    version = "5.20.0"
    }
    }
    }

    Pod 라이브러리에 대해 다음과 같은 종속성을 추가할 수 있습니다.

  3. IntelliJ IDEA에서 Reload All Gradle Projects(또는 Android Studio에서 Sync Project with Gradle Files)를 실행하여 프로젝트를 다시 가져옵니다.

Kotlin 코드에서 종속성을 사용하려면 cocoapods.<library-name> 패키지를 가져옵니다. 위의 예에서는 다음과 같습니다.

import cocoapods.SDWebImage.*

다음 단계

멀티플랫폼 프로젝트에서 종속성 추가에 대한 다른 리소스를 확인하고 다음에 대해 자세히 알아보세요.