當咱們新建一個 Cocoa 項目時,Xcode 會提供一系列的模板,咱們選擇Single View App便可。ios
可構建應用內購買內容包盒空工程——內置收費功能的應用。git
輸入必要的配置信息後,這些信息包括:數據庫
因爲蘋果的封閉性,對 Cocoa 項目的管理基本上都在 Xcode 中進行,Xcode提供了從文檔、編碼、調試、測試,再到簽名、打包、上線的全流程支持。xcode
隨着開發的深刻,咱們的項目變得愈來愈複雜,各類連接庫、子工程相互引用,不一樣 Target、Scheme 配置混雜,還會遇到多人協做開發時詭異的衝突。服務器
Schema、Target、Project 和 Workspace 是組成一個 Xcode 工程最核心的單元,也是咱們首先須要理解的部分。網絡
Target 是咱們工程中的最小可編譯單元,每個 target 對應一個編譯輸出,這個輸出能夠是一個連接庫,一個可執行文件或者一個資源包。它定義了這個輸出怎樣被 build 的全部細節,具體包括:app
在ios項目中, Build Settings,Build Phases 中配置的各類選項,大部分都是須要對應到指定的 target 的。框架
而且,每次咱們在 Xcode 中 run/test/profile/analyze/archive 時,都必須指定一個 target。工具
工程中的 targets 有時候會共享不少代碼、資源,這些類似的 targets 可能對應同一個應用的不一樣版本,好比 iPad 版和 iPhone 版,或者針對不一樣市場的版本。單元測試
Project 很好理解,Project就是一個 Xcode 工程,它管理工程下的全部targets 集合以及它們的源碼,引用的資源,framework 等等。
Project 是管理資源的容器,自己是沒法被編譯的,因此每一個 project 至少應該有一個可編譯的 target,不然就是一個空殼。一個 target 編譯時引用的資源是它所在 project 全部管理資源的子集。
咱們也能夠對 project 進行配置,包括基本信息和編譯選項(Build Settings)等,這些配置會應用到它管理的全部 targets 中,可是若是 target 有本身的配置,則會覆蓋 project 中對應的配置。
在不少狀況下,咱們的工程中只有一個 project。能夠在 finder 中雙擊後綴名爲.xcodeproj 的文件,就能夠直接打開單個 project 了。
若是咱們須要從源碼編譯一個依賴庫,能夠把這些源碼所在的工程做爲主工程的subProject 添加到目錄結構中去。
當一個 target 被多個不一樣的項目依賴,或者 project 之間互相引用,那麼咱們就須要把這些 projects 放到相同的層級上來。管理相同層級 projects 的容器就是 Workspace。
和 projects,target 不一樣,workspace 是純粹的容器,不參與任何編譯連接過程,它主要管理:
細心的童鞋可能已經注意到:當你把不一樣的 projects 放到一個 workspace 中管理後,你仍然能夠用 Xcode 單獨打開其中的某一個 project,可是若是它涉及到對其它 project target 的依賴,這時候你沒法在這個單獨的窗口中編譯成功。
在 iOS 開發中,咱們經常使用 Cocoapods 來管理三方庫,它會把這些三方庫的源碼組裝成一個 project,和主工程一塊兒放入到 workspace 中,自動配置好主工程與 pods 庫之間的依賴。因此若是引入了 Cocoapods,咱們必須打開這個新的 workspace 才能正常 build 原來的項目。
咱們知道蘋果手機中的每一個APP都有一個沙盒,APP就是一個信息孤島,相互是不能夠進行通訊的。可是iOS的APP能夠註冊本身的URL Scheme,URL Scheme是爲方便app之間互相調用而設計的。咱們能夠經過系統的OpenURL來打開該app,並能夠傳遞一些參數。
URL Scheme必須能惟一標識一個APP,若是你設置的URL Scheme與別的APP的URL Scheme衝突時,你的APP不必定會被啓動起來。scheme的命名應該是隻能純英文字符,而不能含有下劃線或者數字。
平常開發中咱們經常點擊 Xcode 左上角的 Run 箭頭來運行調試代碼,這其實就是執行了 Scheme 定義的一個任務。
針對一個指定的 target,scheme 定義了 build 這個 target 時使用的配置選項,執行的任務,環境參數等等。Scheme 能夠理解爲一個工做流,或者藍圖,當咱們點擊 debug,test 按鈕時,Xcode 會按照 scheme 中的定義,去執行對應的工做流。
Scheme 中預設了六個主要的工做流: Build, Run, Test, Profile, Analyze, Archive。包括了咱們對某個 target 的全部操做,每個工做流均可以單獨配置。
Scheme 中最重要的一個配置是選擇 target 的 build configuration,對每個 project,會有兩個默認的 build configuration:debug 和 release。
每一個 configuration 對應了 build target 時不一樣的參數集,好比宏,編譯器選項,bundle name 等等。咱們能夠在 target 的配置頁中更改這些選擇項,也能夠本身建立新的 build configuration,好比爲 App 建立免費和付費版本的配置。
除了 build configuration 外,scheme 還能夠配置:
注:如下部分截取自網絡。
在ios開發中,你簡單最糟心的項目是什麼,確定有人會說要多糟心有多糟心,曾經我也見到過很糟心的項目,沒有采用任何框架,編譯都好幾分鐘的那種。
下面是一個傳統的MVC方式開發的項目的分包:
因爲,此種分別,不少代碼都寫在一塊,因而又出現了按照功能進行的分包策略。例如:
能夠看到,項目就是按照功能進行分包,而後進行業務迭代,估計也是不少公司的項目的樣本。而咱們隊項目進行了一些簡單的歸類,歸類的示意圖以下:
這樣一來,咱們的工程主要有三大部分:Core、Resource、SupportingFiles。其中,Core存放咱們的代碼,也是文章主要說明的部分。Resource用於存放資源,例如圖片、音效、文件等等,SupporrtingFiles用於存放pch、main.m等等文件。
Core的分組主要分爲AppDelegate、Modules、NetWork/Requests、Services、General、Macro、Vendors等六個大模塊。
AppDelegate文件只存放AppDelegate的h和m文件,也能夠放入其餘跟AppDelegate有關的文件,好比咱們寫了一個AppDelegate+Router的Category文件,用來處理rootViewController的變化,這個也應該放到這個分組來比較清晰,而不是放到General的Category。
Modules用於存放應用的業務邏輯代碼,總而言之,Modules就是放App主要業務邏輯和功能代碼的地方。
服務模塊,主要提供應用的基礎服務,好比說Apns推送管理,數據庫,本地推送等等,這一類的封裝以後的功能模塊。
全部的第三方類庫都放到Vendors裏面。
此種分別只供參考,並不絕對和權威,實際採用的分包和開發方案還得根據實際狀況,或者配合一些諸如MVVM等框架來進行拆包。