Android的市场份额已经超过80%了,在这一背景下,创业公司永恒的问题“Android优先还是iOS优先”愈显棘手。不过也许经理们和非技术出身的创始人们不用操心这个问题,他们可以把这个烦心的问题交给开发者们!那开发者们是咋想的?很简单,谁能让他们更轻松,谁就能获得巨大的优势。
Techcrunch的专栏作者Jon Evans,同时也是HappyFunCorp(是不是很羡慕这个咨询公司的名字?)的工程师,为了让自己不手生,Evans编写并开源了两个私人宠物项目。这是近乎一模一样的Android和iOS应用。Evans以这两个应用为例,比较了Android和iOS的差异。
Evans之前编写了很多Android和iOS应用,有私人项目,也有工作项目。上面提到的两款应用都是原生应用,为Evans开发的新闻聚合器Scanvine编写。Scanvine可以识别出在社交媒体中分享得不同寻常之多的故事。两个应用的源代码放在Github上:( Android | iOS),可以通过Google Play或App Store)安装。
开发环境
Evans赞扬了苹果的Xcode,“它让人开发起来很愉悦”。Xcode漂亮、快速、强大,帮人而非扰人。Xcode的调试工具运行平滑,模拟器反应很灵敏。
Android则让Evans很失望。目前Android最先进的IDE是用Android插件定制的Eclipse,很糟。迟钝、笨重、反直觉、布局糟糕、不必要的复杂,简直就是一团糟。调试工具也非常笨拙,迫使Evans在大部分时间通过日志进行调试,和XCode的调试工具有天壤之别。Android的模拟器也慢得很,要花几分钟才能启动,其中差不多有一半时间没法连接到Android Debug Bridge。
公平地说,Google也知道这是一个问题,他们正在着手制作一款新的IDE,叫做Android Studio。不过Android Studio目前仅仅提供先期预览版。很多功能不完整或者干脆没有。用户有时也会遇到错误。
优势:iOS甩了Android几条街。
配置
Evans指出,在Xcode和Objective-C漂亮、无缝的外表之下,隐藏着一堆麻烦:宏和头文件、项目、目标代码以及构建配置,等等。繁多的构建设置列表,令人困惑的链接器错误,让人绝望。时不时还会有些“惊喜”:“天,这个第三方代码居然不支持ARC?得加上-fno-objc-arc标记!”。
Android的配置文件只有一个,每当开发者保存一次文件,Eclipse就会构建一次应用。当然,在因配置授权不当而导致应用不工作时,错误消息少了点。不过这只是细节,总体来说,Android的应用配置简单且简洁。
优势:Android。
UX设计
Xcode的界面搭建器能非常迅速地将简单、漂亮的用户界面以一种非常赏心悦目地方式组织在一起。问题是,这又加了一层配置复杂度。对于简单应用而言,很好,但随着时间推移和应用发展,这些简单的东西会变得复杂、混乱。Evans也非常不喜欢苹果在大约一年前增加的多屏故事板。
理论上,Android有一个可比肩的可视化工具,不过这只是理论上而已。实际情况是,你需要编写提供布局指导的XML文件,以便让应用在多种设备的多种屏幕上渲染得很好。(苹果的自动布局也走这条路,应该是为未来出现的更多尺寸的iOS屏幕作准备)同时,Android提供了一个图标包供开发者们使用,而iOS开发者们则必须使用Icons8等第三方服务或自己制作。
总的来说,这方面的差距要比想象中的小。总体来说,两样东西让iOS占据优势:首先,Xcode要简单的多:只有三种屏幕尺寸(包括iPad)和两种屏幕密度,而不像Android一样复杂。其次,默认的iOS视觉元素,比如弹出目录和消息,看起来要比Android吸引人得多。
优势:iOS。
语言
Android应用使用Java编写,iOS应用则使用Objective-C。当然你也可使用其他工具,以便使用其他语言,比如Evans推荐的xamarin,还有PhoneGap之类。不过总的来说,原生Android应用使用Java编写,原生iOS应用使用Objective-C编写。
Evans起初觉得Objective-C非常啰嗦:比如语句
String s2 = s1.replace(“abc”,”xyz”);
在Objective-C中变成了
objective-c NSString *s2 = [s1 stringByReplacingOccurrencesOfString:@"abc" withString:@"xyz"];
不过后来Evans越來越喜欢Objective-C了。Objective-C比Java更整洁。Objective-C有block,Java没有。Objective-C有category,Java也没有。ObjC 不需要你把很多代码用一望无际的 try/catch 异常处理空行围起来; Java 需要.
Java也有其优势。比如更好的堆栈跟踪(stack trace),这让追踪零星的错误变得更容易。两年前,Android还有垃圾收集的巨大优势,但现在iOS有了ARC,这一优势就消失无踪了(尽管老的第三方工具通常不支持ARC,开发者必须进行一些XCode配置,才能关闭ARC)。考虑到iOS的这一进步,赢家就很明显了。
优势:iOS。
API
Android和iOS都向开发者们提供了庞大的软件库。从宏观上看,这些库都很相似:有针对手机功能、网络访问功能、包括强大的WebView在内的View对象的API。绝大部分工作都是由控制器完成:iOS的ViewController差不多就相当于一个Android Activity。
iOS有而Android没有的是一套额外的框架和功能,比如Android就没有iOS强大的Core Data框架的对应物,也没有iOS那样更整洁、更好的设计系统。比较这两个应用中起到相同作用的类,Evans在Android类上花的时间比在iOS类上花的时间要多。
至于代码行数。这两款应功能近乎一样,但iOS应用的自定义代码有1596行,包括头文件;而Android应用的Java代码和XML代码加起来有2109行,多了32%多。
优势:iOS。
网络
如今大部分应用都使用互联网API,而不是单独的程序;这点非常重要,值得拿出来单说。iOS和Android都为此提供了全套工具和API。它们都提供了非常相似的WebView,基本上就是功能齐全的浏览器,开发者可以在应用中任何地方插入。
网络连接基本上都是在后台运行,以便不堵塞主线程,不过多线程不好处理。Android提供AsyncTask类来做这类事,虽然很啰嗦,但效果很好,而且判断是否联网也很方便。iOS也提供类似的功能,可惜它们的表现相当低级,不能让人满意。
不过,有一堆开源库让生活变得轻松多了。Evans用的是AFNetworking,感觉非常好。只需在网络请求完成后将代码块传递给它就能运行,这在Android中根本不可能,因为Java没有block。
优势:原生Android有优势,但考虑到第三方库时iOS有优势。
分享
从应用中分享东西到Facebook、Twitter、Evernote等服务上有多容易?Evans曾经以为Android会完胜iOS。长期以来,Android就有一个名为Intents的强大的应用间通讯系统。总体上说,Android在应用间请求并分享数据上要好很多。
而在更广泛意义上的分享上,苹果领先很多。具体可以看Evans的项目中分享Scanvine故事的Android代码和iOS代码。
优势:都不够好。
碎片化
这一问题根本不用多说,答案当然是iOS胜出。值得注意的是,Google正进行一项有趣的去碎片化战略,也许很快这一点就需要重新探讨了。
优势:iOS。
发布
发布一款Android应用非常容易。只需要用一个方便的Eclipse向导来签名应用,你就会得到一个可以在任何设备上运行的APK文件。可以用电子邮件发送,可以传到网站上,当然也可以上传到Google Play中,你可以在一小时内向全世界提供你的应用。不能再简单一些了。省下来的时间你可以用来检查安装数据和崩溃报告,包括查找有问题的代码,并能立即上传修复错误的版本。
发布一款苹果应用则是噩梦。Evans建议留出至少一天的iOS开发时间来解决证书和发行档案问题。尽管最新版的XCode试图让这一过程变得更容易,但这始终是个很大的困扰。如果没有TestFlight,测试甚至会更糟。苹果的iTunes Connect网站比起Google Play开发者终端就像福特之于特斯拉。基本上你收不到苹果应用的崩溃报告,收到了里面也不会有什么有用的信息,你只能自求多福。你最终会为强大的苹果UX有多糟糕而深感震惊。
优势:Android领先很多。
那么赢家是?
iOS要领先很多。Android有其优势,但总的来说,编写好的iOS应用要比编写好的Android应用容易得多。加上iOS用户更有钱,更有影响力,大部分想要闯出名头的创业公司还是应该以iOS为先。新的Android Studio IDE也许会极大地缩短差距,但并不是全部。
Jon Evans的原文(英文)
本文由SegmentFault编译整理。