Skip to content

Latest commit

 

History

History
355 lines (250 loc) · 10.8 KB

README.md

File metadata and controls

355 lines (250 loc) · 10.8 KB

iOS 实践与精进检查清单

回顾即开始

目录

  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
│    ├─ 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 视图调试
  • 性能剖析

开发社区

借助社区的力量,并积极融入社区,贡献自己的力量

课程网站

博客

订阅

播客

开发者