【譯】使用 CocoaPods 模塊化iOS應用

原文翻譯自:Using CocoaPods to Modularize a Big iOS App

為你的移動應用選擇正確的架構是一件相當大的事情挎挖,這會對你的工作流程造成影響,陷入面對的問題噪伊,可能是一筆巨大財富也可能是一個巨大負擔畔师。

HubSpot的是一個全功能的app憨降。他是一個分析的app棋枕,也是一個設計媒體的app曹抬,還是一個郵件app棵逊,并且是一個聯(lián)系人管理的app(可能還有更多地驚喜),這些功能集合在一個app中悼吱。去年夏天慎框,當我們開始構建這個相當復雜的app時,我們知道必須有一個可以容易擴展它的架構后添。

實際上笨枯,我們把每個子app當做一個完全完整地獨立的應用程序,然后使用CocoaPods將它們集成到主應用程序中遇西。

截圖中馅精,你可以看到各個子程序的源程序,儀表盤粱檀,社交媒體洲敢,實際上既是一個獨立的iPhone應用程序,也可以納入主要的應用程序的菜單中選擇一個應用程序茄蚯。

p1

這會給我們代理一些巨大的好處:

  • 最關鍵的是压彭,我們很容易就能保證每個子應用程序的主分支是準備好發(fā)布,并可以推送一個子應用程序的特定版本渗常。
  • 我們在編譯上花費多一些時間壮不,而減少了較多合并的時間。每個獨立app的沙盒可以很容易的在子應用程序內(nèi)循環(huán)皱碘,花最少的時間與其他應用程序進行集成询一。如果你在一個以上的iOS團隊工作過,你毫無疑問已經(jīng)經(jīng)歷過.xcodeproj合并時的痛苦癌椿。雖然他們可以解決家凯,但這個痛苦地步驟我們只想對他敬而遠之。
  • 我們能夠在必要時單獨部署每個應用程序如失,這樣我們在一個獨立的app可用性測試上將會是驚人的绊诲。我們可以更早地將我們的app在合成之前提交給測試者,例如導航功能實現(xiàn)之前褪贵,這樣我們可以得到更高質量掂之,和更有針對性的反饋抗俄。
  • 由于子應用程序之間的用戶流只是基于URL路徑(后面會詳細解釋)完成的,這意味著路徑可以內(nèi)置或者文檔化世舰,而不是從一堆UIViewController以搜索正確的方式來實例化一個特定的視圖动雹,當然必須要事先定義好路徑。建立類似演練教程或者新的推送通知時跟压,這是非常有用的胰蝠。

這種架構在一個兩人以上的團隊建立多方面的iOSapp時,能節(jié)省出巨大的時間震蒋。

從網(wǎng)頁學習

這種將移動端app分割成獨立app的靈感來自于我們在HubSpot網(wǎng)頁端架構的成功茸塞。

HubSpot網(wǎng)頁端架構是高速發(fā)展和可擴展的。正如我同事所寫查剖,我們使用各種工具盒技術钾虐,讓我們在一天內(nèi)共同部署300次。這一點至關重要笋庄,當HubSpot的產(chǎn)品套件有幾個不同的松耦合應用組成:分析效扫,社交媒體,電子郵件直砂,博客和報告工具菌仁。

在web上,我們可以編譯静暂,測試和發(fā)布HubSpotapp獨立的一小部分——包括后臺API和用Java編寫的任務济丘,前端CoffeeScript工程,Python工程籍嘹。為什么移動端不也這么做?

CocoaPods:用起來弯院!

CocoaPods是iOS中出色的依賴管理解決方案辱士,是一個把所有東西聚合的關鍵工具。

一個多應用程序架構可能對你的使用的案例過度使用听绳,但CocoaPods絕對不會——盡管你只是生成一小撮使用案例颂碘,視圖組件或者網(wǎng)絡的第三方庫——花費幾分鐘來設置它是完全值得你去投入的。Ruby椅挣,gem類似的語法在app中整合開源組件中變得幾乎無縫头岔。

核心庫和共享資源,如登錄鼠证,樣式類峡竣,API/認證持久性和訪問可以構建成帶Kiwi測試和podspec文件的獨立工程。

我們將他們發(fā)布在私有CocoaPods倉庫中量九,然后在實際完全編譯的應用中包含他們适掰。然而颂碧,我們進一步把它們建立成各個子app——所有的社交媒體,電子郵件类浪,資源载城,使用樣例——分成一個單獨的podspec,然后使用CocoaPods將它們編譯到一個app中费就。

這意味著诉瓦,我們可以在內(nèi)部發(fā)行單一功能的測試版本,并且可以在一個單一的應用程序進行快速的變更而無需擔心破壞其他工作在不相關的子app開發(fā)者的編譯力细。

我們最終完app的Podfile如下所示:

platform :ios, '6.0'

# networking, slider navigation, routing
pod 'AFNetworking', '~> 1.2.1'
pod 'ViewDeck', '~> 2.2.11'
pod 'JLRoutes', '~> 1.2'

