iOS開發(fā)學(xué)習(xí)概述及知識整理
設(shè)計(jì)師設(shè)計(jì)出來了一個不錯的引導(dǎo)界面,然而當(dāng)我看到設(shè)計(jì)稿的時候,我們的app也沒幾天就要上線了。這個界面模仿了Evernote iOS app的風(fēng)格。

我以迅雷不及掩耳盜鈴之勢開始在Xcode上編程,用了page view controller和scroll view。在Stack Overflow和Google的幫助下,我用了2天把它完成了。當(dāng)我把產(chǎn)品給一個同樣搞iOS開發(fā)的朋友看時,他跟我說,如果我用了這個開源項(xiàng)目的話,一個小時就可以搞定一切。
過去這一年我經(jīng)歷了不少類似的事情,這些事情讓我成長,讓我能夠成為一個更好的iOS開發(fā)工程師。我想跟大家分享一下我的經(jīng)驗(yàn),希望你們可以不再犯我這些錯誤,一路平坦走向成功。
重視基礎(chǔ)
剛開始學(xué)iOS開發(fā)的時候,我直接去學(xué)習(xí)了斯坦福大學(xué)的這門課程,非常有用。然而,雖然我從課程中學(xué)到了很多,但它并沒有教給我多少iOS開發(fā)語言的基礎(chǔ)知識——當(dāng)時的iOS開發(fā)語言主要是Objective-C。開始寫自己的app以后,我發(fā)現(xiàn)自己在基礎(chǔ)知識方面欠缺很多,這導(dǎo)致我老是弄出來一些bug。
如果你在面向?qū)ο缶幊痰恼Z言方面沒啥經(jīng)驗(yàn)的話,我建議你在投身進(jìn)行iOS開發(fā)之前先讀一本這方面的經(jīng)典書籍。我最喜歡的兩本是Big Nerd Ranch Guide for Objective-C和Swift的The Apple’s Guide。

沒錯,Ray Wenderlich上的教程和Team Treehouse上的視頻課程能教給你很多,但缺少基礎(chǔ)知識的程序員就像無源之水、無本之木,總是長久不了的。
良師益友Github
我對這個iOS開源社區(qū)絕對是真愛。Github上面有無數(shù)的優(yōu)質(zhì)項(xiàng)目,如AFNetworking, Restkit、JSQMessages,甚是碉堡。你必須學(xué)會在這個社區(qū)里乘前人栽樹之涼。
遇到問題時,先別一根筋急著苦思冥想或創(chuàng)建自己的庫,不如先去GitHub或Google找一下有沒有相似問題的解決方法。很有可能某個開發(fā)者已經(jīng)寫好了一個符合你需求的開源項(xiàng)目。
通過Facebook Groups或Slack chat來開始社區(qū)之旅吧!他們很樂意回答你的一切問題。你可以瀏覽那些好的開源項(xiàng)目,看看大牛們是如何組織代碼的,自己也學(xué)著點(diǎn)。
這里是GitHub上一些最優(yōu)質(zhì)的iOS資源。
vsouza/awesome-ios:awesome-ios——精選的優(yōu)質(zhì)iOS生態(tài)系統(tǒng),包括Objective-C和Swift項(xiàng)目。

matteocrippa/awesome-swift:awesome-swift——收集了很多優(yōu)質(zhì)的swift資源。你也可以來貢獻(xiàn)自己的力量!

cjwirth/awesome-ios-ui:awesome-ios-ui——優(yōu)質(zhì)iOS UI/UX庫精選。

如果你想找一些iOS的最佳實(shí)踐以供自己模仿學(xué)習(xí),那請看下面這些。
futurice/ios-good-practices:ios-good-practices——為iOS開發(fā)者提供靈感,作者是Futurice的開發(fā)者們。

