iOS 练级之路

回首十多年来移动互联网的发展,我们既可以回顾历史,抓住那些耀眼的瞬间,也可以以史为鉴,为我们指明未来的道路。如今 移动市场 Android 和 iOS 横扫天下,那我们该走全栈学习之路还是专精之路。从个人角度看:作开发,必须要先专精然后再全栈,但作管理,先要有全栈意识再专精。对于 iOS,虽然早已接触,但比较少整理这方面的内容,今天跟同事进行 1 on 1 访谈时,都谈到跨平台学习,颇有感触,特地整理并发布。

一、责任

不管做什么,我们要做一个负责的人,对团队负责、对项目负责,以项目为导向。

  • 保持一个良好的代码规范以及文件架构;
  • 每天要给自己做一个清单,时刻保持自己是在有效率的工作;
  • 有空时将排行榜上的应用下载排名靠前的应用,去欣赏并分析主流 APP 的界面,功能实现,在拿到设计图时,去考虑界面的合理性,功能怎么实现最符合用户的操作习惯;
  • 要有一定的协调能力,交流能力,了解一些后台知识以及前端知识;
  • 信念,要有做高手的信念,不想当将军不是一个好兵,要有一个规划,按照自己正确的规划去学习,去成长,别原地踏步。

二、iOS 定位

2.1 入门

2.1.1 了解 Xcode,并会使用 Xcode

首先了解 Mac,然后是 Xcode 菜单栏,要知道每个菜单里每项功能的英文都是什么意思,有助于自己熟悉并加深印象的使用 Xcode,熟悉 Xcode 的各个功能。

  • 基础操作 状态栏
  • 偏好设置
  • Xcode Source Control 源代码管理器
  • Xcode workSpace工作组
  • Xcode Scheme 计划
  • Xcode AutoLayout 约束
  • Xcode CoreData数据库
  • LLDB 断点调试
  • StoryBoard
  • 界面预览
  • 界面适配
  • 内存监测
  • 全局断点
  • 全局搜索替换
2.1.2 了解 Swift(Objective-C)语法

如果你只会一门编程语言,无论多么精通,仍然显得不够优秀;确实,即便你只精通一门编程语言,也要进行各种语言的了解,不能因为自己不从事相关的工作,就不进行了解学习,干坐井底之蛙。
例如 Swift 和 Java 的区别和新特性,不同的语言虽然语法不同,但是其逻辑思想是通用的,也就是说,学会一门语言,再学习另一门语言就比较容易。

关键词:编程范式,反射、注解、泛型

  • 基础语法
  • 对象
  • 属性
  • 数据类型
  • 方法
  • 继承
  • Frame/CGRect/CGPoint和CGSize
  • 内存(针对MRC下情况进行介绍)
  • ARC/MRC
  • 弱引用/强引用
2.1.3 程序启动原理
  • APP 组成(Info.plist、.pch)
  • 打开程序
  • 执行 main 函数
  • 执行 UIApplicationMain 函数
  • 初始化 UIApplication(创建设置代理对象,开启事件循环)
  • 监听系统事件
  • 结束程序
2.1.4 APP 生命周期
  • alloc
  • init
  • 创建View
  • ViewDidLoad
  • ViewWillAppear
  • ViewDidAppear

  • ViewWillDisappear //视图将要消失 (做一些视图将要消失时的 UI 的处理)

  • ViewDidDisappear //视图已经消失 (做一些视图消失之后数据的处理)
2.1.5 会使用基础 UI 控件
  • UILabel 标题栏
  • UIButton 按钮
  • UIImageView 图片视图
  • UITextField 文本输入框
  • UITextView 文本展示视图
  • UIProgressView 进度条
  • UISlider 滑动开关
  • UIGesture 手势
  • UIActivityIndicator 菊花控件
  • UIAlertController 警告视图控制器
  • UIScrollView 滚动视图
  • UIPageControl 页面控制器
  • UISearchBar 搜索框
  • UITableView 表视图
  • UICollectionView 集合视图
  • UIWebView 网页浏览器
  • UISwitch 开关
  • UISegmentControl 选择按钮
  • UIPickerView 选择器
  • UIDatePicker 日期选择器
  • UIToolbar 工具栏
  • UINavigationBar 通知栏
  • UINavigationController 通知视图控制器
  • UITabbarController 选择视图控制器
  • UIImagePickerController 相册
  • UIImage 图片
