ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

十年iOS开发实战:从Objective-C到Swift的跨平台演进与职业思考

十年iOS开发实战:从Objective-C到Swift的跨平台演进与职业思考 2015年那会儿我刚毕业没多久揣着一台8G内存的MacBook Air和一本《Objective-C编程之道》稀里糊涂地进了iOS开发的坑。当时iOS 9刚发布iPhone 6s还在热卖3D Touch是全场焦点Xcode的版本号还停留在7。谁能想到这一写就是十年。十年里我从小厂实习生做到大厂技术专家从一个人扛整个App的开发到带十几人的客户端团队期间眼睁睁看着Objective-C被Swift按在地上摩擦看着RN和Flutter冲进来跟原生抢饭碗看着小程序把一大批独立App变成手机里的僵尸图标又看着鸿蒙从无到有一步步长成第三个生态。这篇文章不聊虚的就是把我这十年的技术路径、踩坑经历、选型思路和职业判断原原本本摊开来讲。如果你是刚入行的iOS新人或者正处于技术转型期纠结要不要做跨平台又或者单纯想看看一个普通iOS开发者怎么在行业巨变里活下来那这文值得你花十分钟读完。1. 站在2015年的起点那个还是OC的时代1.1 当时的iOS生态与我的入行契机2015年的iOS开发圈和现在完全是两个物种。那会儿Swift 2.0刚在WWDC上亮相语法稳定性一塌糊涂几乎没有商业项目敢把Swift放进生产环境。主流语言依然是Objective-CXIB和Storyboard还是界面开发的主战场Masonry这种纯代码自动布局框架火得不行因为大家实在受够了Storyboard拖约束时的卡顿和合并冲突。我当时所在的创业公司要做一款社交类AppiOS端就我和一个后端两个人。我到现在还记得第一次用Xcode 7连着iPhone 6真机调试时的兴奋感——那个蓝色加载条转完自己的代码出现在手机屏幕上那种成就感是同级别的后端同学体会不到的。也是从那时候起我养成了一个职业病拿到任何手机第一件事是看它的系统版本和屏幕尺寸脑子里自动过一遍适配方案。这个阶段的核心技术栈现在看简直寒酸Objective-C配合ARC做内存管理AFNetworking做网络层FMDB存本地数据SDWebImage管图片加载MJRefresh负责下拉刷新一套下来基本就是当时所有iOS项目的标准搭配。没有CocoaPods之外更好的依赖管理没有RxSwift响应式编程的普及更没有SwiftUI这种声明式UI大家老老实实地写ViewDidLoad在代理方法里传值用KVO监听个属性变化都觉得自己很前卫。1.2 第一行代码到第一个上架App我接手的第一个完整需求是做用户注册登录模块要求支持手机号验证码的登录方式。现在看这是个再简单不过的需求但当时我花了整整三天才搞定。因为涉及的东西远不止几个界面那么简单文本输入框要处理键盘弹起遮挡问题验证码倒计时要应对前后台切换登录按钮要有loading状态防止重复点击token过期了要自动跳转登录页还要做输入框的二次密码校验。每一环背后都是iOS开发中看似简单实则坑多的典型。记忆最深的是上架审核。我提交了四次才通过第一次因为没做iPad适配被拒第二次因为App内出现了测试字样被拒第三次因为隐私权限描述不够明确被拒第四次才被批准上架。从提交到最终上架花了整整两周整个过程让我明白了iOS开发和iOS产品是两回事——代码写得再漂亮过不了审核这关就白搭。这也是我后面几年一直强调审核前置思维的原因。第一次上架成功后我盯着App Store后台那个空荡荡的下载量统计看了很久。虽然只有零星几十个下载但那种世界某个角落里有人正在用我写的软件的感觉至今想起来还是很奇妙。也正是这段经历奠定了一个认知做客户端开发技术能力只是基本功对平台规则的敬畏、对用户体验的在意才是走得远的关键。2. 十年技术栈的变迁从Objective-C到Swift与SwiftUI2.1 Swift来了我为什么没有立刻弃OCSwift发布初期说实话大多数老iOS开发者是抗拒的。它语法变来变去Xcode 7时代写好的Swift 1.x代码升级到Swift 2.x就要改一大片好不容易升到3.x4.0又来一次大变动。当时有个段子说Swift开发者一年学一门新语言真不是夸张。而且Swift 1.x时代的编译速度慢得吓人一个中等规模项目的增量编译能等上半分钟相比OC的编译速度简直是灾难。我当时对Swift的态度是接触但不上生产。个人学习一直在跟进新开的个人项目尝试用Swift写但公司核心的电商App始终用OC维护。原因很简单团队的代码积累、第三方库生态、团队成员技能储备都决定了迁移成本极高。商业项目不是练手玩具稳定性永远优先于技术时髦度。来转折发生在Swift 4.0发布之后。API设计基本定型ABI在5.0时稳定下来编译速度大幅优化我这才在2019年的新项目里全面转向Swift。回头看这个决策节奏正好踩在了Swift性能稳定的点上既没有当早期小白鼠也没有落后太多。对普通开发者来说新技术采用的最佳时机不是它刚发布的酷炫期而是它生态成熟后两三个大版本的稳定期。2.2 架构演进MVC到MVVM再到Composable Architecture2015年的iOS架构基本是MVC一统天下。Controller承担了太多的责任一个正常的页面代码轻松过千行动辄两三千行的ViewController不是传说而是常态。我拆过最夸张的一个页面Controller四千多行里面什么都有——网络请求、数据解析、UI创建、事件响应、动画逻辑、页面统计、埋点上报活脱脱一个上帝类。2017年前后MVVM架构开始流行。起因是ReactiveCocoa和RxSwift把响应式编程的概念带入了iOS圈ViewModel负责数据加工和业务逻辑Controller专心做View和ViewModel之间的绑定代码确实清爽了很多。但当时MVVM也带来了新的烦恼双向绑定调试起来极其痛苦一个数据流的追溯要比MVC时代困难好几倍。我一度觉得MVVM是代码好写了查Bug变难了的典型。到了2020年后SwiftUI和Combine的出现让声明式UI和单向数据流成为主流苹果官方推荐的架构也逐渐清晰View State Reducer的结构本质上借鉴了前端Redux那套理念。我在2022年的新项目里用了类似TCAThe Composable Architecture的架构核心感受是页面状态可预测了测试好写了团队协作的边界也清晰了。架构没有银弹但从整个团队的协作效率和代码可维护性来看这十年的确是在往更好的方向走。2.3 一个老项目的Swift重写教训2020年我主导了一次把公司核心App从OC迁到Swift的项目历时七个月经历堪称教科书级别的反面教材。当时我们决定大爆炸式重写——整个App推翻重来没有采用渐进式迁移方案。结果就是新App上线后出现了大量回归Bug用户差评如潮我们又花了一个多月紧急修复才稳住局面。这次重写的最大教训是在移动端绝不建议对业务复杂的大型App做一次性重写。因为业务逻辑的细节远比你记忆中复杂很多边界条件是老代码在多年Bug修复中一点点沉淀下来的重写时根本不可能一次性考虑周全。更现实的方案是渐进式迁移。核心思路是OC与Swift完全可以共存即通过桥接文件实现两种语言在同一个工程里互相调用。你可以把新功能模块用Swift写老模块继续跑OC利用组件化和路由分层逐步替换。这样既享受了Swift的现代语法和类型安全又不至于因为一次性重写导致业务断裂。这个经验后来我几乎在每个技术分享场合都会提因为踩过的坑实在太大。另一个重写过程中的大坑是第三方库的Swift适配。2019年之前不少优秀OC库没有Swift版本或维护不及时迁移时要花大量时间找替代方案或者自己封装。所以如果你现在准备把一个老项目Swift化第一件事不是写代码而是先梳理现有第三方依赖的Swift兼容情况这决定了你迁移方案的时间表。3. 跨平台混战这五年RN、Flutter、uniapp与iOS原生3.1 跨平台方案的选型对比2017年React Native异军突起国内大厂纷纷投入怀抱。2018年底Flutter 1.0发布凭借自绘引擎和优秀的渲染性能迅速收割开发者注意力。同时期国内uniapp凭借微信小程序的东风在一众跨平台框架中成为中小团队的热门选择。到了2025年再看这场战局原生、React Native、Flutter、uniapp、ArkTS鸿蒙各有各的地盘普通开发者和技术决策者选型时真的很头疼。我结合自己的实际项目经验做个比较主观的横向对比维度iOS原生FlutterReact NativeuniappUI渲染系统原生控件自绘引擎Skia/ImpellerJSI原生映射WebView原生混合性能最好接近原生中等偏上复杂场景易卡顿一般重交互场景吃力开发语言Swift/OCDartTS/JSVue/JS学习成本高需熟悉Xcode生态中Dart较易上手中前端基础即可低Vue3语法跨端能力仅iOSAndroid/iOS/Web/桌面Android/iOS/WebApp/小程序/H5典型场景高性能要求、深度系统能力中大型App、UI一致性强动态化、团队前端背景中小团队多端快速覆盖我的立场很明确如果一个产品对UI交互有极致的性能要求或者需要深度挖掘系统底层能力原生依然是不可替代的选项。而如果一个初创团队要在最短时间内覆盖App、小程序、H5三端uniapp的开发效率确实无可匹敌。Flutter和RN则看团队的技术储备前端基础强的选RN能接受Dart新语言的选Flutter。3.2 我用uniapp做微信小程序踩过的坑2021年公司决定试水小程序生态我们iOS组抽了两个人组成小组做技术验证最终选型是uniapp因为团队里有人有Vue2的经验而且当时uniapp已经支持了一套代码编译到微信小程序和H5两端性价比不错。但这段时间也让我深刻理解了跨平台框架的抽象是有代价的这句话。第一个坑是真机调试时自定义组件的原生渲染问题。有时候在H5端表现正常的功能编译到微信小程序端就失灵比如scroll-view的下拉刷新在iOS上有时候会跟页面级滚动产生冲突。第二个坑是性能瓶颈。uniapp的列表渲染在小程序端依赖setData同步数据数据量一大比如超过1000条页面就明显卡顿。后来我们用分页加载、虚拟滚动、节点缓存等方式勉强解决但本质上是框架自身的渲染链路决定了性能上限。第三个坑是平台差异化逻辑。uniapp的API封装层看着很美好但真到调用相机、蓝牙、定位等原生能力时你还是得用条件编译去区分微信、App、H5三端代码里写一堆#ifdef可读性和维护性直线下降。但客观地说对于展示类、低频交互、内容型的小程序uniapp的性价比确实很高。我们那个项目最终从原型到上线只用了三周如果纯原生开发光微信端的适配和审核就得再多一倍时间。跨平台方案不是万能灵药也不是洪水猛兽关键是选对场景。3.3 鸿蒙来了多端开发会怎么走这个话题在2024年后变得非常现实。鸿蒙系统从诞生之初的兼容安卓生态到NEXT版本彻底剥离AOSP代码走完全自研的技术路线App需要基于ArkTS和ArkUI重新开发。对iOS开发者来说这既是挑战也是机会。挑战在于你过去十年的积累在鸿蒙生态里归零Swift和OC的知识完全用不上要重新学习ArkTS的声明式语法和方舟编程框架心态上很容易失衡。机会在于鸿蒙生态处于急速扩张期市场对鸿蒙开发者的需求远大于供给懂原生开发思维、对移动端底层机制有深刻理解的开发者迁移到ArkTS会比纯前端背景的开发者更快掌握。我在2024年用业余时间学了鸿蒙开发发现里面的状态管理、组件化思想、生命周期管理和SwiftUI几乎是一个路数。你只要理解了声明式UI的核心理念这套东西上手是很快的。另外一个趋势是多端统一的理想正在以C-S架构的形态回归代码不追求一次编译到处跑而是通过云侧统一逻辑、端侧做轻量适配。苹果的SwiftUI、谷歌的Flutter、鸿蒙的ArkUI都在往一套代码映射多设备的方向演进但底层实现路径完全不同。我认为未来很长一段时间内移动端都会是原生、跨平台、操作系统厂商自研框架三足鼎立的局面。作为开发者与其纠结学哪个不如抓住这几个系统的共通点状态管理、渲染原理、布局系统、生命周期。这些底层的思维模型一旦打通切换技术栈只是熟悉API的体力活。4. 那些年一起踩过的坑审核、性能与兼容性4.1 App Store审核的玄学与科学做iOS开发绕不开App Store审核。网上流传着各种玄学什么周五提交更容易过凌晨提交审核快我实测下来这些说法大部分是幸存者偏差。真正影响审核结果的是你有无触碰到平台的红线。我用自己的血泪史总结了几个高频被拒原因隐私权限描述不具体。比如你申请相机权限却只写需要相机权限苹果会拒要求你说明使用场景。标准写法是用于拍摄头像照片以完成用户注册。使用了私有API。这在大厂内部代码里非常常见尤其在做性能监控、热修复、统计埋点时容易踩线。苹果的静态扫描越来越严格一旦被识别为使用私有API轻则警告重则下架。应用内购买(IAP)不合规。凡是iOS端App内解锁数字内容或服务都必须走苹果的IAP支付。很多团队想绕过抽成使用第三方支付一旦被检出封号都是可能的。页面截图或文案包含其他平台的名字。我们曾因为App内有一个关注我们的安卓版本提示直接被判定为异常引导要求整改。审核经验总结成一句话就是把苹果当成一个特别注重用户体验、且对违规零容忍的苛刻用户开发全过程都以它的视角审视产品这样能减少90%的审核麻烦。4.2 性能优化从卡顿到流畅的实战性能优化是iOS开发中永不过时的话题。十年下来我做性能优化的思路从问题出现了再解决变成了架构阶段就为性能铺路。最常见的三个性能杀手是主线程卡顿、内存泄漏和启动时间过长。主线程卡顿的根源通常是大量耗时操作阻塞了UI渲染比如数据解析放主线程、大量图片的同步解压、频繁的View层级操作。排查套路很成熟了用Instruments的Time Profiler定位耗时函数用Xcode的Main Thread Checker发现主线程调用了后台线程才允许的API。解决手段也很固定把耗时操作挪到子线程、使用异步绘制、对集合视图做预布局和复用优化。内存泄漏则更隐蔽。Block循环引用、NSTimer未销毁、通知未移除、闭包捕获self每个都是老生常谈但每个人都犯过。我在2020年后开始在团队推行Swift的weak self显式声明规则配合Xcode的Leaks检测和Malloc Stack标记内存问题终于从靠经验猜Bug变成了可定位可复现。启动时间线是最容易被忽略的性能指标。App冷启动时间超过两秒用户流失率会明显上升。优化启动的核心在于精简启动时加载的静态库、延迟非首屏必需的服务初始化、使用二进制重排优化虚拟内存缺页。我们在一个项目中把启动时间从2.8秒压到了1.2秒你觉得难吗其实只是把十几个第三方SDK从启动阶段懒加载产品体验立刻上一个台阶。4.3 适配地狱刘海屏、灵动岛与各版本系统苹果的硬件迭代和系统升级是每个iOS开发者心里永远的痛。2017年iPhone X带火了刘海屏和圆角全面屏一时间所有App的布局都出问题状态栏高度从固定的20pt变成了变化的44pt后来还有动态岛和灵动岛的59pt安全区域的适配从Hack样式正式进入了Safe Area Layout Guide时代。我总结了一套自己的适配方法代码里永远不要写死状态栏高度和TabBar高度统一使用safeAreaInsets和safeAreaLayoutGuide配合Auto Layout的约束系统处理。如果你还在用frame布局那几乎每个新机型发布都会让你崩溃一次。2022年灵动岛发布后我们在适配时发现一个有意思的坑Live Activity实时活动的API虽然方便但它的UI布局空间极其有限动态文字一长就被截断必须做专门的压缩显示逻辑。系统版本适配同样折磨人。iOS 13的深色模式普及让我们所有硬编码的颜色全部暴露不按照动态UIColor适配的界面在深色模式下惨不忍睹。iOS 14新增的桌面小组件带来了新需求但开发成本不低。iOS 16的锁屏小组件又是另一套逻辑。iOS 18和19在隐私保护上持续加码权限申请和追踪透明度成了新的适配重点。你可以抱怨苹果的规则变来变去但换个角度想这些折磨正是iOS开发者这个岗位存在的意义——如果一切都标准化到无需适配那还需要我们来做什么呢5. 十年开发者的职业思考从写码到带团队5.1 技术人如何对抗焦虑这十年iOS开发者的焦虑感其实一直在增加。每隔一两年就会出现一个XX技术要取代原生的论调每隔三五年就会有一批开发者被行业洗牌。我身边转行的、考公的、上岸的、做自媒体的什么人都有。我自己也经历过无数次深夜焦虑会不会被Flutter抢走饭碗要不要转后端三十多岁了还写代码是不是不行但回头看焦虑的根源往往不是技术变化本身而是对技术变化缺乏应对的从容感。我个人的应对策略是T型能力建设。纵向深耕iOS领域把性能优化、架构设计、底层原理掌握到团队里没几个人能比的程度这是护城河。横向拓展跨平台开发、小程序技术、产品思维、项目管理这是抗风险能力。当你的能力结构不再依赖某一个具体技术栈时技术变迁对你来说就只是工具切换而不是职业危机。另一个心得是不要只埋头写代码要定期输出。写博客、做分享、带新人、参加技术社区活动这些行为本质上是在强迫你梳理和验证自己的知识体系。我在2019年开始系统地做技术分享和文档沉淀坚持了五六年下来发现最大的受益者不是听众而是我自己。教是最好的学这话真不虚。5.2 我给年轻开发者的几点建议带过几十个新人后我发现很多年轻iOS开发者走的弯路都惊人地相似。这里捡几个最重要的建议分享给刚入行不久的朋友第一先做深再做宽。刚入行的前两三年一定要选择一个具体方向比如性能优化、架构、底层框架钻研到足够深。整个行业不缺什么都会一点的通才缺的是在某个方向能解决真实复杂问题的人。我见过太多工作三年却像工作一年的简历就是因为一直在各个技术栈之间跳来跳去哪个都没深入下去。第二动手前先理解原理。用Masonry、SnapKit、SwiftUI别只知道调API要理解它们的底层实现。自动布局的约束求解过程、SwiftUI的依赖追踪机制、Combine的背压概念这些看起来理解了也不影响调API的东西才是你和普通开发者的分水岭。第三保持对产品和商业的感知。纯技术的视角会让你的职业天花板很低。多想一想你的代码为产品带来了什么为什么这个按钮要放在这里这个功能为什么要砍掉用户的流失点在哪里。当你开始用产品经理的思路去思考技术问题时你才真正具备了向高级别发展的潜力。第四接纳并拥抱新平台新语言。从OC到Swift从原生到跨平台从移动端到多端统一每一次变化都是行业格局的重构。重构意味着旧的秩序被打破但同时也意味着新位置空出来了。2019年SwiftUI刚出来时很多人嘲笑它不成熟但坚持投入学习的人现在已经是团队里SwiftUI方向的核心骨干。对新事物保持开放和好奇是技术人最值得的投资。写在最后写完这些心里其实挺感慨。十年前我是一个对着Xcode报错日志干瞪眼的新人十年后我可以坦然地跟团队说这个性能问题按这套思路查一定能解决。时间在技术上留下的痕迹很明显Swift从1.0走到了6.0iPhone从6s换到了18 Pro行业从纯原生打天下变成了原生与跨平台分庭抗礼。但有些东西一直没变把用户体验放在心尖上的那份坚持对代码质量近乎偏执的追求以及深夜调通一个顽固Bug之后的如释重负。如果一定要给这个十年配一句话那就是在这个行业里别把自己定义成某个平台上的开发者要把自己定义成能解决移动端复杂问题的人。平台会更换技术会迭代但你解决复杂问题的能力和沉淀下来的思维模型永远是跟着你自己走的。最后分享一个我一直在用的小技巧每年年初翻一遍苹果的Human Interface Guidelines和最新的Whats New文档再挑一个以前没深入过的系统框架比如Core ML、Vision、Metal做个Demo。这个小习惯我坚持了八年它保证了我的技术视野始终在行业前沿不至于被突然的变化打懵。今天把这些写出来也是想告诉2015年那个刚入行的自己这十年路没走错。
返回列表