第 1 部分 - 了解 Xamarin 移动平台

Xamarin 平台包含许多元素,可用于开发适用于 iOS 和 Android 的应用程序:

  • C# 语言 - 允许使用熟悉的语法和成熟的功能,例如泛型、LINQ 和并行任务库。
  • Mono .NET framework - 提供 Microsoft .NET Framework 中的广泛功能的跨平台实现。
  • 编译器 - 根据平台生成原生应用(例如 iOS)或集成的 .NET 应用程序和运行时(例如 Android)。 编译器还会对移动部署执行许多优化,例如链接掉未使用的代码。
  • IDE 工具 - Mac 和 Windows 上的 Visual Studio 支持创建、生成和部署 Xamarin 项目。

此外,由于基础语言是 .NET Framework 的 C# ,因此可以构建项目来共享同样可部署到 Windows Phone 的代码。

揭秘

尽管 Xamarin 支持在 C# 中编写应用,并跨多个平台共享同一代码,但每个系统上的实际实现有所不同。

编译

C# 源在每个平台上以不同的方式进入原生应用:

  • iOS - C# 预先 (AOT) 编译为 ARM 汇编语言。 .NET Framework 包含在内,链接期间未使用的类会被删除,以减少应用程序大小。 Apple 不允许在 iOS 上生成运行时代码,因此某些语言功能不可用(请参阅 Xamarin.iOS 限制)。
  • Android - C# 编译为 IL,并使用 MonoVM + JIT 打包。 在链接期间,框架中未使用的类会被删除。 应用程序与 Java/ART(Android 运行时)并排运行,并通过 JNI 与原生类型交互(请参阅 Xamarin.Android 限制)。
  • Windows - C# 编译为 IL,由内置运行时执行,不需要 Xamarin 工具。 按照 Xamarin 的指导设计 Windows 应用程序,可以更轻松地在 iOS 和 Android 上重用代码。 通用 Windows 平台还有一个 .NET Native 选项,其行为类似于 Xamarin.iOS 的 AOT 编译。

有关编译过程的这一部分的详细信息,请参阅 Xamarin.iOSXamarin.Android 的链接器文档。

应避免运行时“编译”(使用 System.Reflection.Emit 动态生成代码)。

Apple 的内核防止在 iOS 设备上生成动态代码,因此,在 Xamarin.iOS 中无法动态发出代码。 同样,动态语言运行时功能不能与 Xamarin 工具一起使用。

某些反射功能确实有效(例如,MonoTouch.Dialog 将它用于反射 API),但不能生成代码。

平台 SDK 访问

通过 Xamarin ,可使用熟悉的 C# 语法轻松访问特定于平台的 SDK 提供的功能:

  • iOS - Xamarin.iOS 将 Apple 的 CocoaTouch SDK 框架公开为可从 C# 引用的命名空间。 例如,包含所有用户界面控件的 UIKit 框架可随简单的 using UIKit; 语句一起包含在内。
  • Android - Xamarin.Android 将 Google 的 Android SDK 公开为命名空间,以便你可使用 using 语句引用受支持的 SDK 的任何部分,例如使用 using Android.Views; 来访问用户界面控件。
  • Windows - Windows 应用是使用 Windows 上的 Visual Studio 构建的。 项目类型包括 Windows 窗体、WPF、WinRT 和通用 Windows 平台 (UWP)。

面向开发人员的无缝集成

Xamarin 的美妙之处在于,尽管后台存在差异,但 Xamarin.iOS 和 Xamarin.Android(加上 Microsoft 的 Windows SDK)提供了无缝体验,便于编写可跨所有三个平台重用的 C# 代码。

可编写一次业务逻辑、数据库使用、网络访问和其他常见函数,并在每个平台上重复使用,这为平台特定的用户界面提供了基础,这些界面看起来和执行起来都像原生应用程序。

集成开发环境 (IDE) 可用性

可以在 Mac 或 Windows 上的 Visual Studio 中完成 Xamarin 开发。 你选择的 IDE 将由你想要面向的平台确定。

只能在 Windows 上开发 Windows 应用,因此若要为 iOS、Android 和 Windows 进行构建,需要 Visual Studio for Windows。 但是,可以在 Windows 和 Mac 计算机之间共享项目和文件,因此可以在 Mac 上构建 iOS 和 Android 应用,共享代码稍后可添加到 Windows 项目中。

要求指南中更详细地探讨了每个平台的开发要求。

iOS

要开发 iOS 应用程序,需要使用运行 macOS 的 Mac 计算机。 还可以在 Visual Studio 中使用 Xamarin 编写和部署 iOS 应用程序。 但是,出于构建和许可目的,仍然需要 Mac。

必须安装 Apple 的 Xcode IDE 才能提供编译器和模拟器进行测试。 你可在自己的设备上免费进行测试,但要构建应用程序进行分发(例如 App Store),你必须加入 Apple 开发人员计划(每年 99 美元)。 每次提交或更新应用程序时,都必须经过 Apple 的审查和批准,然后才可供客户下载。

代码是使用 Visual Studio IDE 编写的,可通过编程方式构建屏幕布局,也可在 Mac 上使用 Xcode 编辑布局。

有关进行设置的详细说明,请参阅 Xamarin.iOS 安装指南

Android

要开发 Android 应用程序,需要安装 Java 和 Android SDK。 SDK 提供构建、部署和测试所需的编译器、模拟器和其他工具。 Java、Google 的 Android SDK 和 Xamarin 的工具都可以在 Windows 和 macOS 上安装和运行。 推荐进行以下配置:

  • 带 Visual Studio 2019 的 Windows 10
  • 带 Visual Studio 2019 for Mac 的 macOS Mojave (10.11+)