2.1.6 开发者账号&上架流程
  • 个人
  • 公司
  • 企业
2.1.7 版本打包

会打包,如上传各分发平台,苹果应用商店;了解 APP 上架规则,分析上架被拒的原因及如何处理。

  • 编译打包
  • 版本适配

2.2 初级

说明:作为初级的 iOS 开发,需要掌握。

2.2.1 数据存储
  • plist
  • NSKeyedArchiver
  • SQLite
  • FMDB
  • CoreData
  • NSUserDefault
  • 沙盒存储
  • NSDictionary归档
2.2.2 常用知识
  • 通信
  • NS 系列
  • 宏定义
  • 视图层次
  • 切换视图
  • 深浅拷贝
  • 对象序列化
  • 写入文件
  • 获取沙盒路径
  • 翻转视图
  • 延伸视图
  • 九大基本数据类型
  • 九宫格
  • 坐标比较
  • UIColor 、CIColor 和 CGColor 之间的关系
  • 画图
  • 静态变量
  • tag 值
  • 延时执行方法
  • 界面旋转+状态栏隐藏
  • plist 文件
  • KVC/KVO
  • 谓词 NSPredicate
  • 帧动画
  • AutoLayout
  • isKindOfClass 与 isMemberOfClass
  • Return/Break/Continue
  • Core Animation
  • CALayer
  • Quartz2D
  • 真机调试
  • 静态库
  • 内存管理
  • iPad 与 iPhone 的区别
  • 响应链
  • 异常捕捉
  • 国际化
  • 代码模块化
  • 类别/扩展
2.2.3 第三方库的灵活使用

了解及集成常用的第三方库,能够处理第三方库引起的崩溃。

2.2.4 各种网站的使用

收藏并阅读各种大神的博客或者论坛,开始考虑项目中的细节优化,内存处理和耗电情况。

2.3 中级

说明:作为中级的 iOS 开发,需要掌握。

  • 应用的内存处理
  • 应用的推送处理
  • 应用的模块化/单元测试
  • 应用的第三方集成/集中化管理/稳定迭代
  • 阅读强大的第三方源码/拥有快速上手新的第三方库的能力.
  • 能够接受各种新功能的开发(解决任何业务需求:例如:蓝牙.AR.摄像头.硬件交互等)
  • 清楚明白数据的传递方式,应用与后台如何交换数据,交换数据的过程,结果,格式.
  • 多线程的灵活使用
  • 各种并发事件的处理/以及界面的合理性/流畅度
  • 设计模式的灵活使用
2.3.1 各种工具的使用

其实每个项目的建立都大致分为:项目框架搭建,原生界面搭建,嵌入第三方库。有很多功能都会用到第三方库,大多数第三方库都是本着快速开发,完整功能实现的目的存在的。需要开发人员能够根据业务逻辑不同,选择最好最优质的第三方库进行使用。

2.3.2 常用知识
  • 设计模式
  • UIScrollView/UITableView/UICollectionView 的嵌套
  • 动态行高
  • 通知/代理/block
  • 程序启动原理
  • 触摸事件/手势
  • 图文混编
  • Runtime
  • NSRunLoop
  • GCD
  • ReactiveCocoa 开发
  • 3DTouch
  • 界面渲染
  • Charles 花瓶抓包
  • 区分模拟器/真机项目
2.3.3 代码封装

当使用较多第三方库后,要求开发人员学习其开发特点,以及其封装手法,运用在自己的项目上,封装自己的代码,灵活运用。

2.4 高级

