迈步进入跨平台开发时代
跨平台开发的说法由来已久,但却从未像今天这样被各大厂商所重视。Google、非死book、英特尔、微软相继推出重大举措,支持和推动 App 开发商开发兼容 Android、iOS、Windows Phone 等平台的应用。而面对语言众多、平台众多、终端适配和开发成本高昂等问题时,App 开发商自身也迫切希望能具备跨平台开发的能力,以期达到降低开发成本、缩短开发周期、增多商业收益的目的。跨平台开发时代已经来临,你做好准备了吗?
流行的跨平台开发工具
在过去的一年,业内涌现出了一大批优秀的跨平台开发工具,大致上主要分为三类:Web 应用、Native 应用、混合应用。
自适应网页设计(也称“响应式网页设计”,如图 1 所示),是一种时下比较流行的网页设计技术,也算是一种在线 Web 应用。该设计使得网页可根据访问设备的特点以不同的风格样式进行展现。也就是说,可以让一个网站在手机上打开后,展现得像个本地应用一样,只要用户在手机 浏览器上输入网址就可以使用该“应用”的功能。这节省了开发 App 的成本,也不必为了在各个应用商店上更新发布 App 而烦恼——只要网站更新了,用户的“App”就会随之更新。时下比较流行的此类框架有:Bootstrap、Pure、Foundation、Ink、 Skeleton、ChocolateChip-UI 等。
PhoneGap 是一个推出时间相对较早的开源免费的跨平台移动 App 开发框架,一直以来都受到大量开发者的喜爱,从 iOS、Android、Windows Phone 到 Amazon、Firefox OS 等各大小主流移动平台一应俱全,而且也能使用地理位置、加速器、联系人等智能手机常见的核心功能。PhoneGap 框架主要使用的还是基本的 Web 开发技术(HTML、JavaScript、CSS),所以它在各平台上具有优越的兼容性,熟悉网页开发的开发者能低成本地快速开发跨平台应用。应用的性 能在经过分别优化后也大多可以接受。
Hybrid(混合)模式应用开发,其实质上就是一种中间件机制的应用程序框架,有人形容它是“Native 搭台,HTML5 唱戏”,近来受到了大量开发团队的追捧,成为一种主流开发模式。Titanium、AppCan、ionicFramework 等都是其中的佼佼者,尤其 AppCan 作为国产货,因为有较强的本地化文档和技术支持,被大量国内开发者关注。Web 前端开发工程师几乎可以零成本介入,快速做出漂亮的 UI 并满足大部分跨平台需求。无论是在什么系统下,混合应用可以实现几乎完全相同的交互体验。
Xamarin,虽然我们可以通过组织多个团队或雇用全栈程序员的方式,针对各个平台使用原生语言和开发工具分别开发出同一应用的 Native 版本,实现跨平台,但这个做法显然成本过高,而且应用程序生命周期也很难控制。Xamarin 则可以通过一种编程语言搞定所有平台的 Native App 开发,这个语言就是C#。时下依然有很多人把 C# 语言跟 .NET 做等同认知,认为 C# 只能编写 .NET 应用程序,而且只能在微软的平台上跑,这是一种非常错误的观点。C#是一种优秀的计算机编程语言,支持 .NET、Mono,但也可以编写非托管应用,甚至是操作系统。Xamarin 是开源项目 Mono 的商业化运作公司,它的跨平台开发工具名也叫 Xamarin。Xamarin 可以使用 C# 调用各个平台系统的原生 UI 和底层 API,可以极高程度地保证应用性能和 UI 流畅性。用 Xamarin 开发跨平台应用程序,可以方便地使用 C# 语言的很多先进特性和第三方类库,例如 LINQ、Lambdas、XDocument、事件与委托、并行运算、JSON.NET 等。在商业版订阅下,还可使用 Visual Studio 开发,当然也可以使用 TFS 让团队协作更便捷。需要注意的是,时下最流行的游戏引擎 Unity 也是主要用 C# 开发的。
LiveCode 是一种相对比较特殊的跨平台开发工具,它使用了近乎人类语言的方式开发应用程序,使得开发简单应用时的效率大幅增加,而且相当亲民。其客户也不乏类似大型航空公司等极重量级的企业。
跨平台开发工具的对比
Web 应用可以完全由 Web 前端工程师开发,只要智能设备连上网络并安装了合适的浏览器就可以通过 URL 访问“应用”,而 Web 工程师只要更新服务器上的文件,就可以实现对此“应用”的更新,无论时间成本还是维护成本都非常低廉。但恰恰是 Web 应用的优点导致了它的如下缺点。
1. Web 应用必须连线访问,在网络条件不好的情况下启动速度会极慢。而且每次启动都会因为网络访问和 UI 资源(比如图片)的下载,造成用户手机流量的浪费,这在 2G 网络条件下就会尤其明显。优化不好的话,还可能造成用户手机欠费停机。
2. 各平台下的浏览器多种多样,页面渲染效果和 JavaScrip 的运行效率有较大差异,要想保证 UI 一致性,需要做大量 CSS Hack 和 JavaScript 代码优化工作,但很多情况下你的优化不一定起到正面作用。
几乎无法使用设备本地的 API,尤其是底层 API,这使得 Web 应用的能力十分有限。
Hybrid(混合)应用开发模式,兼顾了 Web 和 Native。既有 Web 应用的低开发成本和跨平台相同 UI 交互的优点,又可以通过 JavaScript 访问常见的 Native API,还可以利用 HTML5 的 Local Storage 技术在本地离线存取数据。但既然称之为混合应用,就无法逃避混合技术的缺点。
1. Web 页面的渲染受限于 CSS,虽然可以到达各种设备几乎相同的 UI 交互,但丧失了平台默认的交互习惯,与 Native App 形成体验差别,增加了单平台用户的学习成本,降低了平台应用认同感。
各种智能手机平台对其内置的浏览器内核大多做过一些定制化“改进”,对于一些事件处理存在差异,尤其是 Android 系统,在全球有几千款不同的设备,再加上操作系统版本的差别,Web App 很难做到真正意义上的跨平台。
2. 虽然是混合应用,但应用界面依然没有脱离浏览器,所以混合应用依然无法达到 Native App 的性能和流畅性。
3. 对非稳定网络的运行环境难以细化控制,复杂条件下用户体验可能极差。
4. 在内存管理方面近乎无能,常会因此造成应用崩溃。
5. 受 JavaScript 语言的限制,一些相对底层的功能实现难度明显增加。
Xamarin 可以通过 C# 这一种语言编写主流平台的真正 Native App,其通过强大的编译器平衡了应用开发效率和应用执行效率,尤其是对使用 C# 开发的程序员而言,是莫大诱惑。Google、苹果、微软三大巨头与其都有深层合作关系,这使得 Xamarin 总能在第一时间推出新平台的 SDK。以 iOS7 为例,iOS7 发布当天下午,Xamarin 就跟进发布了 iOS7 SDK 的正式版,这使得 App 开发商几乎可以零滞后地跟进新系统平台的 App 开发。在北美市场,Xamarin 开发工具已经非常火热。当然,Xamarin 目前也存在不少缺点。
1. 相对于 HTML、CSS、JavaScript 而言,C#的学习成本偏高,无法使无编程经验者达到几天入门的程度。
2. iOS 的应用开发虽然可以在 Windows 上做,但调试过程依然无法脱离 Mac 系统,团队内至少要有一台 Mac 系统的机器作为 Build Host。
3. 对于 iOS、Android、Windows Phone 系统平台分别做 UI 时,尚未推出统一的可视化设计工具。不过庆幸的是,目前 Xamarin 内部已开发了测试版,相信不久便可以正式公开发布。
4. 对中国个人开发者而言,商业授权版本价格有些偏高,难以大规模普及推广。
5. 中文资料偏少,尚需官方和社区共同参与完善。
跨平台开发工具选型
前面对主流跨平台开发方案做了一些对比,大家应该有了一些基本概念,那么,如何选择最适合自己的跨平台开发工具,则成为了一个不小的难题。这里我根据自己的经验给出一些建议,供大家参考。
1. 选择开发工具就像娶媳妇儿,不要选择最好的,要选最合适的。
2. 如果开发团队成员完全没有 App 开发经验,客户应用场景也不会受到网络影响,功能主要是数据的增删改查,不需要平台本地 API,那么 Web App 是个不错的选择,尤其是响应式设计,客户接受度会比较高,尤其是企业应用的客户。
3. 如果需要使用少量平台本地 API,对应用程序也没有较为严苛的性能要求,Hybrid 应用绝对是最佳选择,因为它的性价比极高。
4. 当碰到 Web 性能瓶颈无法逾越;希望使用完善的应用程序生命周期;希望缩减 Native App 开发团队成本;希望使用一种开发语言,却还希望使用各平台下特有的第三方类库时,Xamarin 是个不错的选择。虽然看起来授权价格不低,但从总体成本来看,节省了不少。
5. 微软在最近的 Build 大会上将 WinJS 开源了,并且承诺将会支持 iOS、Android 等平台。一旦目标达成,这也是一种不错的选择,尤其是对苦逼的 Windows Phone 开发者们而言。
6. LiveCode 从某种程度上来说,更应该算是一种亲民的编程语言,期望让所有人都能轻松开发一个 App,但作为一种解释性语言,是否能被专业开发者接受是个值得探讨的问题。
结束语
跨平台开发即将成为主流趋势,作为开发商或开发者,具备跨平台开发能力成为必需。想一想,就连过去最不愿意提及跨平台和开源的微软都敞开胸怀,拥抱跨平台,并且开源和免费了,我们还有什么理由原地踏步,固步自封呢?行动起来,一起迈步进入跨平台开发时代!
本文来自《程序员》杂志电子刊 2014 年 05 期。