Skip to content

Binlogo-Archive/iOS-Practice-Checklist

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 

Repository files navigation

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

开发社区

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

课程网站

博客

订阅

播客

开发者

Releases

No releases published

Packages

No packages published