说明:作为高级的 iOS 开发,需要掌握。

  • 应用的组件化/架构分层
  • 数据结构,操作系统,计算机网络都有自己的了解和认知
  • Shell 脚本/python/Ruby/JS 至少会一种.
2.4.1 常用知识
  • 单例模式
  • 多线程
  • 网络请求
  • 定位
  • 源代码管理 Git
  • 真机调试
  • 苹果内购/广告
  • 推送/远程推送
  • 音频/视频/二维码
  • Block
  • 蓝牙/传感器
  • 物理仿真器UIDynamic
  • 通讯录获取
2.4.2 加密
  • MD5 详解
  • Base64 加密解密
  • RSA 非对称加密
  • AES 对称加密
2.4.3 音频
  • 基础
  • Core Audio
  • Audio Toolbox
  • OpenAL
  • AVFoundation
  • Speex语音聊天
  • AudioQueue/AudioSession
  • Speex简介
2.4.4 视频
  • AAC视频.H264推流
  • P2P传输
2.4.5 直播
  • 直播的技术分析与实现
  • RTMP协议
  • RTMP直播应用与延时分析
  • 如果做一款inke版的App
  • 推流发布和播放RTMP
  • FFmpeg
  • 基于FFmpeg的推流器
  • HLS流媒体传输协议(HTTP Live Streaming)
  • FFmpeg
  • ijkPlayer
2.4.6 算法
  • 简介
  • 冒泡排序
  • 快速排序
  • 插入排序
  • 归并排序
  • 二分查找
  • 希尔排序
  • 动态规划
  • 堆排序

三、iOS 扩展

3.1 框架的学习

  • 苹果自带框架

  • 第三方框架

3.2 跨平台开发

React Native 开发,由 Facebook开源,React Native 使你能够在 Javascript 和 React 的基础上获得完全一致的开发体验,构建世界一流的原生 APP。
Flutter 由 Google 开源的项目

3.3 官方 Kit

了解官网上面的各种 Kit 官方 API,因为有可能新的业务需求就是官方API调用的事就解决了。

  • ARKit
  • SiriKit
  • HealthKit
  • HomeKit
  • SearchKit
  • IOKit
  • PDFKit
  • CloudKit
  • GameplayKit
  • SpriteKit
  • SceneKit
  • MusicKit
  • ResearchKit
  • MapKit
  • StoreKit
  • AVKit

3.4 iOS APP 逆向

APP 逆向比较深奥,想学,但还没找到入口。

3.5 苹果官方文档 & 新 API

苹果开发者官网有对每个 API 的解释,使用,介绍。

3.6 代码设计能力

代码设计能力主要体现在如何设计代码,设计模式的核心在于六大原则,而不是具体的某些设计模式。

3.7 工具设计能力

工具设计能力在于使用工具的过程中,了解工具的实现,尝试去设计更适合工程的工具,这部分需要大量的代码积累。另一方面由于工具是可复用的,对代码设计能力的要求是有的,所以属于更高。

3.8 工程规划能力

  • 抗风险
  • 成本
  • 回报

3.9 附加

  • 崩溃日志分析
  • 移动端加解密
  • 数据结构 & 算法导论
  • 混合开发
  • 机器学习
  • ARKit
  • RAC
  • iOS 工程化
  • 模块化开发
  • 组件化开发
  • 单元测试
  • 技术经理
  • 产品经理
  • 架构师
  • 阿里技术前沿
  • 跟随巨人的脚步

3.10 工具使用

  • IDE
  • 编译调试
  • 版本管理
  • 产品设计
  • SDK使用

3.11 常用模块

常用模块则是平常在快速搭建和开发 APP 当中,会调用一些自己或别人历史的积累和经验总结而成的第三方库或者工具库。
关键词:图片库,网络库,启动引导模块,登录注册模块,运营统计模块,编译打包,版本适配。

