ttypic / swift-klib-plugin

Gradle Plugin for injecting Swift code into Kotlin Multiplatform Mobile shared module
MIT License
207 stars 10 forks source link

Unable to publish multiplatform library for iOS #9

Open lammertw opened 1 year ago

lammertw commented 1 year ago

I'm trying to build a multiplatform library that uses CryptoKit. I've implemented code similar to the KCrypto example. When building a framework for iOS or when running a test on the iOS simulator, everything works fine. However, since I'm building a library, I want to publish it. I've added the maven-publish plugin to my build.gradle.kts file.

Now when I run publishIosSimulatorArm64PublicationToMavenLocal (or any other iOS publish task) it fail because it cannot find the types from the swift file.

In my build.gradle.kt:

swiftklib {
    create("KCrypto") {
        path = file("native/KCrypto")
        packageName("com.mylib.objclibs.kcrypto")
    }
}

native/KCrypto/PublicKeyEncoder.swift:

import CryptoKit
import Foundation

@objc public protocol PublicKeyEncoder {
    @objc func encodePublicKey(decompressedKeyData: Data) -> Data
}

In a iOS specific Kotlin (located in src/iosMain/kotlin:

import com.mylib.objclibs.kcrypto.*

Generates the following error:

e: file:///Users/[path]/src/iosMain/kotlin/com/mylib/ObjcDataCipher.kt:7:26 Unresolved reference: objclibs

As mentioned, this error only occurs when publishing. The same code runs fine in other scenarios.

kalinjul commented 11 months ago

I'm currently working on a library that needs publishing as well and I'm not having the issue you mentioned. Also Using CryptoKit: https://github.com/kalinjul/kotlin-multiplatform-oidc/tree/main/oidc-core

That said, your code looks just like mine...

IlyaGulya commented 3 months ago

Hello! Publishing of KMP libraries containing native code is somewhat complicated at the moment and require additional steps for publisher, such as writing cocoapods or spm definitions and publishing XCFramework somewhere accessible to library users. I'm currently making my own library using this plugin and once I'm done I will describe how to do it properly in a blog post. I will return in this issue once it's done 🙂