一份 iOS 开发实践检查清单

7,624 阅读3分钟

回顾即开始

目录

  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