回顾即开始
-
自定义项目信息配置 - IDETemplateMacros.plist
-
配置 Target
-
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 分支模型
-
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 不可变性,
struct
+Codable
Apple 文档 - SwiftyJSON / Argo [可选]
-
采用 AutoLayout 布局
-
避免控制器臃肿
-
尽量采用依赖注入而不是单例
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 视图调试
- 开启
-
性能剖析
借助社区的力量,并积极融入社区,贡献自己的力量