在iOS和tvOS应用程序之间共享代码:比您想象的更普遍的基础

有比您想象的更多的共同点-重复使用,复制,回收以更快地进行成本节约型开发

如今,很难想象没有所有通讯设备的生活。 我们每天都在手机上看电视,讲话,发短信和发送电子邮件,和/或在计算机和游戏机上播放最新的视频。 如今,电视平台运营商意识到,他们的订户越来越多地要求他们必须通过电视和电视机轻松访问自己喜欢的在线和移动功能-所有在“非电视”设备上非常熟悉的“转到”应用,工具和娱乐频道-机顶盒(STB)。 因此,他们将投入数百万美元和欧元,以努力满足消费者的需求,并将这些服务作为独特而有吸引力的产品的一部分提供给观众。 面对日益激烈的竞争,电视服务提供商将竭尽全力在任何地方设法保留并进一步扩大其市场份额并战胜竞争的产品推出。 节约时间和投资的一种策略是,如果可能的话,尝试复制和重用已经建立的开发。 各地的开发团队都在尽力避免重新发明轮子。

可应用于多个设备平台而不是仅与一个设备平台兼容的开发活动正在变得越来越普遍。

从纯移动世界重用,复制和迁移创新以使电视应用开发环境受益的可能性比起初看起来的要大。

例如,第四代Apple TV于2015年10月发布,对于那些向消费者提供视频,音频和其他内容的公司而言,这是非常重要的日子。 您可能会问:自从2007年1月以来所有Apple TV投放市场之后,为什么这种迭代如此重要? 答案是因为只有第4代Apple TV附带了新的操作系统tvOS,并带有关联的应用商店,允许用户在其上安装第三方应用程序。 为新平台创建自己的品牌特定应用程序的新可能性促使公司开始考虑使用iOS和macOS将现有解决方案快速迁移到tvOS的策略。 他们的关键问题是:是否可以在iOS和tvOS之间共享代码库?

他们之间的差异揭示了这个问题的答案。 iOS和tvOS之间的最大区别是对用户交互的处理。 iOS服务是通过多点触控技术操作的,而对于tvOS,则是远程控制的。

苹果公司在UIKit中有一个名为“ 焦点引擎”的特定系统,可以在屏幕上的内容项之间进行导航。 正如Apple产品文档所解释的那样,大多数iOS框架也可以在tvOS中呈现,但是对于其中某些API来说,API有所限制。 这些限制通常与UIKit框架有关。 例如,某些类不存在(即,UIStatusBar,UIInterfaceOrientation,UIWebView,UISwitch等)。 另外,UISearchBar没有公共初始化程序,只能使用UISearchController创建。 此外,类的某些属性也不包括在内(例如,UIScrollView — scrollToTop,UITableView —eparatorStyle,UIViewController — preferredStatusBarStyle等)。

但是,尽管有这些框架的限制,但它们仍在tvOS中提供,我们可以在应用程序模型中使用相同的类,此外,我们还可以轻松共享视图代码和视图控制器。

有几种主要的方法来组织针对iOS和tvOS目标的开发:

  1. 具有共享代码链接库的单独项目;
  2. 工作区,包含共享代码的项目,iOS和tvOS目标的项目以及链接设置;
  3. 具有多个目标和条件编译的单个项目。

让我们分析每种方法。

  1. 带有链接库的单独项目

•干净的代码
•更少的构建时间(框架已经编译)
•即使对共享代码进行很小的更改也将需要大量时间

2.工作区,包含 共享代码 的项目

•易于更改共享代码
•增加了构建时间
•增加使用共享代码解决项目中冲突的时间

3.具有多个目标和条件编译的单个项目

•易于维护
•不像第一种和第二种方法那么干净,因为共享类与特定于平台的实现放置在同一位置

所有这些方法都是有效的,但是对于需要积极发展新功能且时间紧迫的项目,最大限度地减少运营损失非常重要。 在这种情况下,进行有条件编译可以满足多个目标的单个项目是最好的方法。

为了确保项目的结构合理,并避免可能引起混乱的混乱,您需要定义一系列代码分隔规则:

  1. 接口构建器文件具有多个版本,即EPG_mobile.storyboard和EPG_tv.storyboard,因为它们彼此不兼容。
  2. 可以在两个平台上编译并在两个平台上相同工作的代码包含在Mobile和TV目标中。
  3. 如果代码不能同时针对两个目标进行编译或需要以不同的方式工作(取决于目标),则可以使用以下方法来解决此问题:
  • 不建议使用条件编译指令(#if tvOS()),但可以将其用于短代码段,这些短代码段仅针对一个目标进行编译,否则很难提取。 这里要考虑的是,通过条件编译,很难注意到哪个代码属于哪个目标。
  • 接口习惯用法检查-使用运行时检查来确定设备类型。 仅与代码针对两个目标都进行编译的情况相关,但是行为上存在细微差异。 与前面的方法(a)一样,这也仅应用于小段代码。 如果特定的源文件有很多接口习惯用法检查,请考虑使用扩展名或子类将共享代码与特定于设备的代码分开。
  • 特定于设备的扩展-与目标相关的代码被提取到其他共享类型的单独扩展中,然后仅包含在相关目标(即RootViewController + Mobile)中。 对于没有针对不同目标的语义差异的类型,建议使用此方法。
  • 设备特定的子类-为每个目标创建一个单独的子类,其中包含代码差异,而共享代码则保存在超类中。 应该用于对不同目标具有语义差异的类型(例如,如果list在电视上具有二维布局,但在移动设备上仅是垂直布局)。

这些规则并不是解决所有可能问题的万能钥匙,但是,我的开发人员们,它们一定会使您的生活更轻松!

结论

实际上,iOS和tvOS之间有很多共性,您可以重用大多数代码平台。 借助严格的技术,智能的编码规则,周到的UI / UX设计和Apple工具,可以在有效构建多个应用程序的同时实现巨大的成本/时间/精力效率。

作者:Alexey Sergienko(3SS的iOS技术负责人), www.3ss.tv


最初于 2018 年5月14日 3ss.tv 发布

Interesting Posts