前言
這篇文章和我的上一篇隔的時間是很長的,為什么呢?主要是因為我發現前面幾篇文章雖然都是我們iOS開發過程中非?;A的知識,但是我實在是表達的很不好,可能是因為我剛開始寫文章的原因吧。這段很長的時間,除了工作上的事情外,我花了很多時間去學習、閱讀很多大V的博客、文章,受益良多,也更發現自己的文章是多么的不忍直視。也希望從這篇文章開始,成為一個分水嶺,思路結構清晰的問章,方便他人,也方便自己。這段時間,其實無論是感悟還是接觸的知識,都很多,但是很亂,寫下來其實就是為了梳理梳理,也為以后積累下來,讓自己有更快的進步。
本文寫的是:
1.如何用一個工程開發幾個類似的app
2.如何在工程中區別對待各個APP
3.自己的經驗總結
需求
很多時候,當我們開發的一個大中型APP成熟以后,為適應業務的發展和市場的開拓,會有從APP中派生出不同的子APP,其功能可能也和本來的應用八九不離十,但是如果每個APP都是一個項目,后期維護成本將會成倍增長,不過幸運的是,我們已有一套方案可以省去絕大部分復制粘貼的時間,達到許多代碼都能復用的效果。
解決方法
解決方案就是采用多個target這一可行有易于理解操作的方法,這個方案簡單易懂,可能有缺點但是很實用。
首先復制出target(我隨便拿了個demo作為例子):
修改復制出來的target的名字以區分,但是,scheme的編輯是必要的,只需要在Manage schemes中修改即可,如圖:
接下來給demo2創建一個文件夾,并給新的target配備配置文件放入其中,首先是這三個:
通過右邊的Target Membership 來指定這些配置的歸屬。然后修改bunle id 和這些配置文件的配置(比如APP的icon、luanchimage等等)即可。
這時,工程中就有兩個target了,而一個target,會生成一個APP,我只需要用Target Membership勾選的方法,把兩個APP共用的模塊選中(當然,.h文件不需要如此):
其實這部分是比較繁瑣的,可以把工程復制,然后采用拖拽copy的辦法,只是記得勾選。但是這些共用的添加完了之后,兩個APP差異的地方怎么體現呢?下面我講講我自己思考實踐出來的處理辦法,希望有更好辦法的同學提出指正:
1.修改Build Settings? -->? Preprocessing -->? Preprocessor Macro? 此例子中我修改為DEMO1、DEMO2,用這個宏來區別兩個target。
2.分別在原APP的文件夾和demo2文件夾中創建配置頭文件,如demo1Config.h、demo2Config.h,這兩個頭文件中可以寫兩個APP都用的上但內容有差異的的宏(如根導航欄顏色等),也可以放入各自需要的類的頭文件以區分。
3.在項目的公共配置文件(如.pch文件)中定義:
#ifdef DEMO1
#import "demo1Config.h"
#endif
//==========================================
#ifdef DEMO2
#import "demo2Config.h"
#endif
4.在有差異的地方用#ifdef XXX? ..... #else? ...... #endif? 區別兩個APP的差異代碼,原理是當編譯target demo2到#ifdef DEMO2 時,只會編譯前面的代碼 #else后面的代碼會被跳過,這樣就可以實現代碼中的區分了。
這種方案需要注意頭文件的import,如果你在target1的代碼中使用了某個類但未導入它的頭文件,在編譯target2的時候是看不出來的,需要特別注意。
總結
在實際的開發中,這種方案確實能夠省去我們很多時間,特別是當同時新增同樣需求的時候,但是也相應帶來了項目的pbxproj臃腫龐大,也讓配置文件多了起來,如果差異處多的話,代碼量、代碼的工整性以及代碼可讀性都會有一定的影響,對于是不是用就需要見仁見智了,如果想思考替代方案的話,可以閱讀參考另一種方案 ,本文結束。