一份 ios 开发实践检查清单怎么写_主题实践活动查摆问题清单

Ios (26) 2023-03-24 21:40

大家好,我是编程小6,很高兴遇见你,有问题可以及时留言哦。

回顾即开始

目录

  1. 开始项目
  2. 实用公共库
  3. 架构
  4. 数据储存
  5. 资源
  6. 编码规范
  7. 安全性
  8. 诊断

开始项目

Xcode

  • Apple 帮助 - Xcode

.gitignore

  • Git 添加 .gitignore: Swift or Objective-C

依赖管理

  • 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
│	├─ Info.Plist
│	├─ BuildConfigs
│	└─ ···
├─Sources
│	├─ Modules
│   ├─ MyModule
│   │   │   ├─ Models
│   │   │   ├─ Views
│   │   │   └─ Controllers (or ViewModels)
│   │	└─ ···
│   ├─ Stores
│   ├─ Helpers
│   ├─ Utilities
│   ├─ Extentsions
│   ├─ Mediator
│   ├─ Ventors
│   └─ ···
├─Tests
└─ ···
  • 字符串本地化(Localization)
    • WWDC 404 - New Localization Workflows in Xcode 10
    • WWDC 401 - Localizing with Xcode 9
    • WWDC 201 - Internationalization Best Practices
  • 最小化常量作用域(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 自动将各种资源强类型化

  • SwiftDate/DateTool 时间日期处理库

  • RxSwift 响应式编程框架 by ReactiveX.io

  • LayoutKit 高性能视图布局库

  • Kingfisher 轻量级图片下载缓存库

  • NSLogger 便捷日志工具

  • Willow 轻量级日志工具 教程

  • FLEX/DoraemonKit 应用内 Debug 工具库

架构

  • 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 布局
    • Apple 文档 - NSLayoutAnchor
    • WWDC 220 - High Performance Auto Layout
    • WWDC 218 - Mysteries of Auto Layout, Part 1
    • WWDC 219 - Mysteries of Auto Layout, Part 2

Controllers

  • 避免控制器臃肿
    • 8 Patterns to Help You Destroy Massive View Controller
  • 尽量采用依赖注入而不是单例
let fooViewController = FooViewController(withViewModel: fooViewModel)

数据储存

  • 避免“回调地狱”(callback hell)
  • RxSwift 异步响应式编程
func fetchGigs(for artist: Artist) -> Observable<[Gig]> {
    // ...
}
  • CoreData 持久化
    • Apple 文档 - Core Data
    • WWDC 224 - Core Data Best Practices

资源

  • 采用 .pdf 矢量图
  • R.swift 自动集中管理图片、xib、字符串等各项资源
  • ImageOptim 图片优化

编码规范

  • API Design Guidelines for Swift

  • LinkedIn's Official Swift Style Guide

  • //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) {
        // ...
    }
    
}

安全性

  • Apple 文档 - iOS Security Guide

数据储存

  • Token、用户名密码及部分隐私敏感数据避免采用 UserDefaultCoreData 等非加密持久化方式
  • 采用 KeyChain 加密储存敏感数据
    • Apple 文档 - Storing Keys in the Keychain
    • KeychainAccess

网络

  • 采用 https TLS 加密传输

日志采集

  • 设置正确的日志输出等级
  • 线上环境一定不要打印密码等敏感信息
  • 记录基本代码控制流,以便调试

用户交互

  • UITextField 用于密码等敏感信息输入时设置secureTextEntrytrue
  • 必要时清空剪贴板等可能存在的敏感数据
    • applicationDidEnterBackground

诊断

  • 重视并尽量解决编译器警告
  • 静态分析
    • Product → Analyze
  • 调试
    • 开启 Exception 断点
    • Reveal 视图调试
  • 性能剖析
    • Apple 帮助 - Instruments

参与贡献

欢迎指正共建与获取最新状态:Github 仓库 - iOS-Practice-Checklist

发表回复