最近開始學習完整iOS項目的開發流程和思路,在實際的項目開發過程當中,咱們一般須要對項目代碼和資料進行版本控制和管理,通常比較經常使用的SVN或者Github進行代碼版本控制和項目管理。咱們iOS項目的開發工具Xcode原本就集成了Github的代碼控制,因此用GitHub會更方便一些,想具體瞭解Xcode和GitHub連接具體操做步驟的小夥伴能夠戳這裏:iOS學習——Xcode9上傳項目到GitHub。html
建立完項目以後,咱們再對一個項目進行代碼開發以前,咱們首先須要對iOS項目的開發環境進行搭建,咱們的應用名稱、項目名稱、應用圖標、啓動圖片等都是在這一步進行設置的,因此這一部分是整個項目開發的基礎,在後續的開發過程當中也常常會有些設置須要用到這裏的步驟進行修改。可是目前網上查到的資料都很是簡短和零散,因此今天咱們但願對Xcode上iOS項目搭建各類細節都進行一個詳盡的瞭解和學習。java
一 Project 和 Targets區別
首先,iOS項目的開發環境搭建主要就是基於咱們項目的Project 和 Targets進行展開的。那麼,這兩個東西究竟是啥玩意呢?咱們點擊咱們的項目名,就會出現下圖所示的界面。從圖片中能夠看到,在項目導航面板的右側面板上有藍色和紅色框所示的PROJECT和TARGETS兩部分。ios
PROJECT和TARGETS究竟是什麼意思呢?官網的解釋戳這裏:Xcode Concept,看到英文就頭疼的戳這裏看譯文:iOS:[譯]Xcode Concepts--概念Target、Project、Build Setting、Workspace、Scheme。簡單解釋以下:xcode
- project:project是全部文件、資源、信息/配置的repository。一個project包含全部build your products所需的內容而且維護他們之間關係。它能夠包含多個targets。一個project爲全部的target定義默認的build setting(每個target能夠自定義它們的build setting,這些自定義的setting會覆蓋project默認的build setting,這個在後面會講到)。
- target:簡單地說,target定義了project的編譯設置,肯定了project中各類資源和代碼的編譯順序。每一個target都惟一依賴於一個project,可是一個project中能夠有多個targets,上圖所示的target就有2個(KLBaiSi、KLBaiSiTest),每個的設置不一樣,可是同一時間裏只有一個active Target,在編譯時咱們能夠選擇用哪個target進行編譯,具體操做選擇以下圖所示。
- 一個Target和它的product能夠和其餘Target聯繫,若是一個target build須要另外一個target的「輸出」,能夠說成第一個target依賴第二個。若是這倆個target在同一個workspace,Xcode會發現他們的依賴關係,從而build the products按照特定的順序。這樣的關係被稱爲「 implicit dependency.」 你也能夠爲倆個targets指定明確的target 依賴關係在build setting裏面。例如,你可能build一個library和一個連接這個library的application(同一個workspace)。Xcode能夠發現這種關係而且自動build這個library first。然而,你若是要去連接library的某個版本而不是one built in the workspace,你能夠在build settings裏建立一個肯定的依賴關係,它將會覆蓋implicit dependency。
二 project和target的屬性設置
關於project和target的屬性設置,以下圖所示就是project和target的屬性設置界面,左邊是project的屬性設置界面,右邊是target的屬性設置界面。相對而言project的比較簡單,只有info和build setting兩項,畢竟只是對項目資源進行簡單的設置,而target的設置則比較複雜,有general、capabilities、resource tags、 info、build setting、build phases和build rules七項,由於target的每一項設置都直接決定了咱們最終App的顯示效果。下面咱們就一一來學習和了解各個界面的設置有什麼做用。網絡
2.1 project屬性設置
project的屬性設置有兩塊內容,info和build setting,可是project的build setting和target的build setting之間是相關的,target的build setting的一部分設置會繼承project的build setting部分。因此,project的build setting部份內容就放在2.2target屬性設置部分進行統一講解,本小節就主要了解project的info屬性設置部分,info屬性的界面以下:
數據結構
主要分爲三部分:Deployment Target、Configurations和Localizations。app
- Deployment Target:部署配置,主要是對本project的生成的App的能夠運行的最低版本進行配置,默認是當前Xcode上API的最新版本,因此,在咱們的項目中有須要對低版本適配的地方須要在這裏設置。一樣的,咱們還能夠在build setting中對這一屬性進行設置,二者是同步的。
- Localizations:本地化,這裏的功能主要是添加咱們的App所支持的語言,經過上圖最下面的紅色圈內的【+】【-】按鈕能夠添加或刪除不一樣的語種,並能夠選擇根據手機的設置進行不一樣語種的自適應。關於最下面的選擇是否開啓國際化,默認是開啓的,至於如何進行國際化和不一樣語種的適配詳情見:詳述iOS國際化
- Configurations:用來配置iOS項目的xcconfig文件,主要用於在幾套不一樣的開發環境編譯。xcconfig文件其實就是xcode裏的config文件,本質是一個用來保存Build Settings鍵值對的純文本文件。這些鍵值對覆蓋Build Settings中的值,因此當在xcconfig文件中配置了的選項,在Build Settings中設置將失效。咱們在項目中通常不會進行xcconfig文件的自定義。具體xcconfig文件是什麼東東,你們能夠查看:iOS之Xcconfig雜談 。估計不少新入門的iOS開發對xcconfig文件都不是很熟悉(其實我也不是很瞭解。。。), 可是你們可能都用過Cocoapods, 其實Cocoapods的項目配置管理不少都是依賴xcconfig文件去實現的。因此在使用Cocoapods進行導包的項目中,咱們經過打開.xcworkspace文件,咱們會發現project-->info-->configutations下的都有對應的配置文件,而原先沒有用Cocoapods配置的則沒有相關的配置文件,具體區別以下圖所示。
2.2 target屬性設置
在前面我提到了,target的屬性設置的內容比較多,總共有general、capabilities、resource tags、 info、build setting、build phases和build rules七項,接下來咱們就一個一個來了解和學習。框架
2.2.1 target的general屬性設置
target的general屬性設置界面以下圖所示,主要分爲六個部分,下面咱們隊每一部分的設置的意思進行一個解讀。ide
- Identify(標識符)欄主要定義了一些和應用發佈有關的標識屬性。
- Display Name(App應用顯示名):安裝到iOS手機或iPad上App的名稱。
- Bundle Identifier(包標識符)是該應用的惟一ID,用來讓操做系統和AppStore識別。在建立項目或者對象過程當中Xcode就自行建立了包標識符,通常狀況下不要修改它。
- Version(外部版本號)使用戶可以看到的版本號。
- Build(內部版本號)開發者本身看到的版本號,以區份內部測試版本。
- Signing(簽名)主要是進行證書管理,在真機調試或者打包時咱們都須要進行簽名進行認證才能夠的。這裏有一個簡單的使用教程,你們有須要能夠戳這裏: IOS的Automatically Sign功能,直接在設備上打包。
- Deployment Info(部署信息)定義了一些和應用配置相關的標識屬性。
- Deployment Target(部署對象):用來設置支持的最低版本。這個和project的info中的一個意思,而且,這兩個的設置最好是同樣,若是不同,最後的App會以target的設置爲準。
- Devices(設備):用來設置支持的設備,有iPhone、iPad和Universal三個選項。
- Main Interface(主界面):應用啓動時預加載的主界面視圖。通常有兩種方法:
- 一種是經過Main.storyboard進行啓動,設置這種方法須要咱們整個項目的邏輯和跳轉都在Main.storyboard中完成
- 取消stroryboard的方式啓動主界面,而是經過代碼的方式運行main.m的方法進行啓動,並經過在AppDelegate的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中指定主界面視圖進行啓動。通常項目中都是採用這種方法進行的,由於通常項目中界面比較多,不少都是經過純代碼的風格進行定義的,這樣方便修改和定位問題,項目的邏輯也更清晰,特別是多人合做的項目,這種風格更適合。
- Device Orientation(設備方向):定義應用支持的方向。有Portrait、Upside Down、Landscape Left(橫評、Home鍵在左)、Landscape Right幾種方向。
- Status Bar Style(狀態欄樣式)
- App Icons and Launch Images:應用圖標和啓動頁面。主要設置三項:應用圖標、啓動圖片和啓動頁面。具體應用圖標和啓動頁面的大小尺寸介紹見官網:Human Interface Guidelines。
- App icon Source(應用圖標):對應着文件資源Assets.xcassets目錄中的AppIcon中的圖片,以下圖所示。最右邊的面板能夠選擇添加哪種或哪幾種設備上的圖標,每個型號的設備上的圖標的尺寸是不一樣的。在中間有一個個的小格子,咱們將全部切好的圖標直接拖過來,他們會自動找到本身應該放在的格子裏。這些小格子主要分爲四類:
- Notification:通知時的圖標,相似有應用相關的推送消息時,有時候須要顯示本應用的圖標則會顯示這個尺寸的
- Spotlight:搜索小圖標,當在Spotlight中輸入應用名,搜索結果中出現該應用時的圖標就是這個尺寸的,還有設置裏的圖標也是這個尺寸的。
- App:這就是正常的App圖標,安裝好以後在桌面顯示的,或者分享推薦時顯示的應用也是這個尺寸的圖標
- App store:應用商店中的顯示的圖標
- Luanch Image Source(啓動圖片):一樣對應着文件資源Assets.xcassets目錄中的LuanchImage中的圖片,設定了各類狀況下的啓動圖片,具體界面就不截圖了,和Appicon同樣,咱們將全部切好的圖標直接拖過來,他們會自動找到本身應該放在的格子裏。啓動圖片實際上定義了應用啓動後的界面大小,因此在不一樣機型中咱們須要作好適配,見下面的【啓動頁面在屏幕適配中的做用】。一款App必須設定對應設備的啓動圖片,不然點開應用會是一片黑白。
- Luanch Screen File(啓動頁面文件):是一個storyboard文件,做用與Luanch Image同樣,可是啓動文件的優先級高於啓動圖片,就是說若是兩個都設置了,那麼啓動頁面以啓動文件爲準,若是都沒有設置,則沒法啓動。
- 啓動頁面的做用:在咱們點擊應用圖標啓動應用時,應用啓動須要必定的操做時間,再啓動期間,爲了加強應用程序啓動時的用戶體驗,您應該提供一個啓動圖像。啓動圖像與應用程序的首屏幕看起來很是類似。當用戶在主屏幕上點擊您的應用程序圖標時,iPhone OS會當即顯示這個啓動圖像。一旦準備就緒,您的應用程序就會顯示它的首屏幕,來替換掉這個啓動佔位圖像。必定要強調的是,之因此提供啓動圖像,是爲了改善用戶體驗,並非爲了提供:應用程序進入體驗」,好比啓動動畫。
- 啓動頁面在屏幕適配中的做用:每一個機型,好比同時支持iPhone和iPad的程序,須要分別爲iPhone跟iPad指定啓動圖片。當舊的iPhone 4的程序,運行在iPhone 5上面,沒有iPhone 5的啓動圖片,就採用兼容模式,上下留黑邊。當爲iPhone 5指定了新的啓動圖片,系統就認爲這個應用程序是已經適配了iPhone 5的。當舊的iPhone 5程序運行在iPhone 6上面,假如沒有通過適配。舊程序自動等比放大,鋪滿新手機,舊程序也能夠正常運行。這種方案可算是自動適配。但由於舊程序拉伸了,總體看起來有點虛,也不能更好利用大屏空間。當須要開發者手動適配的時候,跟iPhone 4過渡到iPhone 5同樣,在新程序中,指定一張新的啓動圖片。當指定了啓動圖,系統就認爲應用已經作好了屏幕適配,屏幕分辨率就變成應有的大小。在某機型上,若是是自動適配,好比iPhone 5,老版程序就會在屏幕上、下倆端多出倆塊黑條;好比iPhone6/6plus,老版程序就會自動等比拉伸。那如何關閉自動適配?指定啓動圖或者使用Launch Screen File.xib,即程序使用手動適配,不會作拉伸等,可是程序內部必須已作處理,不然使用自動適配方案。
- Embedded Binaries(綁定二進制文件):用來鏈接二進制文件,通常在使用第三方SDK的時候使用。
- Linked Frameworks and Libraries(連接的框架和庫):選擇要連接的框架和庫,既能夠是SDK自帶的框架,也能夠是第三方框架,在Build Phases中也有相似的功能選項。
2.2.1 target的info屬性設置
target的info屬性設置界面以下圖所示,主要分爲五個部分,下面咱們隊每一部分的設置的意思進行一個解讀。工具
在這一部分,最重要的就是第一部分Custom iOS Target Properties自定義iOS目標屬性,其餘的四個部分基本上都不怎麼用,你們不用管就行了。在target的info選項卡中的五項信息與咱們項目資源目錄下的info.plist文件中的內容是一致,而且修改其中一個另外一個會自動修改。此外,咱們在2.2.1中講到的general選項卡中的一些設置也會對應到info.plist文件中,因此這些內容都是相通的,咱們修改一處,其餘的地方會同步次修改。info.plist中其實加載的信息會很是多,上面是建立項目以後自動生成的一些最基本的設置選項,每一項對應的意思以下解釋:
- Localization native development region : 與本地化設置有關,爲默認的開發語言
- Executable file:程序安裝包的名稱
- Bundle identifier:軟件惟一的標識,是根據公司的標識與項目名稱自動生成的,在上傳和測試的時候會用到
- InfoDictionary version:版本信息
- Bundle name:App安裝後顯示的名稱
- Bundle OS Type code:用來標識軟件包類型
- Bundle versions string, short:發佈的版本字符串
- Bundle creator OS Type code:建立者的標識
- Bundle version:應用程序版本號
- Application requires iPhone environment:用於指示程序包是否只能運行在iPhone OS 系統上,默認爲YES
- Launch screen interface file base name:歡迎界面的文件名稱
- Main storyboard file base name:默認狀況下程序的主入口
- Supported interface orientations:設置程序默認支持的方向
除此以外,咱們在開發過程可能還須要添加一些其餘的信息,包括一些權限的添加,網絡權限、定位權限、讀寫聯繫人權限等等,應用白名單的添加等都是在這裏進行配置的。關於info.plist的具體信息和內容詳情參見:Xcode中的Info.plist字段列表詳解。
另外四部分的簡單解釋:
- Document Types 文檔類型:定義了應用程序所能識別的文檔類型,而且還能夠定義在系統中顯示的該類型文檔的自定義圖標。
- Exported UTIs 導出的UTI:UTI Uniform Type Identifiers同一類型標識符。
- Imported UTIs 導入的UTI:
- URL Types URL類型:用來定義URL以便讓應用程序理解應用間交換的數據結構。可用於:IOS喚醒其餘程序,程序間相互調用。例如::在URLTypes中URLSchemes中組冊AAPP;在B程序中,openUrl:[NSURL urlWithString:@"AAPP:"];注意":"冒號,沒有冒號是不能成喚醒另外一個程序的。其次若是參數中有「&」特殊字符穿,建議對參數進行base64轉換。
2.2.3 target的capabilities屬性設置
target的capabilities屬性設置這一塊主要是一些性能設置開關選擇,例如推送通知、雲存儲、遊戲中心、後臺模式等,咱們選擇須要的開關進行打開或者關閉,這些相應的狀態都會在info.plist中進行修改。因此,一樣的,咱們也能夠在info.plist添加一些權限或性能開關以後,在target的capabilities中也會進行相應的修改的。具體的界面以下圖所示:
2.2.4 target中的Resource Tag屬性設置
target中的Resource Tag選項卡主要是爲項目中的資源進行添加tag分類,方便咱們對齊加載順序和加載時機進行選擇和設置,即實現按需加載,在須要的時候才加載資源,屬性設置界面以下圖所示。這樣作的好處就是能夠實現以下幾種資源加載形式:
- 初始資源的延遲加載:app有一些資源是主要功能要用到的,但在啓動時並不須要。將這些資源標記爲「初始須要」。操做系統在app啓動時會自動下載這些資源。例如,圖片編輯app有許多不經常使用的濾鏡。
- app資源的延遲加載:app有一些只在特定情景下使用的資源,當應用可能要進入這些場景時,會請求這些資源。例如,在一個有不少關卡的遊戲中,用戶只須要當前關卡和下一關卡的資源。
- 不經常使用資源的遠程存儲:app有一些不多使用的資源,當須要這些資源時會去請求它們。例如,當app第一次打開時會展現一個教程,而這個教程以後就可能不會在用到。app在第一次啓動時請求教程的資源,這以後只在須要展現教程或者添加了新功能纔去請求該資源。
- 應用內購買資源的遠程存儲:app提供包含額外資源的應用內購買。app會在啓動完成後請求已購買模塊的資源。例如,用戶在一個鍵盤app內購買了SuperGeeky表情包。應用程序會在啓動完成後請求表情包的資源。
- 第一次啓動時必需資源的加載:app有一些資源只在第一次啓動時須要,以後的啓動再也不須要。例如,app有一個只在第一次啓動時展現的教程。
關於Resource Tag和按需加載的詳情內容和步驟參見下面兩篇文章:
2.2.5 target的build setting屬性設置
target的build setting選項卡的是最主要的一部分編譯選項設置,配置界面以下圖所示,界面只是截了一部分,完整的build settings共有20項配置內容。從配置界面上看,每一項的配置都有四列,咱們能夠看到,從左至右的順序分別是:Resolved列、帶Target圖標列、帶Project圖標列、iOS Default列,每一列所表明的意義以下。
- Resolved列:最終肯定的編譯方式,沒法本身設定,其結果是根據其右邊三欄的選擇結果以及優先級順序來肯定最後編譯時採用的編譯方式。在圖的第二行選項卡中選擇combined選項,能夠直接地看到只有該欄的最後結果。
- 帶Target圖標列:target的build setting配置的編譯選項,可自定義。其優先級最高,一旦進行設置,則最後的編譯方式以該欄的結果爲準。
- 帶Project圖標列:project的build setting配置的編譯選項,可自定義,這一欄的結果與project中build setting選項卡中的結果是一致的,修改其中一個地方,另外一處也會自動修改。其優先級介於target和default之間,當target沒有設置編譯選項,而該欄進行了設置時,則最後的編譯方式以該欄爲準。
- iOS Default列:在建立項目時系統自帶的默認編譯選項,沒法修改。優先級最低,只有當其餘兩欄都沒有設置選項時,最後的編譯方式纔會以該欄爲準。
- 優先級順序:帶Target圖標列 >> 帶Project圖標列 >> iOS Default列。
target的build setting選項卡中的每一行具體所表明的編譯詳情參見:Xcode 編譯選項詳解。
2.2.6 target的build phase屬性設置
target的build phase選項卡的的主要功能是配置編譯器在不一樣編譯階段的參數,包括編譯所需的資源文件(包括代碼、配置以及各類資源文件),配置界面以下圖所示,主要包括四方面的內容。
- Target Dependencies Target對象依賴階段:某些Target可能依賴某個Target輸出的值,這裏設置依賴。依賴於其餘target的輸出的時候,在編譯時系統會自動先編譯被依賴的target,獲得輸出值,再編譯當前target。對象依賴階段可讓Xcode知道必須在當前選擇的對象編譯之編譯的其它依賴對象(好比應用擴展、插件等等)。這個階段是沒法被刪除的。
- Compile Sources 源文件編譯階段: 是指將有哪些源代碼被編譯,能夠經過紅框中的【+】【-】按鈕進行添加或刪除資源來控制編譯的代碼文件。而且能夠經過修改改階段的Compiler Flags(編譯器標識)來爲每一個單獨文件設置其編譯器編織,好比優化設置等等。
- Link Binary With Libraries 連接二進制庫階段:是指編譯過程當中會引用哪些庫文件,咱們一樣能夠經過【+】【-】按鈕進行添加或刪除編譯所引用的庫文件。
- Copy Bundle Resources 複製資源文件階段:是指生成的product的.app內將包含哪些資源文件,一樣能夠經過紅框中的【+】【-】按鈕進行添加或刪除資源來控制編譯的資源文件。該階段定義了對象中的資源文件,包括應用程序、圖標、界面構造器、視頻、模板等等。這些資源都會被複制到安裝包的Contents/Resources文件夾下。
2.2.7 target的build rules屬性設置
關於target的build rules這一塊平時沒有接觸過,也沒有進行相關的設置,網上查詢了半天的資料也沒有找到(囧),若是你們有相關的資料,麻煩評論裏留一下,我能夠補充上來。