iOS 工程規范 – iPhone手機開發 iPhone軟體開發教學課程

iOS 工程規范,之前為公司定瞭一個內部的 iOS 工程規范,其實也是我個人的風格,下面記錄一下發出來。

Xcode 工程結構

註意事項

工程命名應該和項目一致,遵循 UpperCamelCase 寫法(第一個詞的首字母,以及後面每個詞的首字母都大寫,除瞭 iOS 的 i 這種),禁用中文。 為瞭避免文件雜亂,物理文件應該保持和 Xcode 項目文件同步。Xcode 創建的任何組(group)都必須在文件系統有相應的映射。 工程文件裡不能記錄某些賬號和密碼。 盡量不要有 warning: 類似數據類型隱式轉換這種低級的 warning 絕不能出現。類似 perform unrecognizer selector 這種 warning 可以用 #pragma clang diagnostic push 這種編譯指令將其去掉(所有 warning 參見 fuckingclangwarnings.com)。對於 CocoaPods 安裝第三方庫帶來的 warning 可以在 Podfile 中配置 inhibit_all_warnings! 去掉。對於開發者自己打的 warning ,在發佈版本之前要逐個檢查,確認無誤或者完成後才能發佈。 工程必須要有 README.md 和 CHANGELOG.md ,建議每個代碼文件夾寫一個 README.md 說明該模塊是做什麼的,起到文檔作用。 工程中每個自己新建的文件都必須帶有前綴標識,前綴標識必須全局一致,全部字母大寫。

App 工程結構(目前僅適用於 Objective-C 工程,傳統的 MVC 架構)

兩種建議(假設下面的工程以 DMP 為前綴):

第一種是先按代碼邏輯劃分,再在每個目錄中按功能模塊細分:

|—— DemoProject
|   |—— Common: 存放全局通用的頭文件,例如 DMPConstants.h, DMPAppKeys.h, DMPMacros.h
|   |—— Vendor: 不適合通過 CocoaPods 引入的第三方類庫,例如需要經常改動的或者自己定制的
|   |—— Resources: 存放各種資源,例如語言國際化文件組成的 bundle 文件,Images.xcassets 等
|   |—— Utils: 工具類,可以便捷地遷移到其它工程
|   |   |—— Categories: 存放各種 Category
|   |   |—— Helpers: 例如獲取設備信息、App 信息之類的工具類
|   |—— Models: 數據模型類
|   |—— Logic: 各種業務邏輯類
|   |   |—— Global: 例如 App Config,Notification Center 這種全局通用的
|   |   |—— SDKWrapper: 為瞭避免 AppDelegate.m 過於龐大,可以把一些 SDK 邏輯封裝下單獨出一個類
|   |   |—— Network: 網絡邏輯
|   |   |—— Storage: 數據持久化
|   |   |—— Cache: 緩存
|   |   |—— 其它根據工程自行拓展
|   |—— Views: 視圖類
|   |   |—— Common: 所有全局共用的 UI 組件
|   |   |—— TableView:
|   |   |   |—— Headers: UITableView 的 Headers
|   |   |   |—— Cells: UITableViewCell 子類
|   |   |   |—— Footers: UITableView 的 Footers
|   |   |—— CollectionView:
|   |   |   |—— ReusableViews: UICollectionReusableView 子類
|   |   |   |—— Cells: UICollectionViewCell 子類
|   |   |—— Storyboards: 存放一個或多個 storyboard 文件
|   |   |—— Others: 針對特定場景定制的 UI 組件,根據功能劃分模塊,例如 Login, Home, My
|   |—— Controllers: 視圖控制器類
|   |   |—— Base: 各種 ViewController 的根類,例如 DMPBaseViewController, DMPBaseTableViewController
|   |   |—— Entrance: 存放各種 App 啟動時的入口頁面控制器,例如配置入口的 DMPControllersManager, 閃屏 DMPSplashController, 引導頁 DMPIntroduceController, 正常入口 DMPRootTabBarController 等
|   |   |—— 根據功能劃分模塊,例如 Login, Home, My
|   |—— AppDelegate.h/m
|   |—— Supporting Files
|   |   |—— Info.plist, main.m, pch 等
|—— DemoProjectUnitTests: 單元測試對應的目錄
|—— Scripts: 在 Archive 時自動保存 dSYM 文件的腳本,讀取 dSYM 和 Crash 的腳本等,不用添加到 Xcode 工程中
|   |—— dSYM: 存放每次 Archive 生成的 dSYM

第二種是先按功能模塊劃分,再按代碼邏輯劃分:

假設有 Entrance, Home, Games, My 幾個功能模塊,分別表示程序入口,主頁,遊戲頁面,個人主頁。

