对于许多创业者来说,选择androids还是ioses永远是一个棘手的问题。最近,有数据显示androids 的市场份额已经突破80%。可能有不少人会觉得因此开发者在两个平台之间的选择就更加容易,毕竟市场决定利润。但事实上并不一定如此。软件工程师、 TechCrunch专栏作者Jon Evans从开发环境、配置、UX设计、语言、API、网络、分享、碎片化、发布等九个方面把androids和ioses平台做一次PK。
开发环境
许多人会用纯文本或者命令行写代码,但利用一个集成开发环境或者IDE显然更加有效率。
苹 果的开发环境是Xcode,具有运行速度快、功能强大且安全性高不易被入侵等特点。且随着不断完善优化,Xcode诡异的编译机制以及强加给开发者的那些 有关ioses应用程序对设备控制权的复杂证书机制也逐渐被开发者所忽略。且Xcode的调试器能够无缝完美调试Bug,模拟器的响应速度也非常快。
再 回头来看看androids。目前最先进的IDE是利用androids插件定制的Eclipse,非常糟糕。运行缓慢、笨拙等缺点显而易见,androids 碎片化也带来了不必要的复杂性。调试器非常糙,大部分时间让开发者自己在日志文件中除错,而Xcode则提供了除错工具。而模拟器,往往需要几分钟时间才 能够启动,还常常会连接不上androids Debug Bridge。
谷歌也已经发现了问题,现在他们准备推出一个新的androids Studio IDE:
androids Studio目前为试用版本。仍有不少功能不完整或尚未实现,所以您可能会遇到一些未知的错误信息。如果您不愿意使用一个未完成的产品,您可以下载(或继续)使用ADT Bundle(通过ADT插件定制的Eclipse)。
能够看到谷歌开始努力听起来是不错的,但,不知道猴年马月才能完整的实现。
结论:显然,ioses胜出。
配置
正 如前面写到的,在Xcode与Objective-C的完美搭配之下,隐藏着令人恐怖的编译机制。开发者需要面对宏、头文件、项目、计划以及构建配置等一 大串构建配置的列表。当遇到一个莫名其妙的连接器错误时,是不是有人会彻底绝望,虽然提示里写着:“噢,你的第三方代码不支持ARC,添加 –fno-objc-arc 标志即可解决!很简单不是吗?”
androids则相对简单的的,它有一个单独的manifest文件,当开发 者保存任何文件时,Eclipse通常会在整个系统中构建一次应用。当然,在权限没有配置正确导致应用程序不能运行的情况下,要是能够给出更明确的提示就 好了。总体来说,androids应用的配置相对简单容易。
结论:androids胜出
用户体验设计
在 这一项对比中,相信大多人都认为觉得苹果是胜者。Interface Builder是Mac OS X平台下用于设计和测试用户界面(GUI)的应用程序。虽然Mac OS X下所有的用户界面元素都可以使用代码直接生成;但IB能够使开发者简单快捷的开发出符合Mac OS X human-interface guidelines的GUI。通常开发者只需要通过简单的拖拽(drag-n-drop)操作来构建GUI就可以了。IB使用Nib文件储存GUI资 源,同时适用于Cocoa和Carbon程序。在需要的时候,Nib文件可以被快速地载入内存。
理论上将,androids平台也有一个具有 可比性的可视化工具,但还是不提了吧。androids平台上应用的开发将会面对各式各样不同的屏幕尺寸,这是它不可忽视的问题。当然,ioses设备的尺寸也 在逐渐多样化,ioses平台未来也一定会面临一样的问题。当然,androids也向开发者提供了icon包帮助开发者更加容易的完成UX设计。不过,ioses 开发者也可以利用一些第三方的icon包,比如Icons8。
在这项对比上,ioses尤其特殊的优势。首先,屏幕种类相对更加简单,只有三种(ipads、ipads mini及iphoness)尺寸和两种分辨率;其次是其默认的ioses视觉元素如弹出式菜单和消息,比androids的视觉效果更有吸引力。
结论:ioses更胜一筹
语言
androids是利用Java;ioses利用Objective-C。当然,也有例外,如Xamarin。相比Java,Objective-C显得较为啰嗦,比如,在Java中的这句定义字符串的语句:
String s2 = s1.replace(“abc”,”xyz”);
到Objective-C中变成了:
NSString *s2 = [s1 stringByReplacingOccurrencesOfString:@"abc" withString:@"xyz"];
但用Objective-C时间久了就会发现比Java更好更干净。Objective-C有代码块,Java没有;它有类别(categories),Java没有。Objective-C不需要开发者去用try/catch进行异常处理,Java需要。
当然,Java有其自己的优点。比如更好的堆栈追踪,这意味着追踪零星的错误更加容易。在几年前,androids在垃圾回收机制上一直有巨大的优势。而现在,ioses平台上有了自动引用计数,androids的优势也渐渐消失了。
结论:ioses的Objective-C胜出
API
androids 和ioses都给自己的开发者提供了巨大的软件库,广义上讲,这些库基本类似:提供手机功能及特点的API、提供网络访问功能、提供包括功能强大的 WebView(基本上可以实现一个完整浏览器的功能)在内的全套视图对象。最重要的是同时还提供控制器,基本上ioses ViewController与androids Acticity十分类似。
ioses提供了一组androids不具备的框架和特性——比如,没有一款androids系统能够提供媲美ioses Core Data framework的框架或其它特性。并且,ioses比androids更加干净,有着更好的设计。
另一个指标(有争议):代码行数。对于拥有相近功能的某个应用来说,ioses平台上通常利用1596行代码就可实现,包括头文件,而对于androids上的Java代码及XML,则需要2109行,多了32%。
结论:ioses更优
网络通信实现
现在大多数应用都采用互联网API,ioses和androids都提供了一整套工具和API帮助开发者实现这样的功能,都提供了非常类似的WebView——基本上相当于一个浏览器窗口,开发者可以将其插入到应用程序的任何位置。
网 络连接基本上都是在后台运行的,所以一般不会阻塞应用的主线程,多线程难度比较大。androids提供了一个AsyncTask类来解决类似的问题,虽然 有些冗长,但效果很好。androids另外还提供了一个简单的方法来判断用户是否在线。ioses也提供了差不多的东西,但相比之下显得低级,令人并不是那么 满意。
不过,也有一些开源库能够帮助开发者更好的实现ioses上的网络通信功能,比如AFNetworking。不过这个在androids上实现不了,因为Java不支持代码块。
结论:不考虑第三方库的情况下,androids有优势,而ioses在第三方库上具有优势。
分享
从应用中分享内容到社交网络上到底有多容易?原以为这是androids的一大利器,因为androids很早之前就有了一个功能强大的应用内通信系统Intents。通常情况下,androids仍然能够比较方便的实现应用之间的数据分享。
而在分享上,ioses已经基本追赶上androids了。这个大家可以自己判断下,GitHub上有两份有关分享Scanvine故事的源代码:androids版、ioses版。ioses代码比较长一点,因为我在其中加了一些Google Analytics代码。
结论:旗鼓相当
碎片化问题
这点的对比就无需多言了,androids的碎片化问题一直饱受诟病。但值得注意的是,谷歌正在着手进行碎片化整理工作,值得期待一下。
结论:显而易见,androids的问题严重
应用发布
androids 平台应用的发布非常简单,只需要通过一个简单的Eclipse引导签署你的应用,然后开发者就能拥有一个可以在任何androids平台运行的APK文件。 然后开发者可以将这个APK文件发布到各种平台上进行推广,用户安装即可。如果应用在使用中出现了问题,出现代码错误,开发者也能马上上传修复的版本供用 户下载。
而在ioses平台上发布一款应用简直就是一场噩梦。单在创建证书及Distribution Profiles环节,不少开发者就需要花费一天的时间来搞定。而测试工作,如果不是有TestFlight这样的应用,绝对是难以描述的糟糕。
结论:androids大胜
综 合来看,ioses比androids更有优势。虽然androids有自己的一些优势,但显然开发一款优秀的ioses应用比开发一款androids应用更加容易。 除自身因素之外,ioses用户人群相对高端(富裕、甚至可能有影响力),所以大部分开发者会选择ioses平台作为应用开发的第一平台。