了解你的工具
多數(shù)iOS開發(fā)者將Xcode作為開發(fā)的首選工具。Xcode有很多強(qiáng)大的特性,如Storyboards、Auto Layout,如果學(xué)會用這些的話,相信你的開發(fā)效率肯定能上一個臺階。出于某些限制,很多開發(fā)者會盡力避免使用Storyboards,但我個人認(rèn)為,Storyboards是快速布局的有力工具。
學(xué)習(xí)使用Xcode中的快捷鍵。雖然看上去使用快捷鍵沒節(jié)省幾秒鐘,但“不積小流,無以成江海“,久而久之省下的時間就多了。以上這些都是我親測有效的手段,它們在提高開發(fā)效率方面給了我很大幫助。
使用Cocoapods來進(jìn)行依賴管理。你的團(tuán)隊(duì)會因此輕松很多。
在項(xiàng)目早期就學(xué)會使用持續(xù)整合(continuos integration),這樣就可以避免未來可能出現(xiàn)的冗余工作。
使用Testflight來分發(fā)測試版本。在被蘋果收購之后,Testflight變得更加簡單易用了,每個人都可以通過它來使用iTunes賬號進(jìn)行測試版本的分發(fā)。
在app中整合Crashlytics,這樣當(dāng)app崩潰的時候你就可以獲取Crash報(bào)告了。
如果你不想自己弄后端服務(wù)器的話,Parse為我們提供了很好的服務(wù)。
讀一些優(yōu)質(zhì)博客和資訊
前文已經(jīng)介紹了一些很棒的iOS開源社區(qū)。很多優(yōu)質(zhì)的博客是由經(jīng)驗(yàn)豐富的iOS開發(fā)者撰寫的,每周都會有一些精彩的內(nèi)容呈現(xiàn)。我最喜歡的一些包括:
Cocoa with Love:在本博客中,我將專注于使用和管理用戶界面中字符串的最佳實(shí)踐。這是一個相當(dāng)…
可能是最好的iOS博客。作者是Matt Galaghar。Matt做事情的方式是大師級的。
iOS Dev Weekly:訂閱本博客,輕松獲得每周最棒的iOS開發(fā)網(wǎng)頁精選。由Dave Verwer精選并發(fā)布…

嚴(yán)格來說這不算個博客,但它每周都有超級超級棒的內(nèi)容更新。作者是Dave Verwer。
NSHipster:Playgrounds并不是Swift語言本身的特性,它們其實(shí)是很棒的展示……

NSHipster對Objective-C和Cocoa進(jìn)行拾遺的雜志。它由Mattt Thompson每周更新。
Ray wenderlich:高質(zhì)量的編程教程:iOS、Android、Mac,還有更多!

Ray Wenderlich的博客(對初學(xué)者超有用)
Custom Controls for iOS and OS X – Cocoa Controls:暫無描述

Peter Steinberger:蘋果在Xcode 6中增加了對NS_DESIGNATED_INITIALIZER 標(biāo)志的支持,同時也將其添加到了各種各樣的框架中……

Matt Gemmell:基于我的寫作項(xiàng)目進(jìn)行簡要更新。它或許會引起一些人的興趣……

Natasha The Robot:僅僅是又一個WordPress站點(diǎn)
在這些博客中挑選干貨,認(rèn)真閱讀,相信你會變成一個更好的iOS開發(fā)者。
設(shè)計(jì)也能變輕松
很多開發(fā)者對于iOS的設(shè)計(jì)方面談虎色變。我們總是對設(shè)計(jì)敬而遠(yuǎn)之,一股腦兒都扔給設(shè)計(jì)師去做。但其實(shí),只要稍稍努力,你也可以學(xué)會設(shè)計(jì)自己的app。
現(xiàn)在,設(shè)計(jì)師和開發(fā)者之間的界限日益模糊,因?yàn)楹枚喑晒Φ膇OS獨(dú)立開發(fā)者包攬了所有app設(shè)計(jì)、開發(fā)和營銷工作。我將在下一部分談到營銷方面的事。如果你想設(shè)計(jì)自己的iOS app的話,不妨學(xué)一下Sketch這個工具。
Sketch專為應(yīng)用設(shè)計(jì)和網(wǎng)頁設(shè)計(jì)而生,簡單易上手。
Bohemian Coding – Sketch 3:Sketch是簡單易用的輕量級軟件,它強(qiáng)大、靈活而快速。最后……