|—— DemoProject
|   |—— Vendor: 不適合通過 CocoaPods 引入的第三方類庫,例如需要經常改動的或者自己定制的
|   |—— Resources: 存放各種資源,例如語言國際化文件組成的 bundle 文件,Images.xcassets 等
|   |—— Base: 基礎模塊,為具體功能模塊做支撐
|   |   |—— Common: 存放全局通用的頭文件,例如 DMPConstants.h, DMPAppKeys.h, DMPMacros.h
|   |   |—— Models: 數據模型類
|   |   |—— Views: 全局通用的視圖類,自定的 UI 組件祖先類放在這裡
|   |   |—— Controllers: 各種 ViewController 的根類,例如 DMPBaseViewController, DMPBaseTableViewController
|   |   |—— Helpers: 便於遷移到其它工程的工具類
|   |   |—— Categories: 各種 Category
|   |   |—— Logic: 負責各種基礎邏輯的類
|   |   |   |—— Global: 例如 App Config,Notification Center 這種全局通用的
|   |   |   |—— SDKWrapper: 為瞭避免 AppDelegate.m 過於龐大,可以把一些 SDK 邏輯封裝下單獨出一個類
|   |   |   |—— Network: 網絡邏輯
|   |   |   |—— Storage: 數據持久化
|   |   |   |—— Cache: 緩存
|   |   |   |—— 其它根據工程自行拓展
|   |—— Modules: 各種功能模塊
|   |   |—— Entrance: App 入口模塊
|   |   |   |—— Interfaces: 本模塊公用的頭文件,例如一些公用的常數、宏、Protocol、enum 定義等
|   |   |   |—— Models: 本模塊用到的數據模型類
|   |   |   |—— Views: 本模塊涉及的頁面類
|   |   |   |—— Controllers: 本模塊涉及的視圖控制器類
|   |   |   |—— Helpers: 本模塊涉及的業務邏輯類,例如負責佈局的 LayoutUtil,負責動畫的 AnimationUtil
|   |   |—— Home: 主頁模塊
|   |   |   |—— ... 
|   |   |—— Games: 遊戲模塊
|   |   |   |—— ...
|   |   |—— My: 個人主頁模塊
|   |   |   |—— ...
|   |—— AppDelegate.h/m
|   |—— Supporting Files
|   |   |—— Info.plist, main.m, pch 等
|—— DemoProjectUnitTests: 單元測試對應的目錄
|—— Scripts: 在 Archive 時自動保存 dSYM 文件的腳本,讀取 dSYM 和 Crash 的腳本等,不用添加到 Xcode 工程中
|   |—— dSYM: 存放每次 Archive 生成的 dSYM

兩種各有優缺點,可以自行根據喜好選擇合適的結構。

在 Build Settings 中設置 Enable Modules 和 Link Frameworks Automatically 為 YES,避免手動引入各種系統 frameworks.

圖片資源管理

App 盡量使用 Images.xcassets 進行管理,必須包含 @2x 和 @3x 文件,較大的圖片或背景圖片可以使用 JPEG 格式代替。

圖片文件命名采用 prefix_module_identifier_state 規則。

prefix 表示圖片類型的前綴,舉例:

icon btn bg line logo pic img

module 表示所屬的場景模塊,例如:common, home, my 等。

identifier 表示圖片的標識。

state 表示素材的狀態,例如按鈕處於正常狀態還是選中狀態。

舉例:icon_common_setting, btn_home_play_selected.

依賴管理

App 統一使用 CocoaPods 進行第三方依賴管理, SDK 盡量避免引入第三方類庫。

Podfile 示例:

platform :ios, '7.0' # 指定 App 最低版本

# Target for App
target "H5GameCenter" do

    pod 'AFNetworking', '~> 2.6.0' # 需要指定版本號

    inhibit_all_warnings! # 禁止所有 warnings

end

# Target for Unit Tests
target "HGCUnitTests" do

    pod 'OHHTTPStubs', '~> 4.3.0'

    inhibit_all_warnings!

end

小提示:如果每次都用 pod install 命令安裝,會非常慢,因為 CocoaPods 會檢測類庫是否需要更新,可以使用 pod install --no-repo-update 繞過檢測更新進行安裝。

代碼管理

1.分支管理統一用 git flow

2.Objective-C 工程 .gitignore 規范

# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## Build generated
build/
DerivedData/

## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/

## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint

## Obj-C/Swift specific
*.hmap
*.ipa

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts

Carthage/Build

# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md

fastlane/report.xml
fastlane/screenshots

3.commit message 不能太隨意

測試

對關鍵的邏輯必須要有單元測試。

Code Review

暫無。

發佈留言