# sub-apps, pulling from the head of each repo for development. alternately, we can pin it to a release version like we do the other pods
pod 'HSAPIClient', :head
pod 'HSCommonResources', :head
pod 'HSMarketingGraderApp', :head
pod 'HSContactsApp', :head
pod 'HSDashboardApp', :head
pod 'HSLoginApp', :head
pod 'HSSocialApp', :head
pod 'HSSourcesApp', :head
pod 'HSSettingsApp', :head
pod 'HSSocialReach', :head
pod 'HSEmailApp', :head

把它粘在一起

細心地讀者會注意到我們使用了一些在主app中粘合IIViewDeckJLRoutes兩個子app具有關鍵作用的開源工具睬澡。

做到這點我們就可以不需要在基礎app的不同菜單項提供信息,并且每個子app的路徑都可控艳汽。每個子app提供了一個實現(xiàn)了一些HSBaseApp方法的協(xié)議類猴贰。

HSBaseApp.h文件如下:

@protocol HSBaseApp <NSObject>
+ (UINavigationController *)baseNavigationController;
+ (NSArray *)menuItems;
+ (NSArray *)routesToRegister;
@end

實現(xiàn)的例子HSSocial.m如下:

+ (UINavigationController *)baseNavigationController {
    return [[HSNavigationController alloc] initWithRootViewController:[[HSSocialViewController alloc] initWithNibName:@"HSSocialViewController" bundle:nil]];
}

+ (NSArray *)menuItems {
    HSMenuItem *calendarMenuItem = [[HSMenuItem alloc] initWithTitle:@"Publishing" icon:@"\\" launchHubSpotApp:[HSSocial class]];
    calendarMenuItem.sectionTitle = @"Social";
    
    return @[calendarMenuItem];
}

+ (NSArray *)routesToRegister {
    HSRoute *newItemRoute = [HSRoute routeWithUrl:@"social/new" andAction:^BOOL(id<HSRoutingDelegate> routingDelegate, NSString *url, NSDictionary *parameters) {
    //  handle route, usually by suppying a UIViewController to the routingDelegate
    }];

    NSArray *routes = @[newItemRoute]; // could be more routes here too

    return routes;
}

我們使用路徑來處理傳入的推送通知,然后我們使用相同的方案將主app和子app進行鏈接——例如河狐,當我們從數(shù)據(jù)源或社交媒體返回數(shù)據(jù)米绕。

HSRoutingDelegate有一點點神奇的是它能繞過當前活動的UINavigationController,然后我們能夠在頂部推出或者創(chuàng)建一個基于上下文的模態(tài)視圖跳轉馋艺,除此之外栅干,一個簡單地JLRoutes基于block的語法也可以達到同樣地目的。

我們還能做什么捐祠?

從長遠來看碱鳞,我們希望擴大我們過去簡單一些共享庫的Kiwi測試或在KIF測試中編譯,這樣每個子app的版本傳遞KiwiKIF測試是建立在一個持續(xù)集成的設置中踱蛀,我們可以選擇已知每個很好的版本窿给,發(fā)行主程序的每個版本。

你在多人協(xié)作中是如何組織大型的iOSapp的呢率拒?有沒有更好的方法崩泡?我們很樂意聽到您的聲音!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猬膨,一起剝皮案震驚了整個濱河市角撞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勃痴,老刑警劉巖谒所,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沛申,居然都是意外死亡劣领,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門铁材,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剖踊,“玉大人庶弃,你說我怎么就攤上這事〉鲁海” “怎么了歇攻?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長梆造。 經(jīng)常有香客問我缴守,道長,這世上最難降的妖魔是什么镇辉? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任屡穗,我火速辦了婚禮,結果婚禮上忽肛,老公的妹妹穿的比我還像新娘村砂。我一直安慰自己,他們只是感情好屹逛,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布础废。 她就那樣靜靜地躺著,像睡著了一般罕模。 火紅的嫁衣襯著肌膚如雪评腺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天淑掌,我揣著相機與錄音蒿讥,去河邊找鬼。 笑死抛腕,一個胖子當著我的面吹牛芋绸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播担敌,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼摔敛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柄错?” 一聲冷哼從身側響起舷夺,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤苦酱,失蹤者是張志新(化名)和其女友劉穎售貌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疫萤,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡颂跨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扯饶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恒削。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡池颈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钓丰,到底是詐尸還是另有隱情躯砰,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布携丁,位于F島的核電站琢歇,受9級特大地震影響,放射性物質發(fā)生泄漏梦鉴。R本人自食惡果不足惜李茫,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肥橙。 院中可真熱鬧魄宏,春花似錦、人聲如沸存筏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽方篮。三九已至名秀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藕溅,已是汗流浹背匕得。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巾表,地道東北人汁掠。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像集币,于是被迫代替她去往敵國和親考阱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理鞠苟,服務發(fā)現(xiàn)乞榨,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫当娱、插件吃既、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,058評論 4 62
  • 跟你們說一件晚飯后我下樓遛狗時遇到的事情鹦倚。 剛打開單元門,排骨就像瘋了一樣拽著我往樓下健身區(qū)的方向跑冀惭,有那么一瞬間...
    陳小魚789閱讀 1,341評論 4 12
  • 真正的可穿戴設備震叙,是讓你戴上它掀鹅,忘了它,在你需要的時候適時的提醒媒楼。我想我終于做到這一點了:靜音 + 飛行模式乐尊,把它...
    競品扣肉閱讀 428評論 0 5