你可以在網(wǎng)上找到大量的Sketch資源和插件,它們能讓你有趣而簡單地工作。一旦完成了設(shè)計(jì)工作,你可以立刻用這個神器將它們整合在一起。
Free mobile & web prototyping for designers – Marvel:將草圖和設(shè)計(jì)轉(zhuǎn)化為可交互的Web、iPhone、iPad、Android和Apple Watch原型和模板……

下一部分,我將談一談在開發(fā)自己的app時的必要方法,并且講一些iOS應(yīng)用的營銷技巧。
在第一部分中,我討論了學(xué)習(xí)iOS開發(fā)的一些基本問題。第二部分將更多地討論一些實(shí)際問題,這些問題都是你在開發(fā)iOS應(yīng)用時會遇到的。
Debugging
毋庸置疑,你在開發(fā)應(yīng)用的過程中一定會遇到很多錯誤和異常。比如,你會遇到NSInvalidArgumentException,遇到NSInternalInconsistencyException,還會遇到“0xfaded322”這種錯誤代碼。有時候你可以在Stack Overflow或Quora上找到答案,但大部分時候你得自力更生。
Xcode具有斷點(diǎn)、視圖調(diào)試和日志的功能,是debug的不二之選。但畢竟孤掌難鳴,你仍需為它找些得力的幫手。
1.Pony Debugger

square/PonyDebugger:PonyDebugger – 使用Chrome Developer Tools,為你的native iOS應(yīng)用進(jìn)行遠(yuǎn)程網(wǎng)絡(luò)和數(shù)據(jù)調(diào)試。
square開發(fā)了這個強(qiáng)大的開源工具。它是一個遠(yuǎn)程調(diào)試工具,類似于客戶端庫和網(wǎng)關(guān)服務(wù)器的結(jié)合體。它在web瀏覽器上使用Chrome Developer Tools,對應(yīng)用的網(wǎng)絡(luò)流量和數(shù)據(jù)存儲進(jìn)行調(diào)試。作為一個強(qiáng)大的網(wǎng)絡(luò)調(diào)試器,PonyDebugger允許用戶實(shí)時查看應(yīng)用的網(wǎng)絡(luò)請求。它還有另一個酷酷的功能,就是可以遠(yuǎn)程調(diào)試iOS應(yīng)用的核心數(shù)據(jù)棧。
2.Cocoa Lumberjack

CocoaLumberjack:CocoaLumberjack – 快速、簡單,強(qiáng)大、靈活。它就是CocoaLumberjack, 一款好用的Mac和iOS日志框架。
CocoaLumberjack,它快速、簡單,強(qiáng)大、靈活,是一款好用的Mac和iOS日志框架。如果你想找一款強(qiáng)大的日志工具,希望它具有自定義格式化這樣的炫酷功能,那CocoaLumberjack就是你的菜。
3.Reveal App

Reveal:Reveal – iOS應(yīng)用的runtime視圖調(diào)試。
雖然視圖調(diào)試已經(jīng)被引入iOS,但Reveal無疑在調(diào)試的細(xì)節(jié)方面更加強(qiáng)大。它是收費(fèi)應(yīng)用,但絕對物有所值。它有一些非常好用的功能,如Auto Layout Inspection。
4.OHHTTPStubs

AliSoftware/OHHTTPStubs:OHHTTPStubs – 輕松stub你的網(wǎng)絡(luò)請求。以虛擬網(wǎng)絡(luò)數(shù)據(jù)測試你的應(yīng)用,可自定義響應(yīng)時間……
OHHTTPStubs庫可以輕松stub你的網(wǎng)絡(luò)請求。它可以幫助你:
- 使用偽造的網(wǎng)絡(luò)數(shù)據(jù)(stubbed from file)測試你的應(yīng)用,并模擬慢速網(wǎng)絡(luò)以檢查應(yīng)用在網(wǎng)絡(luò)不良情況下的表現(xiàn)。
- 從設(shè)備中獲得偽造的網(wǎng)絡(luò)數(shù)據(jù),用于寫單元測試。

