0
0

Kotlin/Native で生成したSwiftコード を Xcodeプロジェクトに取り入れてみる

Posted at

やったこと

(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 で 取り込む

スクリーンショット 2024-09-15 21.27.09.png

参照するとこんな感じ

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 }
}

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0