更新现有的 iOS 应用

按照以下步骤更新现有 Xamarin.iOS 应用以使用 Unified API。

更新现有应用以使用 Unified API 需要更改项目文件本身以及应用程序代码中使用的命名空间和 API。

改为使用 64 位

需要新的 Unified API 才能从 Xamarin.iOS 移动应用程序支持 64 位设备体系结构。 截至 2015 年 2 月 1 日,Apple 要求向 iTunes App Store 提交的所有新应用都支持 64 位体系结构。

Xamarin 为 Visual Studio for Mac 和 Visual Studio 提供工具,以自动执行从 Classic API 到 Unified API 的迁移过程,也可以手动转换项目文件。 虽然强烈建议使用自动工具,但本文将介绍这两种方法。

安装前...

在将现有代码更新到 Unified API 之前,强烈建议消除所有编译警告。 迁移到 Unified 后,Classic API 中的许多警告将成为错误。 在开始之前修复它们会更容易,因为 Classic API 中的编译器消息通常提供有关要更新的内容的提示。

自动更新

修复警告后,在 Visual Studio for Mac 或 Visual Studio 中选择现有 iOS 项目,并从“项目”菜单中选择“迁移到 Xamarin.iOS Unified API”。 例如:

Choose Migrate to Xamarin.iOS Unified API from the Project menu

在自动迁移运行之前,需要同意此警告(显然,在开始此冒险之前,应确保拥有备份/源代码管理):

Agree to this warning before the automated migration will run

该工具其实就是自动执行下面介绍的“更新手动”部分中概述的所有步骤,并且是将现有 Xamarin.iOS 项目转换为 Unified API 的建议方法。

手动更新的步骤

同样,修复警告后,请按照以下步骤手动更新 Xamarin.iOS 应用以使用新的 Unified API:

1.更新项目类型和生成目标

csproj 文件中的项目风格从 6BC8ED88-2882-458C-8E55-DFD12B67127B 更改为 FEACFBD2-3405-455C-9665-78FE426C6842。 在文本编辑器中编辑 csproj 文件,替换 <ProjectTypeGuids> 元素中的第一项,如下所示:

Edit the csproj file in a text editor, replacing the first item in the ProjectTypeGuids element as shown

将包含的 Xamarin.MonoTouch.CSharp.targetsImport 元素更改为 Xamarin.iOS.CSharp.targets,如下所示:

Change the Import element that contains Xamarin.MonoTouch.CSharp.targets to Xamarin.iOS.CSharp.targets as shown

2.更新项目引用

展开 iOS 应用程序项目的“引用”节点。 它最初将显示类似于此屏幕截图的 *broken- monotouch 引用(因为我们刚刚更改了项目类型):

It will initially show a broken- monotouch reference similar to this screenshot because the project type changed

右键单击 iOS 应用程序项目以编辑引用,然后单击 monotouch 引用,然后使用红色的“X”按钮将其删除。

Right-click on the iOS application project to Edit References, then click on the monotouch reference and delete it using the red X button

现在滚动到引用列表的末尾,并勾选 Xamarin.iOS 程序集。

Now scroll to the end of the references list and tick the Xamarin.iOS assembly

按“确定”保存项目引用更改。

3.从命名空间中删除 MonoTouch

using 语句中的命名空间中删除 MonoTouch 前缀,或者在类名已完全限定的位置进行此操作(例如 MonoTouch.UIKit 直接变为 UIKit)。

4.重新映射类型

引入了本机类型,以替换以前使用的一些类型,例如带有 CoreGraphics.CGRectSystem.Drawing.RectangleF 实例(示例)。 可以在本机类型页上找到类型的完整列表。

5.修复方法替代

某些 UIKit 方法的签名已更改,以使用新的本机类型(例如 nint)。 如果自定义子类重写这些方法,签名将不再匹配,并将导致错误。 通过更改子类以匹配使用本机类型的新签名,可以修复这些方法替代。

示例包括更改 public override int NumberOfSections (UITableView tableView) 以返回 nint,以及将 public override int RowsInSection (UITableView tableView, int section) 中的返回类型和参数类型更改为 nint

注意事项

将现有 Xamarin.iOS 项目从 Classic API 转换为新的 Unified API(如果该应用依赖于一个或多个组件或 NuGet 包)时,应考虑以下注意事项。

组件

应用程序中包含的任何组件也需要更新为 Unified API,否则在尝试编译时会出现冲突。 对于任何包含的组件,请将当前版本替换为支持 Unified API 的 Xamarin 组件存储中的新版本,并执行全新生成。 作者尚未转换的任何组件都将在组件存储中显示仅 32 位警告。

NuGet 支持

虽然我们贡献了 NuGet 的更改以使用 Unified API 支持,但尚未推出 NuGet 的新版本,因此我们正在评估如何让 NuGet 识别新 API。

在此之前,与组件一样,需要将项目中包含的任何 NuGet 包切换到支持 Unified API 的版本,然后执行干净生成。

重要

如果在将应用程序转换为 Unified API 之后收到以下形式的错误,这通常是因为项目中有组件或 NuGet 包尚未更新到 Unified API:“错误 3 无法在相同的 Xamarin.iOS 项目中同时包含 "monotouch.dll" 和 "Xamarin.iOS.dll" - "Xamarin.iOS.dll" 被显式引用,而 "monotouch.dll" 按 'xxx, Version=0.0.000, Culture=neutral, PublicKeyToken=null" 引用”。 需要删除现有组件/NuGet,更新到支持 Unified API 的版本并执行干净生成。

启用 Xamarin.iOS 应用的 64 位版本

对于已转换为 Unified API 的 Xamarin.iOS 移动应用程序,开发人员仍需要从应用的“选项”中为 64 位计算机启用应用程序生成。 有关启用 64 位版本的详细说明,请参阅 32/64 位平台注意事项文档中的启用 Xamarin.iOS 应用的 64 位版本

完成

无论是选择使用自动方法还是手动方法将 Xamarin.iOS 应用程序从 Classic API 转换为 Unified API,都有几个实例需要进一步的手动干预。 有关已知问题和解决方法,请参阅有关将代码更新到 Unified API 的提示文档。