我对KMP和iOS框架有一些依赖性问题。
以下是一些上下文:我有2个KMP模块:
- API模块:只定义接口
- 一个经典的lib使用API模块作为注入
我还有2个android项目和2个iOS项目:
- 安卓和iOS应用程序(使用KMP ClassicLib(
- 实现API模块的Android和iOS库
在Android上,我有以下内容:
// KMP API project
public interface Foo
// KMP libA project
public class Bar {
fun doSomething(foo: Foo)
}
// ANDROID: libB project
import API
public class FooImpl: Foo { }
// ANDROID app
import libA
import libB
var foo = FooImpl()
var bar = Bar()
bar.doSomething(foo) // <----- Everything is fine here
但在iOS上,我有这个:
// iOS app
import libA
import libB
var foo = FooImpl()
var bar = Bar()
bar.doSomething(foo) // <----- Error here : FooImpl is of type APIFoo but here LibAAPIFoo is excpected
事实上,当我查看生成的标题时,我有以下内容:
// KMP API.h
@protocol APIFoo
@end;
// KMP libA.h
@protocol LibAKAFoo // <----- here we have a redefinition of the protocol.
@end;
@interface Bar
- (void)doSomething:(KMPKAFoo)foo;
@ends;
我本以为会有更像的东西
// KMP API.h
@protocol APIFoo
@end;
// KMP libA.h
#include <API/API.h> // <----- import the API
@interface Bar
- (void)doSomething:(APIFoo)foo; // <----- use it
@ends;
我的build.gradle中是否缺少一个特殊的配置?我曾尝试在依赖项定义中使用compileOnly
,但它没有效果,并且具有与implementation
相同的行为
val commonMain by getting {
dependencies {
compileOnly("com.poc.sample:KMPAPI:0.0.1")
}
您不能创建多个Kotlin iOS框架并在同一项目中可互换使用它们。当Kotlin编译器创建iOS框架时;"自己的世界";,因为它包含了您所需要的一切(依赖项等(。这是一个大的二进制。
总结是,您想要的配置是不可能的。您可以在同一项目中使用多个Kotlin iOS框架,但它们需要完全独立。他们将无法相互交流。