轉自ibireme的博客
做iOS開發總會接觸到一些第三方庫,這裏整理一下,做一些吐槽。
目前比較活躍的社區仍舊是Github,除此以外也有一些不錯的庫散落在Google Code、SourceForge等地方。由於Github社區太過主流,這裏主要介紹一下Github裏面流行的iOS庫。
首先整理了一份Github上排名靠前的iOS庫(大概600個repos)
除了逛一下每日/每月流行之外,也可以到這裏來看一下整個iOS Repos的排名。
下面是一些比較流行的第三方庫:
HTTP
相比較之下,AFNetworking是目前最優秀的一個了:輕量、易用、使用者多、開發者有在積極維護。在AFN出現之前,這個角色是由ASIHTTPRequest扮演的,只是到現在年久失修了。關於AFN和ASI的對比,這裏有一篇不錯的文章http://www.infoq.com/cn/articles/afn_vs_asi。除此之外,MKNetworkKit和RestKit也有一定的使用者。
Socket
CocoaAsyncSocket無疑是目前封裝得最完善的Socket庫了:支持異步TCP/UDP,支持GCD,Objective-C接口封裝。。目前沒有發現可以與之相比的同類產品。。
JSON
JSONKit算是第三方中最優秀的一個了:性能很高,文件少。在JSONKit之前,SBJson非常非常流行,但是SBJson性能夠差,只是由於歷史原因仍然存在在某些工程裏面。如果工程只需要支持iOS5以上的系統,那就可以放棄那些第三方Json庫了,直接用系統提供的NSJSONSerialization,性能比第三方的好,又是官方API。。
XMPP
現在做個實時聊天,XMPP協議算是很成熟的方案了。XMPPFramework一個很不錯的選擇,可以直接和OpenFire服務器打交道。項目不大人手不多的話,可以看看這個。
基礎工具類
SSToolkit算是一個不錯的工具包,提供各種比如編碼、加密、字符串處理等等東西,還提供了一些不錯的自定義控件,並且文檔非常齊全。
框架
過去有很多人再用three20,這個東西太大太重,文檔又少,到頭來連Facebook都停止維護了。作爲替代品nimbus現在流行了開來,關鍵在於它文檔齊全。國內有個MVC框架叫BeeFramework,號稱是頂級框架並且功能超過nimbus,有興趣的可以看一下。
ReactiveCocoa把響應式編程這種上流的東西帶了過來,值得試一試。。
數據存儲
還是挺多人(比如我)喜歡直接跟SQLite打交道的,這方面fmdb封裝的很不錯。如果用CoreData來做存儲的,可以用一下MagicalRecord。
圖像處理
GPUImage無疑是這方面的集大成者了。用OpenGL ES2.0來實時處理圖片和視頻流,性能和功能都是頂尖的。
開發和調試工具
PonyDebugger看上去是一個不錯的調試工具,可以在電腦瀏覽器上遠程調試iOS程序、查看試圖層次、網絡等等。CocoaLumberjack是個Log工具,號稱是可以提供企業級Log,使用者也挺多。
爲了瞭解一下目前第三方庫的普及程度,下面列舉一些知名App對第三方庫的依賴。
網易新聞
AppleReachability
ASIHTTPRequest
EGOTableViewPullRefresh
GTMNSString+HTML
MGTemplateEngine
MPOAuth
RegexKitLite
SDWebImage
SSZipArchive
wax
ASIHTTPRequest
EGOTableViewPullRefresh
GTMNSString+HTML
MGTemplateEngine
MPOAuth
RegexKitLite
SDWebImage
SSZipArchive
wax
Garageband
iWork三套件
Pinterest
AFNetworking
AFHttpClientLogger
Facebook SDK
iRate
MAKVONotificationCenter
SDWebImage
SFHFKeychainUtils
SSPullToRefresh
SVProgressHUD
TTTAttributedLabel
TTTLocalizedPluralString
UIAlertView-Blocks
AFHttpClientLogger
Facebook SDK
iRate
MAKVONotificationCenter
SDWebImage
SFHFKeychainUtils
SSPullToRefresh
SVProgressHUD
TTTAttributedLabel
TTTLocalizedPluralString
UIAlertView-Blocks
多看閱讀
淘寶
MAZeroingWeakRef
MBProgressHUD
ABContactHelper
ASIHTTPRequest
CocoaLumberjack
EGOTableViewPullRefresh
fmdb
GTMBase64
JSONKit
SBJson (json-framework)
RTLabel
SDWebImage
SVPullToRefresh
three20
ziparchive
MBProgressHUD
ABContactHelper
ASIHTTPRequest
CocoaLumberjack
EGOTableViewPullRefresh
fmdb
GTMBase64
JSONKit
SBJson (json-framework)
RTLabel
SDWebImage
SVPullToRefresh
three20
ziparchive
微信
QQ
ASIHTTPRequest
FMDB
CocoaAsyncSocket
JSONKit
MBProgressHUD
OpenUDID
SBJson
SVPullToRefresh
百度地圖
微博
ABContactHelper
AFNetworking
ASIHTTPRequest
DACircularProgressView
DDProgressView
DTFoundation
fmdb
JSONKit
SBJson
MBProgressHUD
MTStatusBarOverlay
OpenUDID
SFHFKeychainUtils
AFNetworking
ASIHTTPRequest
DACircularProgressView
DDProgressView
DTFoundation
fmdb
JSONKit
SBJson
MBProgressHUD
MTStatusBarOverlay
OpenUDID
SFHFKeychainUtils
人人
可以看到,這些大型的App的依賴都很混亂,所以稍微解釋一下。這些大公司都有一個iOS團隊來協同開發,團隊成員的水平也參差不齊。有時由於歷史原因,例如某個App的某個組件依賴了ASIHttpRequest,但之後的新人改用了AFNetworking,就造成上面這種比較混亂的庫依賴關係。這就造成難以維護、代碼冗餘等問題了。所以,引入一個第三方庫一定要慎重考慮,如果可能,儘量自己開發和實現相應的功能,第三方庫儘量只作爲參考。 小團隊或者個人開發者可以不必過多考慮,開發速度優先。
最後吐槽一下cocoapods。
一個語言的流行總伴隨着第三方庫的豐富,相應的也會出現依賴庫管理的工具。cocoapods之於ObjC,就像maven/gradle 之於java、gem之於ruby那樣。 cocoapods基本上是創建在在github社區上的,開源並且社區活躍。除了用github上的中央倉庫外,也可以自己搭建私服什麼的隨便亂搞。
但就我來說,不推薦使用cocoapods,吐槽如下:
1.像maven這樣的工具,是爲了管理龐大的第三方庫依賴、控制版本、構建工程等等而產生的,很難想象一個依賴了上百個jar包的web項目不用包管理構建會變成什麼樣。。但是,iOS開發是客戶端的開發啊,如果真有一個工程依賴了那麼多第三方工具,這個App能保持穩定嗎。。通常情況下一個iOS工程不會有那麼多包依賴。
2.按常理來看,一個人的手頭不可能有太多的工程同時進行,也不太可能一天之內創建N個App來發布。cocoapods能節省的重複工作量,還不如它帶來麻煩多。。
3.修改和調試不便。如果某個第三方庫需要少量修改才能實現需求,用cocoapods來處理會比較麻煩。
關於第三方庫,同樣也不推薦過多使用,吐槽如下:
1.消耗時間,一個開源庫,拿過來需要仔細考察代碼質量,確認是否足夠可靠。如果出現問題,需要仔細審查開源庫的內部實現。如果這些工作太消耗時間,還不如自己實現。
2.可維護性差。一旦遇到系統升級、API更換,第三方庫不能確保不出問題。當出問題後也難以找到人來維護。如果跟進第三方庫的改變,仍然容易出現新問題。
3.法律問題。。大公司需要仔細審查許可協議,小公司各種不怕那就沒問題。。