0
1

More than 3 years have passed since last update.

Kotlin Multiplatform Mobileで作ったプロジェクトで実機ビルドができない場合の対応

Last updated at Posted at 2021-01-24

概要

プラグインKotlin Multiplatform Mobileを利用してプロジェクトを作った際、実機ビルドができないとなった時の対応。

エラー内容としては下記。

${Path}/iosApp.xcodeproj Building for iOS Simulator, but the linked and embedded framework 'shared.framework' was built for iOS.

原因

AndroidとiOS側で共有されている'shared.framework'がiOS Simulator用にビルドされていて、実機では使えないという話。

FWは以下のような処理を経て生成される。
具体的にはConfigurationを基に各ターゲット向けに生成されたFWをコピーし、xcode-frameworksという名前にしている。

shared/build.gradle.kts
val packForXcode by tasks.creating(Sync::class) {
    group = "build"
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
    val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
    val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-frameworks")
    from({ framework.outputDirectory })
    into(targetDir)
}

Gradleタスクを呼び出しは、iOSのBuild Phaseで行われている。
問題があるのはここ。

cd "$SRCROOT/.."
./gradlew :shared:packForXCode -PXCODE_CONFIGURATION=${CONFIGURATION}

Xcode10で最適化のため新しいbuild systemに移行された。
その際build phaseでの設定方法やその処理内容に変更が入り、ファイルに変更がなければbuild phaseのスクリプトも実行されなくなった。

詳しい変更内容は下記で確認。

そのため、shared:packForXCodeにおいても一度Simlulator向けにビルドすると、FWは存在しているので実行されなくなる。
xcode-frameworksを削除すれば、実機向けにもビルドできるが逆も然りで、この場合Simlulator向けにビルドできなくなる

${Path}/iosApp.xcodeproj Building for iOS Simulator, but the linked and embedded framework 'shared.framework' was built for iOS.

対応

Build Phaseではなく、SchemaのPre-ActionsでpackForXCodeを実行する。
注意が必要なのは Provided build settings fromも変更しておくこと。

Screen Shot 2021-01-24 at 9.48.25.png

0
1
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
1