TED 3.0:有效使用旧版iOS代码

我不会经常谈论我为保持家中照明效果所做的工作,但是过去四年来,我花了很大一部分时间在TED for iOS应用程序上工作。 就发布的范围和更改量而言,3.0版本是我们在TED上进行的最大发布。 字幕功能是该应用程序现已以20种新语言本地化。 现在,全世界的用户都可以使用其母语从阿拉伯语到土耳其语来体验TED。

在后台,我们计划将应用程序本地化超过一年。 花了这么长时间?

历史课

适用于iOS的TED于2010年10月首次登陆App Store,并专门针对原始iPad发行。 TED for iOS 1.0旨在在iOS 3.2上运行。 在过去的六年中,随着苹果平台设备和功能的变化,我们一直在此基础上不断发展。 在TED期间(2012年9月至今),我看到了:

  • 视网膜图形,3x图形以及最终的矢量。
  • AVFoundation使我们轻松制作自己的自定义视频播放器(这是我的第一个TED项目!)。
  • 引入ARC替代了手动保留/释放。
  • XCTest替代OCTest。
  • 更大或更小的设备,例如iPad mini,iPad Pro,iPhone 5,iPhone 6和iPhone 6 Plus。
  • Auto Layout和size类可为管理所有这些新设备尺寸带来一些理智。
  • 小部件和自定义共享操作之类的应用程序扩展。
  • 哦,还有个叫Swift的小东西。

TED于2010年交付时,它完全是用Objective-C编写的,旨在在两种设备尺寸上工作:iPhone 3GS和原始iPad。 现在,我们支持从iPhone 4s到12.9“ iPad Pro等iPad的手机。在整个过程中,我们一直在更新相同的应用程序代码库。从未对iOS项目进行过全面的重写,有时可能很诱人。

装修您居住的房子

去年年初,我接任TED的首席开发人员,开始为TED投入更多的时间(TED一直最多是2个兼职开发人员,有时只有1个)。 这样一来,我们就可以将思维方式从维护现有应用程序以保持运转状态(偶尔添加功能)转变为尝试对移动目标更加雄心勃勃。 唯一的问题是我们的许多代码都在显示其年龄。 我列出了高水平的目标,以小规模的方式对应用进行现代化升级,以便我们仍然可以继续发布更新以使TED HQ开心,同时我消除了许多使我彻夜难眠的事情。

这些项目的第一个是对应用程序进行模块化。 由于我们的团队很小,并且有一群相当敬业的用户,他们可以快速升级,因此我们比大多数公司更快地使用最新版本的iOS SDK。 我将最低SDK设置为iOS 8,并开始将应用分解为单独的组件。 我们将其分为单独的动态框架,而不是其中包含所有代码的单个Xcode项目:

  • TED:主要的iOS应用
  • TEDData:与数据层和业务逻辑相关的类
  • TEDVideo:我们的自定义视频播放器
  • TEDCore:在所有不同框架之间使用的共享代码

通过对代码进行模块化,可以更轻松地开始对从未使用过XCTest的代码片段采用单元测试。 它还对工作流程有帮助,因此,如果我仅使用数据模型,则只能尝试编译TEDData,而不必等待并编译整个应用程序。

采用适应性

当我发现将应用程序本地化为20种语言在TED的优先事项列表中居于首位时,我很清楚地表明,该应用程序赖以生存的当前基础无法以允许开发的方式支持它团队要成功。 iPhone和iPad几乎都重复了该应用程序中的所有代码。 直到今年早些时候,当您在iPhone上启动TED应用程序时,我们才会根据您使用的是iPhone还是iPad,使用不同的界面元素集。 因此,例如,我们的“特色”选项卡具有FeaturedViewController_iPhone和FeaturedViewController_iPad,它们具有完全独立的界面元素。 最重要的是,此接口代码均未针对自动版式,尺寸类或情节提要进行更新。 实际上,除了偶尔的错误修复以外,大多数年来都没有触及过。

到目前为止,这是应用程序中最痛苦的部分,并且花了几个月的时间(您可以看到去年秋天我们发行版中的差距。)不仅要合并为一个UIApplicationDelegate,而且还要合并和清理TED界面尽可能使用尺寸类别,自动版式和情节提要。

我们在1月下旬将所有这些工作作为TED 2.6的一部分进行了交付。 您可能没有注意到使用该应用程序时发生了什么变化,但这是设计使然。 我们的成功指标是用户没有注意到任何变化。 但是,在内部,整个应用程序是在一个新的基础上构建的,这将使我们能够更快地移动并更接近于本地化。

采用Swift

从3.0版开始,TED代码库的大约20%用Swift编写。 这比去年同期的0%高。

当我重新编写Swift中的整个“ Surprise Me”选项卡作为测试用例以查看其运行方式时,我们编写的Swift代码的第一部分是适应性清理的一部分。 您以前听过成功案例,所以我是一个超级粉丝也就不足为奇了。 该代码不仅更简洁,易于阅读,而且数量更少。

在TED中采用Swift时,我很务实。 如果我们需要为现有功能接收新的设计,则需要完成在Swift中重写代码的过程。 如果遇到一些不适合重写的Objective-C代码,我会花一些时间向它添加可空性属性,以便在我们在Swift中调用它时表现更好,这使整个混合代码基础体验更愉快。

由于Swift缺乏动态性,我失去了零睡眠。

测试和CI

作为移动开发团队,我们成熟的最后一个组成部分是构建我们的测试套件,并使其作为连续集成的一部分自动运行。 现在,所有提交都将在CI服务器上自动运行我们的测试套件,以确保我们不添加任何回归。 大多数(并非全部)新代码也都在附加了自动化测试的情况下编写。 在集成和UI测试方面,我们仍然有很大的差距,但最终我们会实现的。

我们的测试套件取得巨大成功的一个例子是本地化。 在iOS和TED API之间映射中文代码时,我们需要处理几种极端情况。 我们使用XCTest将所有操作自动化,从而无需运行应用程序和逐步调试程序即可非常轻松地理解代码的意图。

本地化过程

从2015年1月到2016年4月,这整个现代化过程都是断断续续地进行的。对应用程序进行本地化的实际过程是在最后四个星期内进行的。 由于我们已经完成了使应用程序尽可能多地在Auto Layout上运行的工作,因此导出和导入xliff文件意味着在测试实际界面时,我们只需要做很少的界面工作。 原来最大的麻烦是要调整一些按钮以支持多行,以支持更详细的语言,例如德语。

确实令我震惊的是,它的工作原理和效果都很好,但这证明了我们为构建此实际发行版所做的工作。 准备4个星期的工作需要16个月!

tl; dr

  • 您不必从头开始重写旧版应用程序。
  • 不要落后于苹果目前的功能,否则您最终会为此付出代价。
  • Swift很棒,但是Objective-C也很好。
  • 借助“自动版式”和“尺寸”类,本地化更加容易。
  • 单元测试和CI 值得的。

将TED应用程序带到我想要的位置,仍然需要做大量的内部和外部工作,但我对为实现此3.0版本所做的工作感到非常满意。 我希望你能检查一下