一份 iOS 開發實踐檢查清單

回顧即開始html

目錄

  1. 開始項目
  2. 實用公共庫
  3. 架構
  4. 數據儲存
  5. 資源
  6. 編碼規範
  7. 安全性
  8. 診斷

開始項目

Xcode

.gitignore

依賴管理

sudo gem install cocoapods # 安裝
pod init # 初始化建立 Podfile
pod install/update # 安裝/更新依賴
複製代碼
brew install carthage # 安裝
carthage bootstrap/update # 安裝或更新依賴
複製代碼

工程目錄結構

  • 熟悉並保持合理的目錄結構
AwesomeProject
├─ Assets
│	├─ Info.Plist
│	├─ Localizable.strings
│	├─ R.generated.swift # 可選,R.swift 生成
│	├─ LaunchScreen.storyboard
│	├─ Assets.xcassets
│	├─ ProjectName.entitlements
│	├─ Info.Plist
│	├─ BuildConfigs
│	└─ ···
├─Sources
│	├─ Modules
│   ├─ MyModule
│   │   │   ├─ Models
│   │   │   ├─ Views
│   │   │   └─ Controllers (or ViewModels)
│   │	└─ ···
│   ├─ Stores
│   ├─ Helpers
│   ├─ Utilities
│   ├─ Extentsions
│   ├─ Mediator
│   ├─ Ventors
│   └─ ···
├─Tests
└─ ···
複製代碼
// 全局常量建議採用 Enum 定義
enum Constants {
    static let myConstant = "Just a constant"
}
enum Apprearance {
    enum Sizes {
        static let gutter: CGFloat = 15
        static let cardGutter: CGFloat = 8
        ···
    }
    enum Color {
        static let primaryColor = UIColor(red: 0.22, green: 0.58, blue: 0.29, alpha: 1.0)
    	static let secondaryColor = UIColor.lightGray
        static let background = UIColor.white

        enum Red {
           	// 可視化顏色
            static let medium = #colorLiteral(red: 0.22, green: 0.58, blue: 0.29, alpha: 1.0)
            static let light = #colorLiteral(red: 0.22, green: 0.58, blue: 0.29, alpha: 1.0)
        }
    }
}
複製代碼

實用公共庫

架構

Model

Views

Controllers

let fooViewController = FooViewController(withViewModel: fooViewModel)
複製代碼

數據儲存

  • 避免「回調地獄」(callback hell)
  • RxSwift 異步響應式編程
func fetchGigs(for artist: Artist) -> Observable<[Gig]> {
    // ...
}
複製代碼

資源

  • 採用 .pdf 矢量圖
  • R.swift 自動集中管理圖片、xib、字符串等各項資源
  • ImageOptim 圖片優化

編碼規範

import SomeExternalFramework

class FooViewController : UIViewController {

    let foo: Foo

    private let fooStringConstant = "FooConstant"
    private let floatConstant = 1234.5

    // MARK: Lifecycle

    // Custom initializers go here
	···
}

// MARK: View Lifecycle
extension FooViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // ...
    }
    
}

// MARK: Layout
extension FooViewController {
    
    private func makeViewConstraints() {
        // ...
    }
    
}

// MARK: User Interaction
extension FooViewController {
   	
    func foobarButtonTapped() {
        // ...
    }
    
}

// MARK: FoobarDelegate
extension FooViewController: FoobarDelegate {
    
    func foobar(foobar: Foobar, didSomethingWithFoo foo: Foo) {
        // ...
    }
    
}

// MARK: Helpers
extension FooViewController {
        
    private func displayNameForFoo(foo: Foo) {
        // ...
    }
    
}

複製代碼

安全性

數據儲存

網絡

  • 採用 https TLS 加密傳輸

日誌採集

  • 設置正確的日誌輸出等級
  • 線上環境必定不要打印密碼等敏感信息
  • 記錄基本代碼控制流,以便調試

用戶交互

  • UITextField 用於密碼等敏感信息輸入時設置secureTextEntrytrue
  • 必要時清空剪貼板等可能存在的敏感數據
    • applicationDidEnterBackground

診斷

  • 重視並儘可能解決編譯器警告
  • 靜態分析
    • Product → Analyze
  • 調試
    • 開啓 Exception 斷點
    • Reveal 視圖調試
  • 性能剖析

參與貢獻

歡迎指正共建與獲取最新狀態:Github 倉庫 - iOS-Practice-Checklist

相關文章
相關標籤/搜索