You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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č

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:47:17