數(shù)據(jù)存儲
可能大多數(shù)應(yīng)用都需要將各種任務(wù)的數(shù)據(jù)存儲在本地。數(shù)據(jù)存儲是一個復(fù)雜的話題。它有很多選擇,每個選擇都對應(yīng)一種情況。但我很喜歡Stack Overflow上的一種法則,用它來選擇數(shù)據(jù)存儲方式就很不錯。
- 若數(shù)據(jù)完全匹配內(nèi)存且相對非結(jié)構(gòu)化,則使用plist
- 若數(shù)據(jù)完全匹配內(nèi)存且具有樹狀結(jié)構(gòu),則使用XML
- 若數(shù)據(jù)與內(nèi)存不匹配且具有圖形結(jié)構(gòu),同時應(yīng)用不需要額外的查詢能力,則使用Core Data
- 如果數(shù)據(jù)與內(nèi)存不匹配且具有復(fù)雜結(jié)構(gòu),或應(yīng)用需要關(guān)系數(shù)據(jù)庫提供的強(qiáng)查詢能力,則使用sqlite
- 如果數(shù)據(jù)必須保密(例如密碼),則使用keychain。
下面列了一些數(shù)據(jù)存儲方面的庫,或許對大家有幫助。
FMDB

ccgus/fmdb:fmdb – 圍繞SQLite建立的Cocoa / Objective-C的wrapper
如果你在項(xiàng)目中使用SQLite,此wrapper庫會使你的工作變簡單。
SSFKeychain
soffes/sskeychain:sskeychain – 簡單的Objective-C wrapper,Mac和iOS上的keychain可以使用
要在應(yīng)用中存儲敏感數(shù)據(jù),你必須時刻使用keychain。這個庫可以簡化使用keychain數(shù)據(jù)存儲的過程。
Magical Record

Core data非常難于管理。而這個庫可以讓你舒爽地管理Core Data。
網(wǎng)絡(luò)
要想讓應(yīng)用更有趣,你免不了要接入一些API。雖然iOS在對網(wǎng)絡(luò)的支持方面表現(xiàn)良好,譬如它擁有NSURLSession、NSURLConnection和NSJSONSerialization,但我還是推薦你使用下面的庫。
AFNetworking

AFNetworking:AFNetworking – 令人拍案叫絕的iOS和OS X網(wǎng)絡(luò)框架。
我認(rèn)為這是有史以來最好的iOS庫之一,它的功能何止炫酷二字。但這些功能中最重要的或許是開發(fā)者社區(qū),他們每天都在使用這個庫,并為AFNetworking做出貢獻(xiàn)。一些iPhone、iPad和Mac上最火的應(yīng)用都是由AFNetworking提供的支持。
Restkit

RestKit/RestKit:RestKit是在iOS和OS X上使用和構(gòu)建RESTful web資源的框架。
Restkit具有精心設(shè)計(jì)的API,訪問和構(gòu)建RESTful資源的過程如沐春風(fēng)。如果你用core data進(jìn)行數(shù)據(jù)存儲、用rest service進(jìn)行數(shù)據(jù)讀取,那你的最佳選擇就是它——與Core Data完美集成的Restkit。
Alamofire

Alamofire/Alamofire:Alamofire – Swift下精致的HTTP Networking。
喲喲切克鬧,Swift粉們不要鬧,煎餅果子來一套。下面就是為你們準(zhǔn)備的東西了。Alamofire是一個精致的網(wǎng)絡(luò)庫,它具有一些Swift專享的強(qiáng)大功能。
你也可以在這里找到很多其他的庫。

