是否可以在多平台Xamarin应用程序中使用以Kotlin编写的Android和iOS业务代码?

ubbxdtey  于 2022-12-07  发布在  Kotlin
关注(0)|答案(2)|浏览(181)

我有一些代码是用Java和Kotlin编写的; Java部分可以使用AndroidStudio翻译成Kotlin。这意味着,独立于任何硬件或平台细节;某些Android特定类(如"Bitmap")可以替换为抽象类或一般自定义类。
众所周知,Kotlin业务代码可以用于Android和iOS的多平台应用程序。Xamarin也用于多平台应用程序。
另一方面,有一种方法可以在Xamarin项目中包含Kotlin代码。为此,使用Xamarin.Kotlin.StdLib:是的。
我的问题:有没有可能开发一个Xamarin项目(可能使用Xamarin Forms),其中包括Kotlin业务代码,并将在Android和iOS环境中工作?

cfh9epnr

cfh9epnr1#

以下是一些说明。
1.Android Studio

  • 创建新方案:"文件-〉新建-〉新建模块-〉Kotlin

多平台共享模块"。

  • 请遵循以下说明:

https://kotlinlang.org/docs/multiplatform-mobile-integrate-in-existing-app.html直到"在Android上运行跨平台应用程序"。

  • 对于Android,我们已经完成。以下步骤仅适用于iOS。
  • 我们现在假设有一个名为"shared"的模块,如果这个模块有其他名称,请在下面的说明中替换它。

1.代码:
The following instructions are similar to that in https://kotlinlang.org/docs/multiplatform-mobile-integrate-in-existing-app.html#make-your-cross-platform-application-work-on-ios . The difference is that we don't want to build the app now, but a framework.

  • 文件新建-项目。
  • 选择"框架"的模板,然后单击"下一步"。
  • 选择产品名称(例如"KmmExample")。语言:目标C
  • 生成阶段-新运行脚本阶段:
cd "$SRCROOT/.."
 chmod +x gradlew
 ./gradlew :shared:embedAndSignAppleFrameworkForXcode
  • 将"运行脚本"阶段上移,使其位于"依赖项"项之后。
  • 在"生成设置"选项卡上,切换到"全部"生成设置。
  • 在"搜索路径"段落中,指定调试和发布的框架搜索路径:
$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)
  • 在链接段落中:
  • 将"Mach-O类型"指定为"静态库"。
  • 将其他链接器标志指定为
$(inherited) -framework shared
  • 在"体系结构"段落中,"体系结构"可以保持不变,也可以更改为"$(ARCHS_STANDARD_INCLUDING_64_短距)"。
  • 建置项目。
  • 如果成功,在"shared/build"中会有一个文件夹结构。会有一个子文件夹"xcode-frameworks"。在"Debug"或"Release"目录中,会有一个带有iOS设备或模拟器名称的子文件夹。例如,"iphonesimulator15.5"。它包含另一个子文件夹:"shared.framework"。在"头"中,您会发现一个"shared.h",还有库本身:"shared"。(在"shared/build"文件夹中还有一个"bin"目录,其中的设备和模拟器名称包含"debugFramework"和类似的结构。)

1.目标Sharpie

型号:
/sharpieOutput--名称空间=共享--sdk iphoseos15.5-作用域。/共享。/共享的/构建/xcode-框架/调试/iPhone模拟器15.5/共享的框架/头文件/共享的. h
(请将"iphoneos15.5"替换为正确的SDK,将"Debug/iphonesimulator15.5"替换为正确的文件夹名称)您也可以选择另一个命名空间来代替"Shared"。它将在ApiDefinitions.h中指定。

  • 如果成功,"ApiDefinitions.cs"将位于新的子文件夹"SharpieOutput"中。

1.视觉工作室/Xamarin
使用Visual Studio 2019或2022或更高版本。

  • 创建一个新的解决方案,例如"MyApp"。
  • "MyApp"应包含四个项目:"我的应用程序"、"我的应用程序.安卓"、"我的应用程序. iOS"。
  • 在这里,我们不谈"MyApp.Android"。
  • 右键点击解决方案名称并添加一个"新项目"。选择"iOS-库-绑定库"。它的名称可能是"MyApp.iOS.Binding"。
  • 将ApiDefinitions.cs替换为前面步骤中创建的ApiDefinitions.cs。
  • 将"共享"库(由XCode在上述步骤之一中创建)添加为"本机库"。
  • 在ApiDefinitions.cs上按一下鼠标器右击,然后将“建置动作”变更为“ObjcBindingApiDefinition”。
  • 当您现在开启ApiDefinitions.cs时,您可能会看到许多错误和标记行。它们可能会以下列方式行程:
  • For the "[Verify]" attribute, please check here: https://learn.microsoft.com/en-us/xamarin/ios/platform/binding-swift/walkthrough#build-a-binding-library , section 5.
    • 如果"NativeHandle"产生编译器错误,请在顶部添加:*
#if !NET
      using NativeHandle=System.IntPtr;
      #endif
    • 您可以删除带有共享模块的"using"("using shared")*
    • 如果遇到类似"无法在静态类中声明示例成员"(CS0708)和"静态类无法实现接口"(CS0714)的错误:尝试注解掉或删除属性"[Category]"。*
    • 如果产生错误,则可以删除"[不可用(PlatformName. Swift)]"。*
  • Handle typed classes resp. Interfaces with "". For example, the "" attribute should be added to some interfaces representing typed classes. In some cases special handling is necessary.
    • CS0246:在某些情况下,当找不到元素时,属性"[BaseType(typeof(SharedBase))]"可能会有帮助(假设SharedBase界面定义在此档案的开头)。*
    • 如果在生成运行期间出现警告CS8767("... hidden inherited member"),请在这些成员上方添加特性 [Override]。但是,对于"New()",请改为添加 "[New]"。*
    • 如果出现链接器错误MT5211 "本机链接失败,未定义Objective-C类...",请在接口定义前添加属性"[协议]":*
[BaseTye (typeof (NSObject))]
 [Protocol]
 public interface MyInterface { … }
    • 其他编译器/链接器错误(例如,"......是为更新的iOS版本(......)构建的,而不是链接的......")可能会在此之后导致警告。*
  • "MyApp"项目包含所有与平台无关的代码。那些包含与平台相关的部分的类应定义为接口。

  • "MyApp. Android"和"MyApp. iOS"应该实现这些接口。对于"MyApp. iOS","MyApp"和"MyApp. iOS. Binding"应该作为引用添加。实现这些接口的类现在可以使用ApiDefinitions.h中定义的接口。

说明结束。

qni6mghb

qni6mghb2#

我已经在另一个论坛-https://learn.microsoft.com/en-us/answers/questions/875957/use-business-code-for-android-and-ios-written-in-k.html-发布了同样的问题,我已经发布了一个可能的答案,请参见2022年7月19日的答案。是的,这是可能的,但不是直接的,而且是复杂的。

相关问题