尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

十年iOS开发复盘:从Objective-C到SwiftUI的实战指南

发布时间:2026/9/24 13:06:00

资讯中心
01
ARTICLE

十年iOS开发复盘:从Objective-C到SwiftUI的实战指南

十年iOS开发复盘:从Objective-C到SwiftUI的实战指南
我从2015年正式入行iOS开发到现在整整十年。这十年里我从一个只会拖Storyboard的新手一路做到独立负责App架构、带团队、踩遍国内互联网公司移动端的各种坑。今天这篇帖子就当作一个阶段性的复盘把我这十年在iOS开发这条线上积累的东西整理出来。如果你是刚入行的新人、准备转行做iOS的或者正在纠结要不要学SwiftUI、要不要转鸿蒙、要不要搞跨端这篇内容应该能给你一些参考。iOS开发这个方向外面看起来风光实际上是个不断学习、不断跟系统版本赛跑的工种。2015年那会儿还是Objective-C的天下Swift刚出到2.x大部分人都在观望到了2025年SwiftUI成熟了不少Swift Concurrency也成了标配但老项目里依然躺着几十万行OC代码。技术栈的变化、面试方向的变化、整个移动端市场的变化都是这十年我亲眼看过来的。这篇博文我会按技术演进、跨端与小程序、开发工具链、高频Bug排查、延伸方向、上架成本、入行建议几个维度来写尽量多讲实操少讲空话。1. 从Objective-C到SwiftUIiOS开发十年的技术主线1.1 语言与架构我经历过的手写内存时代2015年的iOS开发主流语言还是Objective-C。那时候Swift 1.0刚发布不久Bug多、编译慢第三方库生态也没跟上绝大多数商业项目还是用OC写。OC最劝退新人的地方是方括号调用语法和手动管理引用计数虽然ARC在2012年就开始普及但很多老项目里依然能看到retain、release的身影尤其是涉及C语言库、Core Foundation对象的时候内存管理全靠自觉。我记得刚入行那会儿最怕的就是面试被问循环引用。Block里用了self没weak化NSTimer没在dealloc里invalidatedelegate没设成weak三者占掉了当时一半以上的崩溃排查时间。现在用Swift写项目这些问题虽然还存在但编译器检查、闭包捕获列表都友好得多。不过我得说一句实在话OC的存量代码到今天依然是个巨大的市场很多银行、保险、传统企业的iOS App还是OC写的你要是完全不会看OC光会Swift其实会错过不少机会。架构层面2015年前后还是MVC加Xib/Storyboard的天下。故事板在大团队里简直是噩梦一个文件动不动几千行XML合并冲突能让人心态爆炸所以后来大家开始转向纯代码布局用Masonry、SnapKit这类Auto Layout框架手写约束。再往后MVVM火了起来配合ReactiveCocoa、RxSwift做响应式绑定2017年到2019年那会儿iOS圈子里你不聊MVVM和RxSwift都不好意思说自己是做架构的。回头看这些架构演进本质上是项目复杂度逼出来的页面多了、团队大了ViewController膨胀到几千行不分层根本维护不动。1.2 UIKit的黄金时代与SwiftUI的新战场2019年WWDC推出SwiftUI的时候我跟大多数人一样嘴上说哇好酷心里其实在盘算这玩意儿什么时候能上生产环境。早期SwiftUI的坑是真多Xcode的预览渲染慢、复杂布局卡顿、对iOS 13以下版本不兼容所以一直只能是下一个项目再说的状态。到了2025年SwiftUI已经迭代到第6个大版本稳定性好了非常多我最近两个新项目都是SwiftUI加少量UIKit混编完成的。SwiftUI的声明式写法确实比Auto Layout那一套直观多了状态驱动UI的思想也让代码更容易测试和推理。尤其是iOS 16之后引入的NavigationStack替代了以前UINavigationController那套push/pop的数据流管理写起来舒服不少。但这里有个现实情况存量市场里UIKit依然占据绝对大头。银行类App、打车类App、电商类App核心页面几乎还是UIKit实现SwiftUI只用来做新模块或者新活动页。所以我的建议是新人不要急着All in SwiftUI先把UIKit的布局、生命周期、内存管理搞明白再学SwiftUI做新项目两条腿走路最稳。另外iOS 9开始有的分屏多任务到iPadOS 13其实才算真正成熟如果你做iPad适配还得花时间处理多窗口布局、拖拽交互这些东西。2. 跨端、小程序与鸿蒙iOS开发者的第二曲线2.1 uniapp、Flutter、RN跨端方案怎么选从2015年React Native开源到后来Flutter横扫开发圈再到国内特别流行的uniapp跨端方案这十年就没消停过。每次有客户或者老板问我能不能一套代码同时上iOS和安卓我都能从他们眼里看到对成本的渴望。这个问题没法一刀切。React Native的优势是生态大、跟React前端技术栈接近适合团队里前端多、原生少的公司。Flutter的优势是渲染引擎自绘UI在iOS和安卓上表现高度一致复杂动画效果好缺点就是Dart语言相对小众跟原生交互的桥接层有时候要自己造轮子。uniapp在国内火核心原因是它一套代码能同时出iOS、安卓、微信小程序和H5对很多中小公司和外包团队来说这是性价比最高的选择。我自己做过几个uniapp混合项目感受是业务逻辑简单的页面跨端方案确实能省一大半开发时间但一旦涉及底层能力——比如蓝牙、NFC、后台保活、硬件编解码——最后还是得回到iOS原生写插件。所以我的结论很直接跨端是商业选择iOS原生是技术地基。你可以用跨端方案快速交付但如果你想在iOS开发这条路上走长远原生功底不能丢。2.2 小程序和H5iOS生态里的外来物种微信小程序虽然是个外挂但过去几年几乎占据了大量业务的存量入口。小程序在iOS端的渲染本质上走的是WebView加JSCore那一套所以iOS系统的版本兼容问题小程序里一个都跑不掉。举几个我实际踩过的例子。一个是阅读协议页面的开发。小程序里跳协议页看起来是个简单的WebView加载但在iOS上会遇到Cookie同步、localStorage隔离开启、返回时页面状态丢失这些问题尤其是从App分享出来的小程序链接在iOS的Safari里打开时有些逻辑根本跑不通必须做降级处理。另一个是iOS静音状态下播放音乐。很多开发者在小程序里播放背景音乐发现安卓正常、iOS没声折腾半天才发现是手机侧面的静音拨片把音频会话切到了静音模式。解决方法是调用wx.setInnerAudioOption里的obeyMuteSwitch参数把播放器改成不跟随静音开关。还有H5页面在iOS里的各种破事。比如微信H5公众号重复刷新经常发生在iOS的WKWebView里页面一进后台再回来JavaScript被系统冻结返回时整个页面重新加载用户填到一半的表单全没了。这个问题的根子是iOS的进程回收和页面状态保存机制现有的方案主要是通过监听visibilitychange、pageshow事件做状态缓存或者用sessionStorage暂存用户输入。再比如H5在iOS里下载文件点击下载链接经常直接在浏览器里打开预览尤其是PDF、图片这些格式原因是Safari对Content-Disposition支持不彻底后面我会在Bug排查一节详细说。2.3 鸿蒙来了我还要继续学iOS吗这两年问要不要转鸿蒙的人特别多。我的看法是鸿蒙NEXT之后全面去安卓化ArkTS、ArkUI、方舟编译器自成一套体系确实是个新的增量市场。但从技术角度来看iOS开发的很多底子——生命周期管理、UI布局思路、状态管理、内存模型——在ArkUI里都能找到对应概念。一个懂UIKit、懂SwiftUI的开发者上手ArkUI的周期我见过最短的只要两周。所以我的态度一直是不用慌也不用急着把iOS扔掉。多端趋势本质上是商业驱动的哪个平台用户价值高资源就会往哪边倾斜。iOS这个平台上用户的付费能力和留存质量到今天依然是移动端里最高的之一。把iOS做深、做精再横向去学鸿蒙、学Flutter、学小程序你的技术盘子就是越滚越大的而不是被某一个框架绑定。3. 从调试到上架iOS开发工具链的实战心得3.1 真机调试与开发者模式那些事iOS开发绕不开真机调试。以前iOS 16之前iPhone连上Mac直接用Xcode就能跑但从iOS 16开始系统强制要求开发者在新设备上开启开发者模式不然Xcode根本识别不到设备。我记得第一次遇到这个提示时还在设置里翻了半天后来才发现是在隐私与安全性最底部点进去还要输一次锁屏密码、重启一次手机。这里给新人提个醒如果你把测试机升级到了新系统突然连不上Xcode了第一反应不是重装驱动而是去设置里看看开发者模式有没有被系统重置。设备模拟这块真机测试的成本确实高但有些问题只有真机能复现。比如摄像头、推送、后台定位、弱网环境模拟器跟真机差异非常大。我通常的做法是逻辑功能用模拟器跑涉及硬件和系统级能力一律真机。模拟器的好处是可以随时切换系统版本和机型用来快速验证布局适配效率很高。再就是抓包。Charles几乎是iOS调试的标配工具但很多人第一次抓HTTPS包会失败原因很明确iOS 10以后HTTPS抓包必须先在手机上安装并信任Charles的SSL证书还要在Charles里开启SSL Proxying并把目标域名加进白名单。另外如果你的App开了ATSApp Transport Security限制抓包时还要在Info.plist里临时把NSAllowsArbitraryLoads打开。这里有个坑我踩过很多次证书明明安装了设置里也信任了但抓包依然失败最后发现是Charles的证书过期了重新生成一份再装一次就好。3.2 自动化、签名与持续交付iOS自动化测试这些年从XCTest到XCUITest再配合Fastlane做持续集成已经是很成熟的流水线了。我见过不少团队测试用例全手工跑每次发版前花一整天点来点去不仅效率低还容易漏。实际上现在Xcode Cloud、GitHub Actions都能跑iOS的CI流程那些核心链路比如登录注册、支付下单完全可以写成UI自动化用例至少能兜住八成回归问题。说回签名。iOS开发绕不开签名而自签7天失效这个问题几乎每个个人开发者都遇到过。用免费Apple ID签名调试签出来的App只有7天有效期到期后需要重新连电脑签名才能继续跑。如果你是在公司里一般用付费开发者账号99美元/年签出来的App能管一年而且能上真机跑、能接推送、能上架App Store。这里提醒一下网上有些所谓的永久签名企业签名服务我不会建议任何人去碰一方面是成本和稳定性问题另一方面是合规风险真正做开发的没必要淌这浑水。自动化打包这些年我最大的体会是Fastlane的match工具能把证书和描述文件管理自动掉团队里谁要真机调试一条命令就能分发证书省掉了很多证书在我电脑上的扯皮。配合TestFlight做灰度分发内部测试、外部用户反馈都能在一个平台解决这个流程强烈建议每个团队都搭起来。3.3 版本、备份与兼容性的坑版本兼容问题是iOS开发永远躲不掉的日常。每年苹果六月份出Beta系统九月份推送正式版然后你的App大概率会有那么一两个页面出现诡异问题。我通常会保持一台测试机紧跟Beta版本新系统一出就先跑一遍核心流程提前排查兼容性。这里有一个特别常见的需求低版本手机想用新系统怎么办答案是不可能或者说代价极大。iOS的固件升级是单向的苹果只给当前最新系统开启验证通道旧版本固件一旦被验证关闭就无法降级。这就引出一个经典问题iOS高版本备份恢复到低版本手机。如果你把iPhone 15iOS 17的备份恢复到一台只能跑iOS 16的旧手机上系统会直接报错拒绝恢复因为备份数据格式带了系统版本标记低版本系统不认。遇到这种情况唯一靠谱的办法是用第三方备份工具只导出照片、通讯录这类通用数据再手动导入旧设备App数据就别指望能迁了。至于iOS旧版软件库这类网站我只能从开发测试的角度说一句如果你的App需要兼容旧系统最好用真机或者模拟器装对应iOS版本跑测试不要依赖那些来路不明的渠道风险太大。正规的开发流程里Xcode都自带可选的历史模拟器运行环境足够覆盖大多数测试需求。4. iOS开发高频Bug排查实录这是我踩出来的经验4.1 textarea输入框遮挡按钮iOS Safari的经典问题这个Bug应该很多前端和混合开发的人都遇到过在iOS的Safari或者WKWebView里页面有个textarea用户点进去输入键盘弹出来然后你会发现页面上原本固定定位的按钮被一个透明的层挡住了怎么点都点不动。等键盘完全收起来一切又恢复正常。根子在于iOS为了滚动流畅在键盘弹起时会对WebView的视口做一次缩放和位移而position:fixed的定位基准在这种场景下就错乱了。我之前用uniapp做H5也遇到过搜索ios textarea 输入出现层盖住了按钮能找到一大堆提问。靠谱的解决办法有这么几个第一监听输入框的blur事件在失焦时把页面滚回顶部并强制触发一次重绘比如给body的position属性做个切换。第二把固定定位改成绝对定位在键盘弹起期间手动计算可视区域高度把按钮重新定位。第三用新的视觉视口APIvisualViewport监听viewport的resize事件动态调整按钮位置。这个方案最稳因为它是专门为了解决移动端键盘遮挡问题设计的。具体代码可以这样写if (window.visualViewport) { const viewport window.visualViewport; const btn document.getElementById(submitBtn); viewport.addEventListener(resize, () { btn.style.bottom (window.innerHeight - viewport.height viewport.offsetTop 12) px; }); }4.2 Canvas导出白图uniapp在iOS Safari里的坑热词里有ios safari 使用 uniapp canvas 队列时导出白图这个现象我排查过好几轮。场景通常是在小程序或H5里用canvas画海报画完一调用canvas.toTempFilePath或者toDataURL导出来的图片是纯白的或者白底上加几个乱码色块。在iOS Safari里canvas的离屏渲染和GPU缓存机制跟安卓很不一样。常见原因有三个。第一个是canvas还没绘制完成就导出了。iOS的Canvas绘制是异步的如果你在调用drawImage之后立刻导出绘制任务可能还没真正落帧自然导出白图。解决方案是确保所有绘制操作完成后等待一个requestAnimationFrame或者setTimeout再导出。第二个是canvas尺寸超出上限。iOS对canvas的宽高像素数有限制一般是16777216像素也就是4096x4096左右超过会被静默裁剪成白画布。画海报这种长图场景特别容易踩要么压缩画布尺寸要么分段绘制。第三个是dpr缩放问题。在Retina屏幕上canvas的像素密度按devicePixelRatio放大后绘制坐标如果没同步缩放内容会画到画布外面导出结果就是空白或者半截。稳妥的做法是统一用一个函数处理dpr和导出时机function ensureCanvasReady(canvas, callback) { const ctx canvas.getContext(2d); const dpr window.devicePixelRatio || 1; canvas.width cssWidth * dpr; canvas.height cssHeight * dpr; ctx.scale(dpr, dpr); // 等一帧再执行绘制和导出 requestAnimationFrame(() requestAnimationFrame(() callback(ctx)); }4.3 静音播放、下载变预览与重复刷新三个高频现象微信小程序在iOS静音状态下播放音乐的问题前面提过这里再补一点细节。核心是iOS的音频会话AVAudioSession会被静音拨片影响小程序默认的设置会让音频跟随静音切换。解决方式是调用wx.setInnerAudioOption({ obeyMuteSwitch: false, success() { audio.play(); } })但要注意真机测试时这个配置对iOS 13以上版本才完全生效老版本有概率失效需要在onHide、onShow里做个恢复和重播的逻辑兜底。H5在iOS下载文件变成预览这个问题我给它起名叫下载的宿命之争。根本原因是WKWebView对Content-Disposition: attachment的处理偶尔会失灵尤其是文件类型是系统能直接预览的PDF、图片、txt时Safari会直接渲染而不是下载。解决的思路是避免触发系统预览把文件转成blob然后用a标签的download属性下载。代码大致是这样的fetch(fileUrl) .then(res res.blob()) .then(blob { const link document.createElement(a); link.href URL.createObjectURL(blob); link.download 文件名.pdf; link.click(); URL.revokeObjectURL(link.href); });最后说微信H5公众号重复刷新。这个问题的触发场景是用户进入公众号里的H5页面切到后台去回了个微信消息再切回来页面从头加载了。处理方案是用pageshow事件加一个性能时间戳判断window.addEventListener(pageshow, (event) { if (event.persisted) { // 页面从bfcache恢复重新初始化 } });同时配合onunload事件缓存页面状态把用户已经填写的表单数据存到sessionStorage里刷新后自动回填至少体验上不太难受。4.4 高频问题速查表问题常见原因解决思路textarea输入后按钮点击失效iOS键盘改变视口fixed定位失效用visualViewport动态定位Canvas导出白图绘制未完成、画布尺寸超限、dpr未处理等帧再导出、压缩画布、同步dpr小程序iOS静音无声音音频会话跟随静音开关设置obeyMuteSwitch为falseH5下载变成预览WKWebView对attachment支持不稳转blob a.download触发微信H5切后台回来刷新页面被系统回收或bfcache未命中监听pageshow并缓存状态高版本备份恢复到低版本失败备份格式带系统版本信息手动导出通讯录、照片等通用数据5. iOS开发之外AI应用、智能体与跨界开发5.1 从iOS到AI应用技能迁移能力最近两年AI应用开发、智能体Agent开发成了高频词。很多人跑来问我一个iOS开发要不要去学LangChain、LangChain4j这些框架我的回答是学不学先放一边你得先想明白你的优势在哪。做iOS开发养成的一个习惯非常适合迁移到AI应用上——分解问题。你在iOS里把一个复杂页面拆成Model、View、ViewModel在AI应用里同样要把一个复杂任务拆成多个子任务、工具调用和提示词模板。现在的智能体开发说到底就是搭一套流程让大模型在恰当的时候调用恰当的工具。iOS开发者的网络请求、JSON解析、异步编程功底在做Agent编排时全是优势。Node方面LangChain4j这种给Java生态用的框架你可能用不上但用Swift、用Python写Agent的不少。我建议真感兴趣的朋友先从调用大模型API写一个能实际解决自己问题的脚本开始不要一上来就啃框架。比如做一个自动整理会议纪要的工具输入音频或者文本输出结构化总结并自动生成待办事项这个流程跑通之后再慢慢加Function Calling、加知识库自然就摸到Agent开发的脉络了。5.2 嵌入式、游戏与其他跨界方向iOS开发者的技能并不只属于移动端。我身边有同事转去做嵌入式拿着C/C的底子用Keil、VSCode加插件现在甚至有人用Trae这种AI编程工具配合Keil调试去写单片机固件。还有人去玩无人机飞控PX4开发环境搭建起来用ROS和QGroundControl折腾自主飞行这些跟iOS开发八竿子打不着但工程思维是相通的。游戏方向也是条路。Unity开发、Cocos开发配合Pico这类VR设备做MR应用本质上都是渲染管线、资源管理、触控交互那一套跟iOS的Core Animation、Metal有千丝万缕的联系。我有个前同事以前天天处理UICollectionView的卡顿现在去做Unity手游优化同事说他调试GPU驱动和着色器的时候很多思路都是从iOS的instrument工具链那边迁移过来的。所以你如果问我2025年iOS开发值不值得做我会反过来说iOS开发就是个能往四面延伸的枢纽。你在这里积累的编程能力、性能分析能力、工程化能力放到任何其他软件开发领域都是硬通货。6. 做一个App并上架到底要花多少钱6.1 成本拆解开发一个app并上架大概要多少钱这是我在网上见过最多的问题之一。客观来说答案从几千到几百万都有可能关键看你做什么。先看硬性成本。苹果开发者账号是99美元一年这是个人上架App Store的入场券。如果你是企业需要的是公司开发者账号也是99美元但审核时对邓白氏编码、公司资质的要求更多。自己做开发的话服务器和域名是另一笔费用轻量业务一台云服务器一年几百块重度业务像直播、音视频服务器和带宽成本就没上限了。再看人力成本。如果你是自己开发时间成本就是最大的成本。一个简单的工具类App一个人开发加调试三四个月能上线算上机会成本差不多几万块。如果是外包市面上一个电商类App的报价通常在10万到50万之间但这只包含基础功能的开发UI设计、后端接口、运营后台、第三方服务开通都得另算。如果是团队自研五个人的团队做一年光人力成本就是上百万。6.2 上架流程与避坑上架App Store的流程现在已经是半自动化的。用App Store Connect创建App记录上传构建版本TestFlight分发给测试人员确认没问题后提交审核。审核周期一般一到三天慢的话一周。我最常见的被拒原因集中在隐私合规上收集用户数据时没有在隐私标签里如实声明或者权限弹窗文案没写清楚用途。另外如果你的App有账号体系苹果要求必须提供删除账号的入口这条很多人会漏掉。审核还有一个隐藏扣分项崩溃和卡顿。被拒理由如果写启动时崩溃千万别只在模拟器上复测模拟器跑不出真机上的内存峰值和网络异常场景。我一般上线前会盯着性能工具跑几轮把启动时间控制在2秒内顺便把无用的日志输出清理干净这对过审和用户体验都有好处。收入这块多说一句独立开发者的现金流主要来自内购、订阅和广告。iOS的付费用户质量高但也意味着苹果要抽成15%到30%小开发者年收入100万美元以下可以申请抽成降到15%这个政策别忘了去申请。7. 给2025年入行的iOS开发者的心里话7.1 面试考什么与如何准备最近几年iOS基础面试的内容其实没有大的变化内存管理、RunLoop、多线程GCD、网络层、数据持久化、UI布局优化这些依然是高频考点。但2025年的面试明显增加了几类新问题Swift Concurrency的async/await和ActorSwiftUI的状态管理以及大模型API的集成经验。很多新人一上来就刷LeetCode其实方向偏了。iOS开发更看重你对自己常用的框架有没有深挖过比如SDWebImage的缓存策略、AFNetworking的线程模型。面试官真正想看的是你排查问题的思路线上崩溃了怎么定位、UIKit卡顿怎么检测、App启动时间怎么优化。这些能力光靠背八股文是骗不过来的项目里真踩过坑开口就是不一样的。7.2 技术之外的生存建议最后说点实在的。iOS开发做到后面技术反而不是最大的瓶颈最大的瓶颈是你对整个业务的理解。为什么这个功能要做成H5而不是原生为什么数据要这样上报为什么支付流程要这样设计这些问题比写代码更重要。我工作里一直坚持几个习惯第一每解决一个疑难Bug写一篇笔记哪怕就几百字一年后就是你自己的知识库。第二保持一个自己的Side Project不用很大但一定是你能完整把控从产品到上架的全流程这是你保持技术手感最好的方式。第三多交流开源社区、技术分享、参加线下聚会都可以这个行业变化太快闭门造车很容易掉队。做iOS开发这十年我最大的感受是平台和语言会变但解决问题的能力不会过时。每一次iOS系统升级每一次新的框架发布都是把一批旧经验清零、逼着你重新学习的过程。这种被淘汰感其实才是这个行业最有意思的地方——它逼着你一直往前走一直保持新鲜感。希望这篇复盘能给你一些启发也欢迎在评论区聊聊你正在踩的坑我这十年攒下来的经验或许正好能帮你绕过去。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。