上篇介绍了一些做高德地图的 iOS / Android MAUI 控件的主要知识。而今天我会重点介绍 iOS 原生库绑定的知识, 并告诉大家在绑定原生库过程的一些技巧,希望给到小伙伴一些启发。
认识 iOS 动态库和静态库
在绑定之前,我们需要学习一下 iOS 的动态库和静态库。最简单理解的方式是在 iOS 中静态库是以 .a 后缀结尾,动态库是以 .dylib 后缀结尾。无论静态库和动态库都可以打包成 Framework 。
静态库和动态库的区别
-
静态库的特点是编译时会把库文件直接拷贝一份到目标应用程序,而这个拷贝是驻留在目标应用程序里面的,所以编译完成后,静态库的文件就没有用了。但有个缺点就是,因为需要拷贝,所以生成的应用程序的容量会较大
-
动态库和静态库刚好是相反,编译的时候是不会拷贝到目标应用程序里面的,所以生成应用程序的体积较小,而且一个动态库可以共享给多个应用程序使用。但生成应用程序是依赖于动态库,这也导致经常会出现动态库找不到的情况。
我们来拆解一下高德地图基础的 SDK - AMapFoundationKit.framework
这里就包含了对应的头文件信息,模块信息,以及静态库。你可以清晰看到高德地图打包成 Framrwork 的实现。这也是我们对库概念的认识,编译好的二进制代码,向外暴露头文件给第三方开发者使用。
通过 Sharpie 工具生成 C# 调用的接口
Shapie 是一个非常好用的转换工具,它支持在 macOS 下对 Objective-C 的库的转。通过 Sharpie 可以对库文件给出的头文件进行转换完成 C# 的绑定。 在 MAUI 前身 Shapie 工具就已经存在 , 我经常就利用这个工具做转换。
因为这次高德地图的功能我用到 3D ,所以我会对高德的 AMapFoundationKit.Framework 和 MAMapKit.framework 两个 Framework 进行绑定转换。
转换 AMapFoundationKit.Framework
sharpie bind -framework AMapFoundationKit.framework -sdk iphoneos15.5
转换 MAMapKit.framework
sharpie bind -framework MAMapKit.framework -sdk iphoneos15.5
补充: MAMapKit.framework 依赖于 AMapFoundationKit.framework ,所以要放在一个相同的目录下。
这里面要注意,你需要安装好 Xcode ,建议安装到最新 ,并对应最新的 iOS SDK , 当然你也可以根据需要绑定不同版本的 iOS SDK , 你可以通过一次是命令查看环境
sharpie xcode -sdks
这里创建需要注意,现在 Visual Studio 2022 的模版都没有完成,现在大家用命令行创建,因为我们有两个项目,需要创建两个 Binding 的项目分别是
针对于 AMapFoundationKit.Framework 的项目构建
dotnet new iosbinding -o iOS.AMap.Foundation
生成好后,需要把 AMapFoundationKit.framework 放到 iOS.AMap.Foundation 的目录下, MAMapKit.framework 放到 iOS.AMap.3D 目录下。并把生成的 StructsAndEnums.cs 和 ApiDefinitions.cs 放到对应目录。
项目设置调整
- 在 Sharpie 生成的目录下 StructsAndEnum.cs ,而在构建的 Binding 目录下是 ApiDefinition.cs , 要把它替换掉。所以要对 .csproj 项目进行修改