Xamarin 提供了一个统一的安装程序,它将使用必备的 Java、Android 和 Xamarin 工具(包括屏幕布局的可视化设计器)来配置系统。 有关详细说明,请参阅 Xamarin.Android 安装指南

可以在没有任何 Google 许可证的真实设备上构建和测试应用程序,但是若要通过应用商店(例如 Google Play、Amazon 或 Barnes & Noble)分发应用程序,可能需要向运营商支付注册费用。 Google Play 会立即发布你的应用,而其他应用商店的审批过程与 Apple 的类似。

Windows

Windows 应用(WinForms、WPF 或 UWP)是使用 Visual Studio 构建的。 它们不直接使用 Xamarin。 但是,可以跨 Windows、iOS 和 Android 共享 C# 代码。 若要了解 Windows 开发所需的工具,请访问 Microsoft 的开发人员中心

创建用户界面 (UI)

使用 Xamarin 的主要好处是,应用程序用户界面在每个平台上都使用本机控件,创建的应用程序与使用 Objective-C 或 Java(分别针对 iOS 和 Android)编写的应用程序没有区别。

在应用中构建屏幕时,你既可在代码中设置控件布局,也使用每个平台可用的设计工具创建完整的屏幕。

以编程方式创建控件

在每个平台中,都可使用代码将用户界面控件添加到屏幕。 这可能很耗时,因为在硬编码控制位置和大小的像素坐标时,很难可视化已完成的设计。

不过,通过编程方式创建控件确实有好处,尤其是在 iOS 上,可构建根据 iPhone 和 iPad 大小进行调整和不同呈现的视图。

可视设计器

每个平台都有不同的方法来直观布局屏幕:

  • iOS - 情节提要包含多个视图和控件,可在项目中包含的 .Storyboard 文件中访问。
  • Android - Xamarin 为 Visual Studio 提供了一个 Android 拖放式 UI 设计器。
  • Windows - Microsoft 在 Visual Studio 和 Blend 中提供了一个拖放式 UI 设计器。 屏幕布局存储为 .XAML 文件。

以下屏幕截图显示了每个平台上可用的可视屏幕设计器:

These screenshots show the visual screen designers available on each platform

在任何情况下,都可以在代码中引用你直观创建的元素。

用户界面注意事项

使用 Xamarin 构建跨平台应用程序的主要好处是,这些应用程序可以利用本机 UI 工具包来向用户呈现熟悉的界面。 UI 的运行速度也将与任何其他本机应用程序一样快。

某些 UI 隐喻可跨多个平台使用(例如,所有三个平台都使用类似的滚动列表控件),但是为了让应用程序“感觉”正确,UI 应在适当时利用特定于平台的用户界面元素。 特定于平台的 UI 隐喻示例包括:

  • iOS - 带有软后退按钮的分层导航,屏幕底部的选项卡。
  • Android - 硬件/系统软件后退按钮、操作菜单、屏幕顶部的选项卡。
  • Windows - Windows 应用可以在台式机、平板电脑(例如 Microsoft Surface)和手机上运行。 例如,Windows 10 设备可能具有硬件后退按钮和动态磁贴。

建议阅读与目标平台相关的设计指南:

库和代码重用

Xamarin 平台支持跨所有平台重用现有的 C# 代码,还支持集成每个平台本机编写的库。

C# 源和库

Xamarin 产品使用 C# 和 .NET Framework,因此可以在 Xamarin.iOS 或 Xamarin.Android 项目中重用大量现有的源代码(开源项目和内部项目)。 通常,只需将源添加到 Xamarin 解决方案,它将立即工作。 如果使用了不受支持的 .NET Framework 功能,则可能需要进行一些调整。

可在 Xamarin.iOS 或 Xamarin.Android 中使用的 C# 源示例包括:SQLite-NET、NewtonSoft.JSON 和 SharpZipLib。

Objective-C 绑定 + 绑定项目

Xamarin 提供了一个名为 btouch 的工具,可帮助创建允许在 Xamarin.iOS 项目中使用 Objective-C 库的绑定。 若要详细了解如何执行此操作,请参阅绑定 Objective-C 类型文档

可在 Xamarin.iOS 中使用的 Objective-C 库示例包括:RedLaser 条形码扫描、Google Analytics 和 PayPal 集成。 GitHub 上提供了开源 Xamarin.iOS 绑定。

.jar 绑定 + 绑定项目

Xamarin 支持在 Xamarin.Android 中使用现有的 Java 库。 若要详细了解如何从 Xamarin.Android 使用 .JAR 文件,请参阅绑定 Java 库文档

GitHub 上提供了开源 Xamarin.Android 绑定。

通过 PInvoke 使用 C

“平台调用”技术 (P/Invoke) 允许托管代码 (C#) 调用本机库中的方法,并支持本机库回调到托管代码。

例如,SQLite-NET 库使用如下语句:

[DllImport("sqlite3", EntryPoint = "sqlite3_open", CallingConvention=CallingConvention.Cdecl)]
public static extern Result Open (string filename, out IntPtr db);

这会绑定到 iOS 和 Android 中的本机 C 语言 SQLite 实现。 熟悉现有 C API 的开发人员可以构造一组 C# 类,以映射到本机 API 并利用现有平台代码。 Xamarin.iOS 中有关于链接本机库的文档,类似的原则适用于 Xamarin.Android。

通过 CppSharp 使用 C++

Miguel 在他的博客中解释了 CXXI(现在称为 CppSharp)。 要直接绑定到 C++ 库,还可创建 C 包装器并通过 P/Invoke 绑定到该包装器。