初創公司永恒的問題“Android還是iOS為先”變得越發棘手了,尤其是在報道稱Android的市場份額超過80%的情況下。但不用擔心經理們和非技術出身的創始人們:開發者們!開發者們!是怎么看待這一隔閡的?只要能讓他們的生活變得更輕松,就能獲得巨大的優勢。
說到“他們”,其實是在說“我們”。當我不寫TC專欄(和小說)時,我還是HappyFunCorp(擁有迄今為止最好名字的咨詢公司)的軟件工程師。由于我最近做了更多的管理工作,為了讓自己不手生,我編寫并開源了兩個近乎一模一樣的Android和iOS應用,這是我的私人寵物項目。讓我用它們來帶你體驗兩者的差異吧。
背景:我之前編寫了很多Android和iOS應用,包含私人和工作項目。文章中提到的這兩款應用都是原生應用,為我的寵物新聞聚合器Scanvine編寫,Scanvine可以識別出在社交媒體中分享得不同尋常之廣的故事。兩個應用的完整源代碼都放在Github上:(Android?|iOS),實際應用也都可以下載(Google Play?|?App Store)。
在我們開始前,我不得不提一下Xamarin的跨平臺開發工具。要是我精通C#就好了,如果我不是已經了解Java和Objective-C的話,Xamarin將是我原生應用開發的首選。
同時要申明:這更多的是“游戲之作”而非“專業品質”。你會發現這兩款應用中嚴重缺少測試代碼。我還有一個iOS heisenbug需要解決;我應該使用git子模塊而非從第三方庫中復制粘貼文件等等。
好了,沒有再要說的了,讓戰斗開始吧!
開發環境
你還是可以用文本文件和命令行來編寫代碼,而且許多人也是這么做的,但使用IDE(集成開發環境)要有生產力得多。
總的來說,蘋果的Xcode讓人開發起來很愉悅。Xcode漂亮、快速、強大、幫助很大卻又不擾人,而且在編譯和通過證書/檔案機制控制iOS應用和設備上做得越來越好了。Xcode的調試工具運行平滑,模擬器快速且反應靈敏。
Android?噢,Android。目前Android最先進的IDE是用Android插件定制的Eclipse,而它卻很糟糕。慢、笨重、反直覺、布局糟糕、不必要的復雜,簡直就是一團糟。它的調試工具也非常笨拙,我發現自己大部分時間都是通過日志進行調試,而XCode的調試工具卻是我尋找iOS程序錯誤的首選工具。Android的模擬器也要花幾分鐘才能啟動,其中差不多有一半沒法連接到Android Debug Bridge,還是少提為好。
不過Google知道這是一個問題,他們也正在著手制作一款新的IDE:Android Studio。啊,終于!
Android Studio目前提供先期預覽版。多項功能要么不完整,要么還沒有加入,用戶也許還會遇到錯誤。如果你對使用半成品感覺不適,或許可以轉而下載(或繼續使用)ADT Bundle(帶ADT插件的Eclipse)。
很高興能看到Google著手解決它,但真的很神奇(壞的方面),在我購入第一臺Android手機4年半后,Android IDE還是糟糕得一塌糊涂。
優勢:iOS甩了Android幾條街。
配置
正如我提到的,在Xcode和Objective-C漂亮、無縫的外表之下,隱藏著上世紀70年代編程的偏愛工匠手藝的恐怖。開玩笑的……但是宏和頭文件;項目、target、scheme以及build配置;繁多的build設置列表;遭遇令人困惑的linker錯誤時的絕望;以及“噢,這個第三方代碼居然不支持ARC?只需加上-fno-objc-arc標記!簡單,不?”的發現。
Android的配置文件只有一個,每當開發者保存一次文件,Eclipse就會build一次應用。我希望在因配置授權不當而導致應用不工作時,錯誤消息能提供更多信息,但這只是小地方。總體來說,Android的應用配置簡單且簡潔。
優勢:Android。
UX設計
你應該預料的到,蘋果會拿走這一獎杯。Xcode的Interface Builder(界面搭建器)能非常迅速地將簡單、漂亮的用戶界面以一種非常賞心悅目地方式組織在一起。問題是,我用Interface Builder的次數越多,我就越不喜歡它。這又加了一層配置復雜度;對于簡單應用而言,Interface Builder很好,但隨著時間推移和應用發展,這些簡單的東西會變得復雜、混亂;而且我也非常不喜歡蘋果在大約一年前增加的多屏Storyboard。
理論上,Android要有一個可比肩的視覺工具,但還是少提為好。實際上,你需要編寫提供布局指導的XML文件,以便讓應用在多種設備的多種屏幕上渲染得很好(希望如此)。(蘋果的自動布局也是朝相同的方向前進,肯定是著眼于未來會出現更多尺寸的iOS屏幕)同時,Android提供了一個圖標包供開發者們使用,而iOS開發者們則必須使用Icons8等第三方服務或自己制作。
總的來說,這方面的競爭要比你想象的差距小,盡管我承認,這給人的感覺相當古怪。最終說來,兩樣東西讓iOS占據優勢。首先,Xcode要簡單的多:只有三種屏幕尺寸(包括iPad)和兩種屏幕密度,而不像Android一樣復雜。其次,默認的iOS視覺元素——如彈出目錄和消息——看起來要比Android的吸引人得多。
優勢:iOS。
語言
Android應用使用Java編寫;iOS應用使用Objective-C。也有例外,如Xamarin;還有其他小眾原生應用案例;以及PhoneGap等原生/網絡混合體,但總體而言,原生Android應用使用Java編寫,原生iOS應用使用Objective-C編寫。
我是從Java開始的,起初并沒有想太多要用Objective-C,大部分原因是Objective-C非常啰嗦:比如語句
String s2 = s1.replace(“abc”,”xyz”);
在Objective-C中變成了
NSString *s2 = [s1 stringByReplacingOccurrencesOfString:@"abc" withString:@"xyz"];
但我變得越發喜歡起Objective-C來。Objective-C比Java更好、更整潔。Objective-C有代碼塊(block),Java沒有。Objective-C有類別(category),Java沒有。Objective-C不用你寫很多try/catch,Java還要你處理空白。
Java也有其優勢。比如更好的堆棧蹤跡(stack trace),這讓追蹤零星的錯誤變得更容易。兩年前,Android還有垃圾收集的巨大優勢,但現在iOS有了ARC,這一優勢就消失無蹤了(盡管老的第三方工具通常不支持ARC,開發者必須進行一些XCode配置,才能安文件關閉ARC)。這一區別消失,贏家就很明顯了。
優勢:iOS。
API
Android和iOS都向開發者們提供了龐大的軟件庫。宏觀點說,這些庫都很相似:有針對手機功能、網絡訪問功能、包括強大的WebView在內的View對象的API。絕大部分工作都是由控制器完成:iOS的ViewController差不多就相當于一個Android Activity。
iOS有而Android沒有的是一套額外的框架和功能,比如Android就沒有iOS強大的Core Data框架的對應物,也沒有iOS更整潔、更好的設計系統。舉個例子,將這兩個做了應用大部分工作的相對簡單的iOS類與這三個對應的Android類進行比較。最后我在Android類上花的時間要比在iOS類上花的時間多。
另一項指標(雖然有瑕疵):代碼行數。這兩款應功能近乎一樣,但iOS應用的自定義代碼有1596行,包括頭文件;而Android應用的Java代碼和XML代碼加起來有2109行,多了32%多。
優勢:iOS。
網絡
如今大部分應用都使用互聯網API,而不是單獨的程序;這點已經足夠重要,值得拿出來單說。iOS和Android都為此提供了全套工具和API。它們都提供了非常相似的WebView(網絡視圖),即便上就是功能齊全的瀏覽器,開發者可以在應用中任何地方插入。
網絡連接基本上都是在后臺運行,以便不堵塞主線程,而多線程又很難。Android提供AsyncTask類來做這類事,雖然很啰嗦,但效果很好,而且判斷是否聯網也很方便。iOS也提供相應的功能,但它們的表現相當低級,不能讓人滿意。
不過,有一堆開源庫讓生活變得輕松多了。我用的是AFNetworking,使用起來感覺非常好。你只需在網絡請求完成后將代碼塊傳遞給它就能運行,這在Android中根本不可能,因為Java并沒有block。
優勢:原生Android有優勢,但考慮到第三方庫時iOS有優勢。
分享
從應用中分享東西到Facebook、Twitter、Evernote等服務上有多容易?我曾經以為這是Android的首次完勝。長期以來,Android就有一個名為Intents的強大的應用間通訊系統。大體上來說,Android在讓應用間請求并分享數據上要好很多。
而在(有點遺憾)更廣泛意義上的分享上,蘋果的領先很多。不要光聽我說,你可以自行判斷。分享Scanvine故事的Android代碼在此,iOS代碼在此。iOS代碼長一些的唯一原因是,我多加了一些Google Analytics追蹤代碼。
優勢:兩者都沒有。
碎片化
這一問題根本不用花太多時間討論,答案當然是iOS勝出。值得注意的是,Google正進行一項有趣的去碎片化戰略,也許這一點很快就可以重新探討了。
優勢:iOS。
發布
發布一款Android應用非常容易。只需要用一個方便的Eclipse向導來簽名應用,你就會得到一個可以在任何設備上運行的APK文件。用電子郵件發送它,放到網站上,上傳到Google Play中,就能在一小時內(有可能)向全世界提供。不能再簡單一些了。在空余時間檢查安裝數據和崩潰報告,包括識別出問題的代碼行的堆棧蹤跡,并能立即上傳修復錯誤的版本。
發布一款蘋果應用則是噩夢。我的一位聰明的朋友總是會建議別人留出至少一天的iOS開發時間來解決證書和發行檔案問題。不管我做了多少次,不管最新版XCode試圖讓這一過程變得多容易,這一直都是個很大的困擾。如果沒有TestFlight,測試甚至會更糟糕。蘋果的“iTunes Connect”網站比起Google Play開發者終端就像福特之于特斯拉。祝你好運,基本上你收不到蘋果應用的崩潰報告,收到了里面也不會有什么有用的信息。你最終也會為強大的蘋果UX有多糟糕而感到驚嘆。
優勢:Android領先很多。
贏家是……
iOS要領先很多。Android有其優勢,但總的來說,編寫好的iOS應用要比編寫好的Android應用容易得多。加上iOS用戶要有錢和有影響力得多,大部分想要闖出名頭的初創公司還是應該以iOS為先。新的Android Studio IDE也許會極大地縮短差距,但并不是全部。(說明一下,我的主要手機是Nexus 4,用起來很開心。)(譯:加佳)