Binlogo / Ios Practice Checklist
Programming Languages
Projects that are alternatives of or similar to Ios Practice Checklist
iOS 实践与精进检查清单
回顾即开始
目录
开始项目
Xcode
-
[ ] Apple 帮助 - Xcode
-
[ ] 自定义项目信息配置 - IDETemplateMacros.plist
-
[ ] 配置 Target
.gitignore
-
[ ] Git 添加
.gitignore
: Swift or Objective-C- [ ] 工具:gitignore.io
依赖管理
- [ ] CocoaPods 文档
sudo gem install cocoapods # 安装
pod init # 初始化创建 Podfile
pod install/update # 安装/更新依赖
- [ ] Carthage (Swift) 文档
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
└─ ···
-
[ ] 字符串本地化(Localization)
-
[ ] 最小化常量作用域(Constants)
// 全局常量建议采用 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)
}
}
}
-
[ ] Git 分支模型
- [ ] git-flow 的工作流 - Tower
- [ ] gitflow-avh 拓展
实用公共库
-
[ ] Alamofire 网络库
-
[ ] Moya 基于 Alamofire 封装的网络抽象层
-
[ ] Reachability.swift 用于网络状况检查
-
[ ] R.swift 自动将各种资源强类型化
-
[ ] RxSwift 响应式编程框架 by ReactiveX.io
-
[ ] LayoutKit 高性能视图布局库
-
[ ] Kingfisher 轻量级图片下载缓存库
-
[ ] NSLogger 便捷日志工具
-
[ ] FLEX/DoraemonKit 应用内 Debug 工具库
-
[ ] Keychain 便捷封装库
- KeychainAccess
- Valet by Square, Inc.
架构
- [ ] Model-View-Controller (MVC) in iOS: A Modern Approach
- [ ] Introduction to MVVM
- [ ] MVVM with Coordinators and RxSwift
- [ ] ReactiveCocoa and MVVM, an Introduction
Model
- [ ] 保持 Model 不可变性,
struct
+Codable
Apple 文档 - [ ] SwiftyJSON / Argo [可选]
Views
-
[ ] 采用 AutoLayout 布局
Controllers
-
[ ] 避免控制器臃肿
-
[ ] 尽量采用依赖注入而不是单例
let fooViewController = FooViewController(withViewModel: fooViewModel)
设计模式
数据储存
- [ ] 避免"回调地狱"(callback hell)
- [ ] RxSwift 异步响应式编程
func fetchGigs(for artist: Artist) -> Observable<[Gig]> {
// ...
}
-
[ ] CoreData 持久化
资源
- [ ] 采用
.pdf
矢量图 - [ ] R.swift 自动集中管理图片、xib、字符串等各项资源
- [ ] ImageOptim 图片优化
编码规范
-
[ ]
//MARK:
+Extension
分组结构化代码
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) {
// ...
}
}
安全性
数据储存
-
[ ] Token、用户名密码及部分隐私敏感数据避免采用
UserDefault
或CoreData
等非加密持久化方式 -
[ ] 采用
KeyChain
加密储存敏感数据
网络
- [ ] 采用
https
TLS 加密传输
日志采集
- [ ] 设置正确的日志输出等级
- [ ] 线上环境一定不要打印密码等敏感信息
- [ ] 记录基本代码控制流,以便调试
用户交互
-
[ ]
UITextField
用于密码等敏感信息输入时设置secureTextEntry
为true
-
[ ] 必要时清空剪贴板等可能存在的敏感数据
- [ ]
applicationDidEnterBackground
- [ ]
诊断
-
[ ] 重视并尽量解决编译器警告
-
[ ] 静态分析
- [ ] Product → Analyze
-
[ ] 调试
- [ ] 开启
Exception
断点 - [ ] Reveal 视图调试
- [ ] 开启
-
[ ] 性能剖析
开发社区
借助社区的力量,并积极融入社区,贡献自己的力量
课程网站
博客
- Paul Hudson
- John Sundell
- Antoine van der Lee
- Vadim Bulavin
- Keith Harrison
- Majid Jabrayilov
- Bart Jacobs
- Soroush Khanlou
- Erica Sadun
- Andrew Bancroft