Xcode工程結構詳解

當咱們新建一個 Cocoa 項目時,Xcode 會提供一系列的模板,咱們選擇Single View App便可。
在這裏插入圖片描述ios

工程模板

Application類型

  • Master-detail Application.
    能夠構建樹形結構導航模式應用,生成的代碼中包含了導航控制器和表示圖控制器。(表示圖控制器指的是導航控制器裏的界面);
  • Game. 構建基於iOS的遊戲應用;
  • Page-Based Application. 平鋪導航,相似於電子書效果;
  • Tabbed Applecation. 構建標籤導航模式應用,生成的代碼中包含了標籤控制器和標籤欄。
  • Single View Application. 構建簡單的單個視圖應用。

Framework & Library類型

  • Cocoa Touch Framework:自定義應用於UIKit框架。
  • Cocoa Touch Library:可建立基於Foundation框架的靜態庫。

Other類型

可構建應用內購買內容包盒空工程——內置收費功能的應用。git

輸入必要的配置信息後,這些信息包括:數據庫

  • 編譯選項、證書鏈選項
  • 項目 Target、單元測試 Target
  • 基於 git 的版本控制管理
  • 默認的源文件。

在這裏插入圖片描述
因爲蘋果的封閉性,對 Cocoa 項目的管理基本上都在 Xcode 中進行,Xcode提供了從文檔、編碼、調試、測試,再到簽名、打包、上線的全流程支持。xcode

隨着開發的深刻,咱們的項目變得愈來愈複雜,各類連接庫、子工程相互引用,不一樣 Target、Scheme 配置混雜,還會遇到多人協做開發時詭異的衝突。服務器

Xcode基礎概念

Schema、Target、Project 和 Workspace 是組成一個 Xcode 工程最核心的單元,也是咱們首先須要理解的部分。網絡

Target

Target 是咱們工程中的最小可編譯單元,每個 target 對應一個編譯輸出,這個輸出能夠是一個連接庫,一個可執行文件或者一個資源包。它定義了這個輸出怎樣被 build 的全部細節,具體包括:app

  • 編譯選項,好比使用的編譯器,目標平臺,flag,頭文件搜索路徑等等。
  • 哪些源碼或者資源文件會被編譯打包,哪些靜態庫、動態庫會被連接。
  • build 時的前置依賴、執行的腳本文件。
  • build 生成目標的簽名、Capabilities 等屬性。

在ios項目中, Build Settings,Build Phases 中配置的各類選項,大部分都是須要對應到指定的 target 的。
在這裏插入圖片描述框架

而且,每次咱們在 Xcode 中 run/test/profile/analyze/archive 時,都必須指定一個 target。工具

工程中的 targets 有時候會共享不少代碼、資源,這些類似的 targets 可能對應同一個應用的不一樣版本,好比 iPad 版和 iPhone 版,或者針對不一樣市場的版本。單元測試

Project

Project 很好理解,Project就是一個 Xcode 工程,它管理工程下的全部targets 集合以及它們的源碼,引用的資源,framework 等等。

Project 是管理資源的容器,自己是沒法被編譯的,因此每一個 project 至少應該有一個可編譯的 target,不然就是一個空殼。一個 target 編譯時引用的資源是它所在 project 全部管理資源的子集。

咱們也能夠對 project 進行配置,包括基本信息和編譯選項(Build Settings)等,這些配置會應用到它管理的全部 targets 中,可是若是 target 有本身的配置,則會覆蓋 project 中對應的配置。

在這裏插入圖片描述
在不少狀況下,咱們的工程中只有一個 project。能夠在 finder 中雙擊後綴名爲.xcodeproj 的文件,就能夠直接打開單個 project 了。

若是咱們須要從源碼編譯一個依賴庫,能夠把這些源碼所在的工程做爲主工程的subProject 添加到目錄結構中去。
在這裏插入圖片描述

Workspace

當一個 target 被多個不一樣的項目依賴,或者 project 之間互相引用,那麼咱們就須要把這些 projects 放到相同的層級上來。管理相同層級 projects 的容器就是 Workspace。

和 projects,target 不一樣,workspace 是純粹的容器,不參與任何編譯連接過程,它主要管理:

  • Xcode 中的 projects,記錄它們在 Finder 中的引用位置。
  • 一些用戶界面的自定義信息(窗口的位置,順序,偏好等等)。

細心的童鞋可能已經注意到:當你把不一樣的 projects 放到一個 workspace 中管理後,你仍然能夠用 Xcode 單獨打開其中的某一個 project,可是若是它涉及到對其它 project target 的依賴,這時候你沒法在這個單獨的窗口中編譯成功。

