Kotlin Multiplatform无法调用Swift Wallet类,求排查解决
解决Kotlin Multiplatform调用Swift Wallet类的问题
1. 确认Swift类的生成头文件有效性
你的Swift类已经添加了@objc public修饰符,这部分没问题,但要先验证Xcode自动生成的iosApp-Swift.h文件是否正确包含了Wallet类的声明。直接在Xcode中打开该文件,检查是否存在类似以下的代码:
SWIFT_CLASS("_TtC6iosApp6Wallet") @interface Wallet : NSObject - (NSString * _Nonnull)getPrivateKey; @end
如果没有找到,选中Wallet.swift文件,在右侧检查器中确认Target Membership已勾选对应的iOS App目标。
2. 修正桥接头文件配置
不需要手动在桥接头文件中编写Wallet的Objective-C声明,这会导致重复定义冲突。保持桥接头文件内容如下即可:
#ifndef iosApp_Bridging_Header_h #define iosApp_Bridging_Header_h #import "iosApp-Swift.h" #endif /* iosApp_Bridging_Header_h */
同时在Xcode项目设置中,确认Objective-C Bridging Header的路径正确(例如iosApp/iosApp-Bridging-Header.h),且Generated Interface Header Name设置为iosApp-Swift.h(默认与项目名一致)。
3. 配置KMP项目的iOS依赖
在KMP项目的build.gradle.kts(或build.gradle)中,确保iOS目标正确依赖包含Swift类的模块。如果你的Swift类在iOS App目标中,需要配置KMP的iOS框架依赖该App目标;更推荐的做法是将Swift类移到单独的iOS框架中,再让KMP依赖这个框架:
kotlin { ios { binaries { framework { baseName = "shared" transitiveExport = true // 确保依赖的框架能被Kotlin识别 } } } // 其他平台配置... }
4. 完善actual类的实现
当前的WalletMP类只是返回空字符串,需要修改为实际调用Swift的Wallet类:
// 若Swift类在iosApp目标中,需先导入 import iosApp.Wallet actual class WalletMP actual constructor() { actual fun getPrivateKey(): String { val swiftWallet = Wallet() return swiftWallet.getPrivateKey() } }
5. 清理重建项目
- Xcode端:执行
Cmd+Shift+K清理项目,再删除Derived Data目录 - KMP端:执行
./gradlew clean命令清理构建缓存 - 先重新构建Xcode项目,再构建KMP项目
内容的提问来源于stack exchange,提问作者Alen Prošič
相关产品推荐
相关产品推荐

