やったこと
(KMPの文脈ではなく)純粋なKotlin/Nativeで生成した Swift(Objective-C)コードを、適当につくったXcodeのAppプロジェクトに取り入れる
仕組み
Kotlin/Native は Kotlinのコードを仮想マシンなしで実行できるネイティブ・バイナリにコンパイルする技術で 以下プラットフォームをサポートしている。
- macOS
- iOS, tvOS, watchOS
- Linux
- Windows (MinGW)
- Android NDK
Kotlinから iOS(macOS) 向けには framework に変換して使う。
また, XCFrameworkへの変換をサポートしてるプラグインも存在している。
(SPM へのサポートはしらべてないです。)
取り込み
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework
...
kotlin {
val xcf = XCFramework("shared")
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64(),
macosArm64(),
macosX64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "shared"
xcf.add(this)
}
}
}
iosTarget.binaries.framework
で XCFrameworkを生成するプラグインに追加する。
baseName
と XCFrameworkの指定する 引数(xcFrameworkName
)は 一致させないとビルドエラー
├── iosArm64
│ ├── debugFramework
│ └── releaseFramework
├── iosSimulatorArm64
│ ├── debugFramework
│ └── releaseFramework
├── iosX64
│ ├── debugFramework
│ └── releaseFramework
├── macosArm64
│ ├── debugFramework
│ └── releaseFramework
└── macosX64
├── debugFramework
└── releaseFramework
build/bin/
配下に ターゲットごとのFrameworkができる。
build/XCFrameworks
├── debug
│ └── shared.xcframework
└── release
└── shared.xcframework
そこから、./gradlew assembleSharedXCFramework
で XCFrameworkを生成。
codesign -s "Apple Development: Your Name (TeamID)" --force --deep --timestamp --options runtime shared.xcframework
生成した xcframework を署名する
オプションは以下👇
-
-s
"Apple Development: Your Name (TeamID)": Apple 開発者証明書を指定して署名を行う -
--force
: すでに署名されている場合でも、強制的に再署名を行う -
--deep
: コンテナ内のすべてのファイルやサブコンポーネントにも再帰的に署名する -
--timestamp
: 署名にタイムスタンプを付けて、後に証明書が失効しても署名が有効であることを保証する -
--options runtime
: Apple のセキュリティ機能(App Sandbox や SIP)に対応する署名を行う
あとは Xcode側で General > FrameWorks,Librares, and Embedded Content で 取り込む
参照するとこんな感じ
object Object {
val field = "A"
}
👇 Xcode で import sherad
から 見える部分
// Kotlinから NSObject にラップするためのコード等
~~
~~
public class Object : KotlinBase {
public convenience init()
open class var shared: Object { get }
open var field: String { get }
}
参考