1. 一个 iOS 开发者的十年,从 2015 到 2025
2015 年入行做 iOS 开发的时候,我刚把第一份简历里的“熟悉 Objective-C 基础语法”改成“熟练掌握”,心里其实虚得很。那会儿 Swift 1.2 刚发布没多久,整个圈子都处在一种亢奋和焦虑并存的氛围里——今天是 OC 还是 Swift,明天要不要用 React Native,后天有人说 Apple 要封杀热修复。
十年后再回头看,我想把自己这十年的经历完整地还原出来,不是为了写什么情怀,而是给在那条路上走得还不太稳的人一份参考。这篇内容的核心关键词就一个:iOS 开发。但它牵扯出来的东西太多了——语言选型、跨端框架、前后端一体的技能栈、个人定位、职业规划,甚至包括心态管理。
这十年里,我亲眼看着一批人从 OC 切换到 Swift,又看着另一批人从 Swift 切到 uniapp,再到微信小程序、鸿蒙,每一次技术变局都有人踩空摔伤,也有人顺势起飞。这篇文章不会告诉你“哪个语言最好”或者“该不该转型”,那些答案只存在于特定的情境里。我会做的,是把从 2015 到 2025 这十年间我自己亲身经历的关键节点、技术选型背后的考量、踩过的坑和事后总结的经验,一次讲透。
无论你现在是刚入行准备选方向的应届生,还是做了几年 App 想评估要不要转跨端的在职开发者,又或者正在纠结要不要学鸿蒙开发,这篇长文应该都能让你少走一些弯路。
2. iOS 开发生态这十年的几个分水岭,以及它们如何改变开发者的选择
2.1 2015 年的 iOS 开发:OC 的黄金尾巴
2015 年,App Store 的生态已经跑通了很多年,iOS 开发正处在整个移动互联网红利最肥美的阶段。当时一个能独立上架的 iOS 开发者,找工作基本是“挑公司”,而不是“被挑”。我入行的时候用的还是 Objective-C,内存管理靠 MRC 时代留下的老程序员手把手带——后来 ARC 普及了,但面试官还很喜欢问 strong、weak、copy 的区别,以及 block 里要不要用 weakSelf。
那个时候 iOS 开发的日常工作,说白了就是写界面、调接口、适配各种机型尺寸。iPhone 6 那年刚发布,屏幕从 3.5 英寸跳到 4.7 和 5.5 英寸,Auto Layout 成了必修课。很多从纯代码布局过来的老程序员都经历过“Masonry 真香”的过程,我至今记得第一次用 SnapKit 从 OC 过渡到 Swift 时的奇妙感受。
也正是那一年,我开始意识到一个问题:iOS 开发的技能树不是一成不变的,它会被苹果每年一次的 WWDC 重画一遍。你要么跟上,要么被落下。
2.2 Swift 的崛起与 ABI 稳定:语言层的世纪之战
2014 年苹果发布 Swift 的时候,很多 OC 老程序员嘴上说“瞎折腾”,私下已经在偷偷看苹果官方的 Swift 编程语言电子书。2015 年入行的我们正好赶上了一个微妙的节点:公司老项目是 OC,新项目有人提议上 Swift,但 Swift 1.x 和 2.x 的 API 变动太激进,SourceKit 崩溃是家常便饭,混编的时候模块导入和桥接头文件能把人逼疯。
直到 Swift 5 在 2019 年宣布 ABI 稳定,这门语言才真正“成年”。这个过程让我学到了一件事:语言选型不能只看当下顺手不顺手,要看背后的生态支撑和长期的稳定性。ABI 稳定意味着 Swift 运行时被打进系统,以后 App 包体积不用再背一份 Swift 动态库,这直接推动了后来 SwiftUI 的普及。
很多人回头问我“2015 年的时候该不该学 Swift”,我会说—— 任何一次语言生态的切换,最早冲进去的人会有阵痛,但等技术稳定下来,先发优势就会变成不可逆的竞争壁垒。当时从 OC 转到 Swift 的开发者,到 2020 年以后几乎全部成了团队里的核心架构力量。
2.3 从 iOS 9 到 iOS 26:系统能力如何重塑 App 的玩法
这十年的 iOS 系统版本变化,不只是数字在涨,它对开发者工作的影响是根基性的。我按年份把关键的里程碑拉出来,你可以对照着回忆一下自己当时踩过哪些坑:
那期间我印象最深的系统事件有好几个。iOS 10 开放了 SiriKit,一个语音交互的入口对开发者彻底打开;iOS 12 推出了捷径(Shortcuts),让 App 的能力可以在系统层面串联;iOS 13 的深色模式,逼着所有 App 重新审视配色体系;iOS 14 的 App Clips,让“小程序”形态第一次出现在 iOS 生态里;再往后 iOS 16 的灵动岛,以及 iOS 17、iOS 18 在 Widget 和交互方式上持续升级。
每一次系统能力升级,对我这样的独立和团队开发者都是双重压力——一方面觉得新能力好酷,另一方面担心老用户升级后产生兼容性问题。做 iOS 开发最稳定的工作内容,反而变成了“适配新系统、保住老用户”。
2.4 跨端开发三巨头之争:React Native、Flutter 与 uniapp
如果把 iOS 开发这十年的变局限制在一个问题上,争议最大的肯定是“要不要用跨端框架”。我从 2016 年开始接触 React Native,后来又认真用过 Flutter,再后来被微信小程序和 uniapp 拖着走,每一轮切换都是“想骂娘又不得不服”的状态。
React Native 刚出来那会儿,它承诺“一次编写,处处运行”,但真正实践以后你会发现:iOS 和 Android 的底层差异永远不可能靠一层 JS 桥接抹平。性能稍复杂一点的列表滚动,原生和 RN 的体验差距立刻暴露。不过 RN 最大的价值不是性能,而是让前端开发者能够用 JavaScript 业务逻辑接入移动端,团队的人才供给一下宽了。
Flutter 是另一个极端。它的自绘引擎让 UI 一致性做到极致,Dart 语言一开始用着别扭,但熟悉以后反而觉得它在一些场景下的表现比 Swift 抽象得更好。我做过的几个工具类 App,用 Flutter 开发的体验丝滑程度甚至超过了原生实现。
uniapp 的经历更有意思。因为这玩意儿直接绑定微信生态,你可以在同一套代码里同时发 App、小程序、H5。很多小团队和外包公司把它当成“救命稻草”,因为它确实能用极低成本覆盖全端。但它的问题是—— 跨端框架的价值是“覆盖全端”,代价是“深度上做不透”。真正要做到 iOS 上的极致体验,最终还是要回到原生开发。
我的观点是:跨端框架不是 iOS 开发的敌人,而是应用场景细分后的必然结果。问题是开发者自身的定位要清晰——你是做一个全端逻辑搬运工,还是做一个能把 iOS 端体验打磨到极致的原生工匠?这两个方向的职业发展路径完全不同。
3. 一个 iOS 开发者的技术栈演进:从 OC 到 Swift,再到融会贯通
3.1 初入行的技术栈:UI 为主、接口为辅
我刚入行那两年,每天写的最多的代码是 UITableView 和 UICollectionView,辅助工具是 Charles 抓包,看接口文档用的是公司自己搭的 YApi。那个阶段的技术栈非常”应用层“——网络请求用 AFNetworking,图片加载用 SDWebImage,JSON 解析用 MJExtension,页面跳转用 Storyboard 加 Segue,后来被大厂带起来的纯代码布局习惯才慢慢普及。
从现在的视角往回看,那两年的技术积累其实是最不扎实的,但也是最重要的。因为你在那段时间建立了对 iOS 开发最基本的直觉:一个界面从数据到呈现,要走完“请求 -> 解析 -> 刷新 UI”这条链路,而链路中的每个环节都有自己独立的坑。网络层要考虑超时和重试,解析层要考虑弱网导致的字段缺失,刷新 UI 要考虑线程切换。这些底层的“体感”是所有上层框架都无法替代的。
3.2 中期的架构思维:MVC 到 MVVM 再到 Combine
到了 2018 年前后,我开始不适应用 MVC 写大业务模块。控制器动辄上千行,View 和 Model 之间的耦合越来越离谱,每次需求变更都要翻半天代码。也就是从那时候开始,iOS 社区的架构讨论声量大起来——MVVM 的概念从客户端开始火,配合 RAC(ReactiveCocoa)和后来 Swift 版的 RxSwift,响应式编程一度成了 iOS 开发者简历里的标配。
但经历过那段时期的人都知道,MVVM 并不比 MVC 高级多少。它的核心价值不是消灭代码量,而是理清数据流。真正让我对架构产生敬畏的,是后来苹果推出的 Combine 框架和 SwiftUI 的声明式开发模式。Combine 把 Publisher 和 Subscriber 概念植入系统底层,你用原生的方式也能写出响应式代码,不需要再引入庞大的 RxSwift 依赖。
我的体会是:与其纠结用哪个架构,不如想清楚“数据从哪里来、到哪里去、怎么变化”。架构模式会过时,但数据流的思维方式不会。
3.3 性能优化与崩溃治理:从“能用”到“流畅”
2019 年是我个人对 iOS 开发认知变化最大的一年。那一年我开始重度参与 App 性能优化和崩溃率治理,才发现“功能能用”和“体验流畅”之间隔着一整座山。
崩溃排查上,我处理过最多的三类问题是:数组越界、字典 nil 值写入、主线程卡顿。听起来都是很基础的问题,但一旦用户规模和业务复杂度上来,任何一个小概率崩溃都会变成每天成百上千的告警。我当时的习惯是每一条崩溃日志都要追到代码行,而不是靠重启自愈,这个笨功夫让团队把崩溃率从千分之五压到了万分之三。
性能优化方面,我把冷启动时间从 3.2 秒优化到了 1.8 秒,手段其实就是三板斧:减少启动时的同步任务、懒加载所有非首屏资源、用 Instruments 的 Time Profiler 反复卡热点。这些方法论单独拿出来都很简单,难的是坚持在每一个版本里都执行。
3.4 2025 年的 iOS 开发者该掌握什么
到现在这个节点,你要说“纯 iOS 开发”就够了,我是不信的。2025 年的 iOS 开发者的技术栈已经是一个综合体。除了 Swift、SwiftUI、UIKit、Core Data、Combine 这些原生主干之外,你还得懂一些基础的算法和数据结构、熟悉网络协议、了解 App 上架与审核规则、能处理隐私合规问题、会写基础的自动化测试,甚至还要对前端开发有一定理解,因为你不知道团队什么时候会决定把一个页面用 uniapp 或者 React Native 重写。
我接触了不少优秀的 iOS 开发者,他们有一个共性:不把自己定义为“iOS 程序员”,而是“写出好产品的人”。工具只是手段,对用户体验的理解和工程化的管理能力,才是未来五年拉开差距的关键。
4. iOS 开发 vs Android vs 鸿蒙 vs 微信小程序:一个过来人的选型建议
4.1 四端对比:各自的优劣势不能只看表面
“iOS 开发、Android 开发、鸿蒙开发、微信小程序”,这四个词放一起,经常让新人晕头转向。我这些年做过的项目和接触过的团队,几乎把这四种端到端的情况都经历了。我用一个表格把它们的核心差异列出来,方便你留个印象:
单看表格还太抽象,我多说几句实际感受。iOS 开发的学习曲线前期看起来陡,是因为 Swift 语言和 Xcode 工具链都有一定的独占性,但一旦突破了最初“环境配置”和“基本语法”的关卡,后续开发的顺滑度在几个端里是数一数二的。Android 开发的碎片化问题至今依旧存在,厂商 ROM 的兼容性测试有时候比写代码还累。鸿蒙开发现在的热度很高,DevEco Studio 和 ArkTS 的起步速度很快,生态正在快速补课,但你要说它已经能完全替代 Android 和 iOS 的深度能力,那还为时过早。微信小程序和 uniapp 更像是“业务前端”的产物,做营销页、做工具类轻应用、做私域流量入口,它们是效率神器;但做重交互、高性能的核心产品主端,原生依然是绕不开的选择。
4.2 我的选型决策框架
每次做技术选型,我脑子里其实有一套固定的决策框架:第一看产品形态,是需要极致的性能和系统能力深入,还是偏重业务试错和快速上线;第二看团队构成,现有成员的前端底子还是原生底子更好;第三看维护周期,这个项目是要长期打磨还是三个月上线抢时间窗口;第四看生态依赖,是否需要接入大量第三方 SDK,而这些 SDK 对跨端框架友好度如何。
举个例子,2021 年我参与一个智能硬件配套 App 的决策。那款硬件需要在蓝牙通信上有低延迟的表现,同时 UI 自定义程度极高,还要和硬件固件做深度的协议交互。我们当时直接排除了 uniapp 和微信小程序,最后在原生 iOS 和 Flutter 之间选了原生,原因就是蓝牙后台模式、系统弹窗权限和初始化时序上的控制力,原生有绝对优势。反过来,2023 年我做一个面向商家的营销工具,逻辑简单、页面跳转多、需要同时覆盖微信和 App,直接上了 uniapp,一个月不到内核就稳定了。
4.3 给新人的建议:到底先学哪个
如果你是一个完全零基础、想入行移动开发的人,我的建议是别被“学哪个好”困住。移动端开发的底层逻辑是通的——UI 绘制、事件分发、网络请求、数据缓存、页面生命周期,这些东西在任何一端都存在。你只要吃透一端,再学另一端的速度会快得超出你的想象。
我先推荐从 iOS 开发入手,理由有三点:第一,iOS 的工具链相对封闭统一,少了很多环境适配的挫败感,适合建立正向反馈;第二,Swift 是一门设计上很现代的语言,可读性强,比起把大量时间耗在诡异的构建配置上,你能更快地理解“编写代码 -> 运行调试 -> 打包分发”的完整链路;第三,苹果的官方文档和 WWDC 视频质量极高,自学的知识密度比碎片化的博客大得多。
从 iOS 入门之后,再去接触微信小程序或 uniapp,你会发现自己只是在用不同的语言和框架重新表达同样的业务逻辑。到那时,选型不再是一个“焦虑”的问题,而是一个“根据场景怎么组合收益最大”的问题。
5. 从 2015 到 2025 的十点血泪经验,每一条都踩过坑
5.1 不要迷信“xx 语言已死”的论调
这十年里,我听过“OC 必死”“Swift 不行”“Flutter 就是花架子”“跨端根本没有未来”,结果呢?OC 的项目到今天还在跑,Swift 成了 iOS 的主流语言,Flutter 在不少团队里用得风生水起,跨端在小程序场景下已经是绝对主流。
“已死论”本质上是把自己能力的不足,投射到了技术本身。技术在迭代,但每一种技术的生命周期远比舆论喊的“死亡”要长得多。你真正需要关注的是它解决的问题是否还存在,以及你对它的理解深度是否在提升。
5.2 多读苹果官方文档,胜过一百篇二手解析
我前三年的大量时间浪费在看零散博客和碎片帖子上面,效果其实很差。后来强迫自己啃 Apple 的官方文档和 WWDC Session 的文字记录,知识体系才慢慢完整起来。苹果的文档可能不够“接地气”,但准确性和深度是所有第三方内容代替不了的。
尤其是每年 WWDC 之后,官方文档会同步更新新 API 的设计思路和迁移指南,这些一手信息是你在面试和技术对决时拉开差距的关键。
5.3 处理主力业务之前,先把基础的数据结构和算法补扎实
iOS 开发的日常业务很少遇到复杂的算法题,但这不代表算法没用。我在做图片缓存淘汰策略时用到 LRU,在做多线程任务依赖时用到图论里的拓扑排序,在做搜索历史时用到 Trie 树。你不需要成为算法竞赛选手,但基础的数据结构和算法概念必须有,否则遇到性能瓶颈时你会完全无从下手。
5.4 崩溃日志和线上监控是最诚实的老师
本地调试只能证明“在我的手机上没问题”,线上监控才能暴露真实用户的使用场景里发生了什么。我早期对友盟、Bugly、Firebase Crashlytics 这类工具的态度很敷衍,直到被一个在线程安全上犯的低级错误整到半夜上线回滚,才老老实实把崩溃日志当成必修课。上线的第二天,看到崩溃率曲线往下掉的时候,那种踏实感是写新功能无法带来的。
5.5 自动化测试不是可有可无的装饰
很多 iOS 开发者的心态是“UI 脚本测试容易挂,不如手点”。我承认 UI 自动化测试的维护成本确实不低,但核心业务模块的单元测试和关键链路的 UI 冒烟测试,能省掉的回归时间远比写测试的时间多。我在团队里推着一套最朴素的方案:每个核心模块至少有三个核心用例,每个版本发布前跑一遍完整冒烟测试。就这一个习惯,让线上严重事故的发生频率降了一半。
5.6 代码审查不是走形式,是防御性设计的第一道防线
2017 年有个事故让我至今记忆犹新——一个同事提交了一段看似无害的字典操作代码,在下线前的紧急改动里,因为一个 key 拼写错误,导致支付回调信息丢失。那之后我们严格执行“哪怕是一个人改一行,也要 person 拉着看一遍”的规则。代码审查的价值不仅是找 bug,更是强制要求写代码的人用讲一遍的逻辑自我梳理,很多问题在这个过程里自己就暴露了。
5.7 保持对跨端和新生态的敏感度,但别做墙头草
我见过太多人,前两年扑在 React Native,后两年又完全转向 Flutter,再看到鸿蒙火了又开始焦虑。他们每天都很“忙”,但积累下的东西都不深。我的原则是:原生技术是压舱石,跨端技术是动态储备。你把原生吃透,学习任何跨端方案都是降维打击;反过来,如果你只会在 uniapp 里拖组件,换一个技术栈就归零。
5.8 写代码之外,要能看懂产品逻辑和商业诉求
一个只懂技术的 iOS 开发者,很容易成为“需求翻译机”。而一个具备产品思维的开发者,会在产品经理说出“这里要加个引导”的时候,追问一句“这个引导是为了提升留存还是为了拉新转化”——这两种诉求对应的交互细节是完全不同的。你在代码里的每一个取舍,都应该能连接到一个用户价值或商业目标上。
5.9 职场和独立开发是两条完全不同的成长路径
这几年我也看到很多 iOS 开发者动了“做独立 App”的念头。独立开发和职场打工完全是两种能力模型,后者考验的是执行闭环,前者考验的是发现问题和定义问题的能力——你的时间预算、审美水平、推广渠道、变现模式,每一项都是生死线。我的经验是:先在职场上把工程能力和交付节奏打磨到“拿得出手”,再考虑独立开发的事,否则很容易一腔热血变成了三分钟热度。
5.10 心态管理是长期主义的燃料
这个行业最大的特点是变化快。焦虑源头从来不是技术本身,而是“别人都会我不会”的比较心态。我后来的做法是:给自己建一张“能力地图”,按季度标记哪些技能要补、哪些技能要深、哪些技能可以放弃,然后按部就班去执行。与其焦虑未来会怎样,不如把每一个当下能掌控的知识点学到扎实。十年下来,这张地图已经迭代了 40 多次,它比任何绩效评估都更能说明我的成长轨迹。
6. 未来两三年,iOS 开发者的新考验与应对思路
6.1 鸿蒙带来的不是替代,而是重新洗牌
鸿蒙生态这两年发展得太快了。很多人问我“鸿蒙会不会干掉 iOS 开发”,我的判断是不会短期内取代,但它确实会切割掉一部分市场——尤其是政企类和国内 IoT 类的项目,未来很可能默认要求鸿蒙版本。这就意味着,一个团队里至少要有一个人能看懂鸿蒙 ArkTS,能评估鸿蒙原生和跨端方案的边界。
对 iOS 开发者来说,最理想的姿态不是“彻底转型”,而是“保持观望 + 掌握最小可用的鸿蒙开发能力”。当项目真正需要的时候,因为你有 iOS 原生基础打底,学 ArkTS 的状态模型和 UI 框架成本不会太高。
6.2 Apple Vision Pro 和空间计算的长期价值
很多人吐槽 Apple Vision Pro 销量不好,但从开发者的角度看,空间计算是一个新物种。VisionOS 的 SwiftUI 3D 布局能力、空间交互的点击和手势模型、沉浸式场景的渲染管线,整套逻辑都和我们熟悉的 iOS 开发不一样。但底层语言还是 Swift,框架还是 SwiftUI 的延伸,这对 iOS 开发者是一个极其友好的先手信号。
我的策略是:把它当成一个“能力期权”来准备,不投入大量时间,但也绝不忽略。等生态真正成熟的那一天,能抓住这波机会的,大概率还是现在这批原生底子扎实的人。
6.3 AI 辅助开发:效率工具,而非职业替代
回到当下最热的 AI 编程,我想给所有 iOS 开发者一个定心的结论:AI 在“生成代码”这件事上确实很强,但它在“理解业务、做技术决策、处理复杂系统的边界问题”上,还远没有到替代人的程度。我日常用 AI 辅助写 Swift 的重复性 UI 模板、快速生成单元测试、优化正则表达式、解释一段晦涩的崩溃堆栈,效率提升非常明显。但项目的整体架构、模块间依赖关系、用户数据安全策略,这些依然需要人来决策。
你真正该担心的不是 AI 取代你,而是“会用 AI 的同行”正在拉开和你的差距。
7. 这十年的收尾,也是下一个十年的起点
写到这里,其实我心里很清楚,这篇内容不像是一篇技术教程,更像是一份阶段性的自白。2015 年的时候我 24 岁,刚入行,觉得 iOS 开发是一条可以走一辈子的路;2025 年,我 34 岁,依然在写 Swift,但心态已经完全不同——我不再把某个语言、某个平台当成安身立命的全部,而是把它们当成解决问题的工具箱里的一个个选项。
回看这十年,我最庆幸的一件事是:面对每一次技术变局,我都没有站到“守旧”的一边,也没有盲目冲到“追新”的最前线。我只是保持了一个合格工程师该有的敏感和冷静——该学的时候不偷懒,该用的时候不犹豫,该放下的时候不执念。
如果你也正好处在这个行业里,无论是刚起步还是已经走了很远,我都建议你给自己也画一张“十年地图”。不用太复杂,只要记录每个阶段你掌握了什么技能、解决了什么问题、积累了哪些认知。等你攒够了十年,回头再看,你会发现自己走过的路,远比想象中更值得。