组件化、模块化、插件化
  • 模块:强调职责,可实现的单元,其核心是内聚和分离
  • 组件:也称构件,强调复用,其依赖性比较高
  • 插件化:则是另一种实现方式,其三种方式目的均是为了实现重用和解耦,而插件化则是更注重增量满足其目的
设计模式、接口设计、架构模式
  • 设计模式是指,在实现业务逻辑时,代码逻辑的目标和实现模式,例如:MVP,MVVM,MVC等
  • 接口设计的概念却是主要体现在封装的概念上,一个强大的库,其封装的接口越灵活,越成熟
  • 架构模式......

这三点,可谓是架构的重中之重,一个项目代码是否高效,是否成熟,都和这三个有着密不可分的关系。

3.12 安全逆向

  • 逆向分析
  • 安全测试
  • 安全建议

混淆签名
加固加壳
安全编码

3.13 性能优化

  • 硬件性能
  • UI和CPU
  • 内存性能
  • 网络性能
  • 包Size
  • 启动速度
  • 代码优化

3.14 架构和重构

重构分为两种:代码重构和架构重构

  • 组件化和模块化
  • UML基本功
  • 设计模式
  • 接口设计
  • 架构模式选型
  • 重构

3.15 质量和稳定

  • 质量稳定性指标
  • CI和代码监控
  • Crash
  • 测试

兼容性测试
自动化测试
性能安全测试
A/B Testing
代码覆盖率


四、iOS 架构

iOS 架构,架构是一个成熟的概念,是每一个开发工程师都可以进行学习,提升自己的一条路径。

个人觉得从码农转变为架构师,就是从用语言到理解语言、拓展语言的一个思想转变。如果你只是单纯的使用语言完成业务需求,只思考自己的业务栈,那便是码农;但如果你去思考,怎么用,为什么用,怎么组合更好,那便是架构师思想了。以整个项目的开发观念去看待自己个人的业务逻辑如何实现,怎么实现更高效,那么你就正在向架构师转变。

听说过这么一句话:19 年将会是互联网前 10 年最惨的一年,却是后 10 年最好的一年,我还是坚信无论大环境变成什么样,努力学习准没错。努力的人有很多,有很多大神以及正在成为大神的人都在默默努力着,他们正在默默努力、厚积薄发。


五、 iOS 常见应用场景

首先,在公司日常的交流,要稳重不失礼节,出问题的时候,要针对问题提出解决方案,而不要带情绪。
当有新的业务需求提出时,根据自己的实力,给出不同的业务方案。

5.1 购物车

购物车可以说是在各个客户端最经典的案例了,这是一个业务需求,也是涉及到增删改查,异步处理等各种业务逻辑混杂于一身的业务需求。
一个健壮的购物车,可以说是必备的业务技能和登录注册同理。

5.2 支付

有了购物车就一定会有支付,熟悉支付宝、微信、银联、苹果支付 IAP 等各种支付平台的接入,接入流程。

5.3 蓝牙

蓝牙这个就重要了,公司的主打业务之一。主要在于 BLE 连接的稳定性、重连机制等设计

5.4 摄像头

5.5 3DTouch

5.6 直播

直播现在中小型公司普遍采用第三方直播平台,可以先去阿里云、腾讯云、七牛云等开发平台了解,技术文档是开放的。

5.7 视频处理

视频处理,例如转码、旋转、编码。
不同格式的处理,视频大小的处理,为什么QQ和微信的小视频可以做到超级压缩?
如何对视频进行滤镜处理,类似抖音那样。

5.8 图片渲染&滤镜

GPUIImage 是一个集滤镜,图像处理的框架,可以学习如何添加滤镜,处理图片。

5.9 Socket & XMPP

即时聊天,也是当下流行的技术,每个 APP 几乎都少不了要有一个聊天功能,即使没有,也会涉及到客服,反馈等功能。
那么即时聊天遵循什么协议,用什么来做的呢?可以了解一下 iOS 当中如何用 Socket 实现简易聊天,或者使用 XMPP 协议实现聊天?


Refer