iOS、Mac 和绑定项目中的本机引用

使用本机引用可将本机框架嵌入 Xamarin.iOS、Xamarin.Mac 或绑定项目中。

自 iOS 8.0 起,可以在 Xcode 中创建一个嵌入式框架,用于在应用扩展和主应用之间共享代码。 使用本机引用功能,可以在 Xamarin.iOS 中使用这些嵌入式框架(使用 Xcode 创建)。

重要

无法从任何类型的 Xamarin.iOS 或 Xamarin.Mac 项目创建嵌入式框架,本机引用仅允许使用现有本机 (Objective-C) 框架。

术语

在 iOS 8(及更高版本)中,嵌入式框架既可以是嵌入式静态链接框架,也可以是动态链接框架。 要正确分发它们,必须将其制作成“厚重”框架,其中包括希望应用支持的每种设备体系结构的所有切片

静态框架与动态框架

静态框架在编译时链接,而动态框架在运行时链接,因此无需重新链接即可进行修改。 如果在 iOS 8 之前使用了任何第三方框架,则使用的是编译到应用中的静态框架。 有关更多详细信息,请参阅 Apple 的动态库编程文档。

嵌入式框架与系统框架

嵌入式框架包含在应用程序包中,并且只能由特定应用通过其沙盒访问。 系统框架存储在操作系统级别,可供设备上的所有应用使用。 目前,只有 Apple 才能创建操作系统级别框架。

精简框架与厚重框架

精简框架仅包含特定系统体系结构的已编译代码,而厚重框架包含多个体系结构的代码。 编译到框架中的每个特定于体系结构的代码库称为“切片”。 例如,如果有一个针对两个 iOS 模拟器体系结构(i386 和 X86_64)编译的框架,它将包含两个切片。

如果尝试将此示例框架与应用一起分发,则其可在模拟器上正确运行,但在设备上会失败,因为该框架不包含任何适用于 iOS 设备的特定于代码的切片。 为了确保框架在所有实例中都正常工作,它还需要包括特定于设备的切片,例如 arm64、armv7 和 armv7s。

使用嵌入式框架

要在 Xamarin.iOS 或 Xamarin.Mac 应用中使用嵌入式框架,必须完成两个步骤:创建厚重框架并嵌入该框架。

创建厚重框架

如上所述,为了能够在应用中使用嵌入式框架,必须使用厚重框架,其中包含运行应用的设备的所有系统体系结构切片。

当框架和消耗应用位于同一个 Xcode 项目中时,这不是问题,因为 Xcode 将使用相同的生成设置生成框架和应用。 由于 Xamarin 应用无法创建嵌入式框架,因此无法使用此方法。

要解决此问题,可以使用 lipo 命令行工具将两个或更多框架合并为一个包含所有必要切片的厚重框架。 有关使用 lipo 命令的详细信息,请参阅我们的链接本机库文档。

嵌入框架

使用本机引用在 Xamarin.iOS 或 Xamarin.Mac 项目中嵌入框架需要执行以下步骤:

  1. 创建新的或打开现有的 Xamarin.iOS、Xamarin.Mac 或绑定项目。

  2. 在解决方案资源管理器中,右键单击项目名称并选择“添加”>“添加本机引用”

    In the Solution Explorer, right-click on the project name and select Add Native Reference

  3. 从“打开”对话框中,选择要嵌入的本机框架的名称,然后单击“打开”按钮

    Select the name of the Native Framework to embed and click the Open button

  4. 该框架将添加到项目树中:

    The framework will be added to the projects tree

编译项目后,本机引用将嵌入到应用程序包中。

应用扩展和嵌入式框架

在内部,Xamarin.iOS 可以利用此功能与 Mono 运行时(作为框架)链接(当部署目标 >= iOS 8.0 时),从而大大缩小带有扩展的应用的应用大小(因为 Mono 运行时仅在整个应用程序包中包含一次,而不是在容器应用和每个扩展中各包含一次)。

扩展将与 Mono 运行时(作为框架)链接,因为所有扩展都需要 iOS 8.0。

没有扩展的应用和面向 iOS 的应用

总结

本文详细介绍了如何将本机框架嵌入 Xamarin.iOS 或 Xamarin.Mac 应用程序中。