将macOS应用程序带到iOS

最近,我们将心爱的Mac应用程序Kaleidoscope移植到了iPad。 iOS 11的生产力功能(例如拖放和增强的多任务处理)使其自然适用于平板电脑。 鉴于尝试使用此类端口的任务,我们必须首先确定要使其平稳过渡所需考虑的最重要的事项。

当iPhone最初发布时,史蒂夫·乔布斯发布了运行OS X的令人振奋的消息。尽管iPhone和其他相关设备的操作系统名称和功能会随着时间的推移而变化,但它们具有共同的传统,可以降低从以下位置移植应用程序的复杂性: macOS到iOS。 尽管平台之间的UI范例有所不同,但绝大多数框架和工具都是相同的。 但是,有一些有关UI和共享代码的重要因素需要引起我们的注意。

全面改革UI设计

macOS和iOS应用之间的主要区别在于macOS将AppKit用于其UI框架,而iOS使用UIKit。 AppKit包含重叠窗口,菜单和鼠标指针等概念。 UIKit包括Multitouch和一个窗口,该窗口根据应用程序的状态和上下文而变化。 苹果选择为iOS创建一个新的UI框架,因为这两个平台之间存在主要的UI范式差异。 因此,在创建Mac应用的iOS版本时,UI的设计将需要进行大修。 您应该为您的应用创建一个新的UI设计,使其在iOS上感觉很原生,并使用其惯用法。

注意创建或使用现有跨平台UI框架的诱惑。 这不仅很难解决,而且将来的OS版本可能会破坏您的框架,这将需要不断的维护。 最后,尝试使您的UI跨平台,您将有可能通过更多的工作获得更差的结果。 苹果制作了两个单独的UI框架是有原因的。

创建共享代码框架

应用程序中将包含共享代码的部分是模型,该模型以独立于UI的方式描述了应用程序的数据和行为。 如果您不是以这种方式设计应用程序,那么您需要做一些工作。 即使您试图创建一个干净的模型,您也很可能会发现需要做些工作的地方。

共享代码的最佳方法是创建一个框架。 您将需要为共享框架的macOS和iOS版本创建单独的目标。 通常,针对您的框架目标的一个好的命名方案是MyAppCore-macOS和MyAppCore-iOS。 您还需要创建一个新的iOS应用程序目标。 您的两个应用程序目标都需要将相应的共享框架目标分配为目标依赖项,需要与之关联,并且需要包含在嵌入框架阶段。

识别共享框架的文件

接下来,您将开始艰苦的工作,以确定哪些源代码文件应成为框架目标的一部分。 两个框架目标都应包含相同的源代码文件列表,并且这些文件应从Mac应用程序目标中删除。 包含在您的共享框架中的主要候选对象是数据模型文件,例如核心数据类,网络客户端,实用程序类以及可以与UI分离并重复使用的应用程序的任何其他部分。 查找应用程序独立于UI的代码的一种方法就是简单地检查每个源代码文件的导入是否缺少UIKit。

单元测试以提高可靠性

如果在视图控制器中定义了很多行为,则需要将该行为重构为现有视图控制器使用的单独数据类型。 当您明确定义模型并将其与UI分离时,您的共享框架将是单元测试的理想之选。 您的模型是应用程序中最重要的部分,添加单元测试将确认其运行正常。 进行更改时,单元测试还有助于最大程度地减少错误。

几乎完美的契合

为macOS创建的应用程序似乎很适合iOS。 您的应用程序的许多逻辑和数据模型可以在平台之间共享。 但是请不要忽略这些重要的细节。 您面临的最大挑战是创建一个干净的体系结构,以将应用程序的模型与其UI分开。 在iOS的UIKit中重新考虑并重新实现应用程序的UI,您将顺利地从macOS过渡到iOS。

在App Store上下载适用于iPad的万花筒iPad,免费试用14天,然后让我们知道您的想法。