awesome-ios——精選的優(yōu)質(zhì)iOS生態(tài)系統(tǒng),包括Objective-C和Swift項(xiàng)目。
依賴管理
我在前面的文章中提到過依賴管理,但重要的問題要說兩遍!在這里我還要給它細(xì)細(xì)講一發(fā)。在項(xiàng)目中,你主要有三種管理依賴的方式。
CocoaPods
CocoaPods.org:iOS和Mac項(xiàng)目的依賴管理器。
CocoaPods是Swift和Objective-C Cocoa項(xiàng)目的依賴管理器。它擁有將近一萬個庫,可以幫助你輕松擴(kuò)大項(xiàng)目規(guī)模。要想管理Ruby Gems這種依賴,實(shí)踐中最有效的方法就是它了。
谷歌開發(fā)者做了一個YouTube視頻,解釋了為什么要在你的項(xiàng)目中使用CocoaPods。小心笑尿。
點(diǎn)此觀看視頻:Route 85: An Introduction to CocoaPods
Github Submodules
你還可以使用git submodules,在項(xiàng)目中以sub repos形式管理依賴。子模塊相對于Cocoapods的優(yōu)勢在于子模塊也是sub-repos——這不僅是指git和git GUIs逐漸認(rèn)可并更加支持它們,也意味著你的依賴可以將git repos和廣闊的世界連接起來,而CocoaPods卻不能。
但git submodules也有自己的問題:項(xiàng)目中沒有那些你所依賴的代碼的來源。它只是指向了子模塊庫。而大多數(shù)時間你根本不會去管這個庫。
Carthage

Carthage/Carthage:Carthage – 簡單、去中心化的Cocoa依賴管理器。
Carthage旨在為Cocoa應(yīng)用提供最簡單的框架添加方式。Carthage使用xcodebuild建立framework binaries,把整合工作留給了用戶。CocoaPods的方法更簡單易用,而Carthage的方法更靈活溫和。
不幸的是,Carthage也有一個巨大缺陷——僅支持iOS 8及以上版本。

測試
大多數(shù)人一提到應(yīng)用測試就會呵欠連連。但如果沒有測試的話,說不巧哪天你的應(yīng)用就突然崩潰了。發(fā)布應(yīng)用時,你一定得先進(jìn)行深度測試,保證用戶得到最佳體驗(yàn)。
這里有很多測試框架,它們可以簡化測試工作。
XCTest
XCTest是一個單元測試框架,包含在Xcode中。它支持把單元測試作為項(xiàng)目編譯過程的一部分。XCTest與XCode高度整合,因此提供了持續(xù)整合支持和覆蓋率測試這樣的功能。
KIF

kif-framework/KIF:KIF – Keep It Functional – iOS功能測試框架
KIF是Keep It Functional的縮寫。它由Square開源,是一款iOS一體化測試框架。它利用其可訪問性——即系統(tǒng)讓訪問不能顯示的應(yīng)用成為可能,輕松實(shí)現(xiàn)了iOS應(yīng)用的自動化。
Kiwi

kiwi-bdd/Kiwi:Kiwi – BDD for iOS
Kiwi是iOS開發(fā)的Behavior Driven Development庫。其目標(biāo)是提供一個安裝和使用都非常簡單的BDD庫。
Quick

Quick/Quick:Quick – Swift (以及Objective-C)的測試框架。
Quick是Swift和Objective-C的一款行為驅(qū)動的開發(fā)框架。它由RSpec、Specta和Ginkgo開發(fā)。與Quick并肩戰(zhàn)斗的是Nimble——一款為測試服務(wù)的匹配框架。
我嘗試在本文中講盡量多的技術(shù)問題。跳入iOS開發(fā)的大坑之后,你就能用得到上我說的這些東西了。關(guān)于iOS開發(fā)需要說的實(shí)在太多,所以在這兒我沒有談到營銷之類的話題。如果你想看的話,那就等我的下一篇文章吧!
浙公網(wǎng)安備 33010602011771號