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