在 iOS 開發中,咱們經常使用 Cocoapods 來管理三方庫,它會把這些三方庫的源碼組裝成一個 project,和主工程一塊兒放入到 workspace 中,自動配置好主工程與 pods 庫之間的依賴。因此若是引入了 Cocoapods,咱們必須打開這個新的 workspace 才能正常 build 原來的項目。

Scheme

咱們知道蘋果手機中的每一個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 還能夠配置:

  • 運行時的環境變量(Environment Variables)
  • 啓動時設置給 UserDefaults 的參數(Arguments Passed on Launch)
  • App 執行時的系統語言、模擬的定位座標、國家等環境參數
  • runtime,內存管理,日誌,幀率檢測等調試選項。

工程目錄分包策略

注:如下部分截取自網絡。

在ios開發中,你簡單最糟心的項目是什麼,確定有人會說要多糟心有多糟心,曾經我也見到過很糟心的項目,沒有采用任何框架,編譯都好幾分鐘的那種。
下面是一個傳統的MVC方式開發的項目的分包:

  • Bms:這個文件夾下主要放的是與業務相關的文件;
  • Application:這個文件夾下主要放的是UI相關的文件、業務控制層相關的文件、數據模型、業務邏輯相關的文件等;
  • BaseServer:這個文件夾下主要放的是 UI 業務邏輯相關文件和業務數據邏輯相關的文件;
  • Controllers:這個文件夾下主要放的是業務相關控制類,例如:UIViewcontroller;
  • Dtabase:這個文件夾下主要放的是數據庫相關的業務文件;
  • Models: 這個文件夾下主要放的是業務數據實體(數據模型);
  • View:這個文件夾下主要放的是UI窗口組件和UI 公共組件;
  • Config:這個文件夾下主要放的是一些自定義的配置文件,例如:宏定義文件、自定義 .plist文件、.pch文件等;
  • Helpers:這個文件夾下主要放的是一些輔助業務相關的輔助文件;
  • IM:這個文件夾下主要放的是即時聊天相關的業務文件;
  • Core:這個文件夾下主要放的是一些核心代碼,好比一些三方包,工具類,底層代碼等;
  • Database:這個文件夾下主要放的是一些數據庫底層核心代碼;
  • IM:這個文件夾下主要放的是即時聊天模塊的核心代碼;
  • Libs:這個文件夾下主要放的是三方包文件,例如:FMDB 三方包;
  • Network:這個文件下主要放的是與服務器交互的核心文件,例如:Https、Socket、Webserver等;
  • Utils:這個文件夾下主要放的是一些系統經常使用的工具類,例如:獲取時間工具類,文件大小等;
  • Supporting Files :這個文件夾下主要放的是系統生成的文件,好比:AppDelegate文件、info.plist文件和 main.m文件;
  • Resource:這個文件夾下主要放的是一些資源文件,好比:圖片文件、音頻文件等;
  • Frameworks: 這個文件夾下主要是將用到系統的
    Frameworks,整理到這個文件夾下,好比:AVFoundation.framework
  • Products:這個文件夾是系統本身生成的,主要放的是 .app文件。

因爲,此種分別,不少代碼都寫在一塊,因而又出現了按照功能進行的分包策略。例如:

在這裏插入圖片描述

能夠看到,項目就是按照功能進行分包,而後進行業務迭代,估計也是不少公司的項目的樣本。而咱們隊項目進行了一些簡單的歸類,歸類的示意圖以下:
在這裏插入圖片描述

這樣一來,咱們的工程主要有三大部分:Core、Resource、SupportingFiles。其中,Core存放咱們的代碼,也是文章主要說明的部分。Resource用於存放資源,例如圖片、音效、文件等等,SupporrtingFiles用於存放pch、main.m等等文件。

Core的分組主要分爲AppDelegate、Modules、NetWork/Requests、Services、General、Macro、Vendors等六個大模塊。

AppDelegate

AppDelegate文件只存放AppDelegate的h和m文件,也能夠放入其餘跟AppDelegate有關的文件,好比咱們寫了一個AppDelegate+Router的Category文件,用來處理rootViewController的變化,這個也應該放到這個分組來比較清晰,而不是放到General的Category。

Modules

Modules用於存放應用的業務邏輯代碼,總而言之,Modules就是放App主要業務邏輯和功能代碼的地方。

Services

服務模塊,主要提供應用的基礎服務,好比說Apns推送管理,數據庫,本地推送等等,這一類的封裝以後的功能模塊。

Vendors

全部的第三方類庫都放到Vendors裏面。

此種分別只供參考,並不絕對和權威,實際採用的分包和開發方案還得根據實際狀況,或者配合一些諸如MVVM等框架來進行拆包。

相關文章
相關標籤/搜索