kkoshin / azure-speech

azure speech wrapper
MIT License
0 stars 0 forks source link

iOS 端集成 SDK #1

Closed kkoshin closed 1 year ago

kkoshin commented 1 year ago

目前遇到点困难,azure-speech 的库是以 xcframework 的方式以 cocoapods 分发的,但尝试集成的过程中,没办法生成对应的 klib,以实现在 kotlin 端调用。

造成这个原因有以下几个猜想:

  1. kmm 目前就不支持 xcframework 的导入,虽然创建没啥问题
  2. 已知纯 swift 模块是无法在 kotlin 调用的,所以可能是这个 SDK 本身没有提供暴露给 OC 调用的接口。(这个看上去不太可能,目前官方 Sample 是支持 oc 集成的)
kkoshin commented 1 year ago

https://youtrack.jetbrains.com/issue/KT-55153/Parse-XCFramework-structure-for-linking-with-frameworks-inside

kkoshin commented 1 year ago

本地下载下这个 xcframework,然后拆分处对应的 framework ,最后单独导入?

https://kotlinlang.org/docs/multiplatform-mobile-ios-dependencies.html#add-a-framework-without-cocoapods

kkoshin commented 1 year ago

破案了,因为 pod 里的 name 是带 -iOS,但实际的 xcframework 里的 framework 名称是不带这个的,所以按照 cocoapods 的默认实现规则去实现 cinterop 会失败。

xcframework 看上去似乎只是给多个 framework 做了一次打包,并且按照一定的命名约定去区分不同的平台,本身也没做什么魔法

为了修复这个问题,比较原始的方式是,自己下载这个 xcframework,然后自己声明 def 文件,以及修改对应的 gradle 配置。 更优雅一点的做法是,声明 moduleName 来帮助默认实现work。

pod("MicrosoftCognitiveServicesSpeech-iOS") {
      version = "~> 1.25"
      packageName = "MicrosoftCognitiveServicesSpeech"
      // 这个moduleName一定要和 framework 的名称一致,或者说与 def 里的一致,不然,无法正确的完成 cinterop
      moduleName = "MicrosoftCognitiveServicesSpeech"
}
vickyleu commented 9 months ago
        //pod("TXIMSDK_Plus_iOS"){
        // version = libs.versions.tencent.imsdk.get()
        // packageName = "ImSDK_Plus"
       //  moduleName = "ImSDK_Plus"
        //}

        // xcframework 无法正常导入
        pod("TXIMSDK_Plus_iOS_XCFramework") {
            version = libs.versions.tencent.imsdk.get()
            packageName = "ImSDK_Plus" // 定义导出的kotlin包名,不写就会变成cocoapods.${moduleName}.xxx
            // 这个moduleName一定要和 framework 的名称一致,或者说与 def 里的一致,不然,无法正确的完成 cinterop
            moduleName = "ImSDK_Plus" // 参考/build/shared/cocoapods/defs/里面的modules名称,没有后缀
}

就算定义了XCFramework的moduleName也不可以,大佬你有解决方案吗?