
朋友给我发来一份《iOS工程师综合练习卷二星级》说是给刚走上iOS开发这条路的新人摸底用的让我帮忙看看值不值得做。我把整份卷子从头到尾过了一遍又把相关的考点、周边工具链、常见的坑全部捋了捋发现这套二星级练习卷虽然名字听着入门但实际覆盖的内容密度相当高不光是考几个API调用更是在考一个iOS工程师对整套开发链路的基本功。这篇文章就结合这套练习卷聊聊我眼中一个iOS工程师应该掌握的核心技能以及我在实际开发中踩过的、教材里根本不写的那些坑。iOS开发这个领域表面上看是一套语言加一套IDE实际上是一整套生态从架构设计到UI布局从证书签名到上架审核从调试抓包到性能优化每一环都能单独拿出来写一本书。二星级练习卷的价值恰恰在于它把这些环串在一起让你直观感受到“我能写几个页面”和“我能独立交付一个App”之间隔着一整个工程化体系。如果你正准备入行、刚转岗或者已经写了一阵子业务代码但感觉一直在拧螺丝这份卷子对应的知识版图都值得你花时间补一遍。1. 内容整体设计与思路拆解1.1 二星级卷子在考什么拿到卷子的第一反应是这哪是二星级这简直是全栈式摸底。仔细再看发现它其实不是考深度而是考广度考的是一个iOS工程师每天都要面对的核心场景是否都有概念、都能上手。整套卷子的核心模块大致可以分成这几块语言与UI基础Objective-C、Swift、UIKit、UIStackView、页面布局与适配架构与工程质量MVC/MVVM、组件化、内存管理、多线程系统能力集成iOS分屏、定位、蓝牙BLE、电池优化、自动化开发工具链Xcode、模拟器、Charles抓包、自动化脚本分发与运维开发者证书、描述文件、上架流程、加急审核跨端协作与混合开发WebView、混合方案、Uniapp打包、与Windows共享文件看到这你应该明白这练习卷的设计逻辑了它不打算把你培养成某个方向的专家而是先逼着你把整个iOS开发地图走一遍让新人知道自己缺什么让有经验的人看看自己哪里是盲区。方向比深度重要这正是二星级该有的定位。1.2 为什么用“练习卷”而不是“面试题”来检验我见过不少iOS新人简历上写着熟悉UIKit、熟悉Auto Layout一到真机跑起来就露馅。原因很简单面试题是背出来的练习卷是练出来的二者的知识留存率完全不是一个量级。这套卷子的题面设计很有意思很多题目都带实操背景不是“什么是循环引用”这种背诵型问题而是“模拟器上定位不准怎么排查”、“证书到期后App还能不能安装”这类场景题。这就逼着你打开Xcode真跑一遍跑完再回头查理论印象会深得多。我甚至建议你把卷子里的每道题都当成一个小项目来做先猜结果再写代码验证最后记录结论这个过程走下来比刷十遍面试题管用。2. 核心考点拆解与实操要点2.1 iOS架构方案不是选最火的而是选能落地的练习卷里关于架构的考察主要集中在MVC、MVVM、MVP的区别以及各自的使用场景。这个点看似基础实际是很多项目后期维护成本分水岭的地方。我见过太多小团队一上来就上MVVM RxSwift结果业务逻辑三层嵌套出个Bug查一天。我的建议很直白项目初期MVC足够当页面复杂度上来、Controller超过800行时再逐步引入MVVM。Component化也一样不要在项目只有三个模块时就去搞Pod私有库那是大厂解决多人协作问题的方案不是小团队该背的包袱。架构是手段不是目的卷子考你架构其实是在考你对复杂度是否敏感。关于MVVM的落地我分享一个很实用的过渡技巧不一定要引入ReactiveCocoa或Combine这类响应式框架先用Block回调或者Delegate把ViewModel的数据绑定做起来效果也差不多且团队学习成本低。我做过一个比较复杂的订单流程页面就是用传统Delegate方式实现MVVM整体代码量比MVC少了半Controller从1000多行降到300行左右可读性提升非常明显。2.2 UIStackView自动布局的懒惰利器UIStackView是苹果推出的用于简化Auto Layout约束的容器控件练习卷里把它单独列出来考我觉得是很有道理的。很多iOS开发者写复杂布局时还在手动拉约束一个页面几十条约束改一处崩三处。UIStackView的核心价值在于它帮你管理一组子视图的排列规则轴线方向、间距、对齐方式、分布方式你只需要关注每个子视图的自身尺寸约束至于它们之间的相对关系StackView自动搞定。我做一个简单的设置页面时用三个UIStackView嵌套原来需要手写大概30条约束现在只需要10条左右而且适配不同屏幕尺寸时只需要调整StackView的分布属性省心很多。实操上要特别注意几点嵌套层级不要太深UIStackView虽然好用但嵌套超过三层以后对布局性能有一定影响尤其是列表页面的Cell里。和UITableViewCell配合StackView在Cell内使用时建议把StackView的四边约束固定好StackView内部子视图的约束只要设置成与StackView对齐系统就能自动推算Cell高度配合自撑开布局非常合适。iOS 11之后才支持嵌套StackView如果项目最低支持版本是iOS 11以下嵌套时要注意布局异常问题。2.3 iOS分屏与多任务适配“iOS分屏”这个考点很多人以为是新功能实际iPadOS从iOS 9就开始支持Split View了但直到这两年iPhone横屏模式分屏概念不断被强化才被更多开发者重视。练习卷考这个其实是在考你是否理解了一个关键概念你的App在不同窗口大小下应该如何自适应布局。分屏适配的典型问题是App在竖屏下布局正常一进入Split View被压缩到三分之一宽度界面就乱成一团。排查思路有几个层次我按优先级给你检查所有关键控件的压缩阻力Compression Resistance和内容拥抱优先级Content Hugging确保控件在宽度变化时知道谁能被压缩、谁要保持固有尺寸。用Size Classes适配但别只盯着iPhone/iPad两个维度分屏时会动态触发compact宽度所以所有约束都要用相对布局不要写死固定宽度。适配过程中重点关注导航栏、TabBar、CollectionView的FlowLayout这三个地方是最容易因为分屏而出现异常的。我开发过程中最常用的验证方法在模拟器的Window菜单里直接切换不同的分屏尺寸实测下来比改代码效率高很多。2.4 证书、签名与上架绕不开的工程化环节练习卷里关于“iOS开发者App证书更新”、“上架流程”的题目每年都能刷掉一批面试者。原因是这些东西平时开发用不到Xcode帮你做了只有到打包、分发、上架的时候才暴露出来。证书体系的本质是苹果用来保证App来源可信的一套双向签名机制你的Mac用私钥对App签名苹果用公钥验证签名同时描述文件决定你的App能装到哪些设备上、能使用哪些能力。这套机制学过密码学的人都知道是经典非对称加密应用没学过的人也不用慌记住这张对照表就够了概念作用常见误区证书Certificate标识开发者身份证书不是App专用的是账号维度的描述文件Provisioning Profile绑定App ID、设备、权限描述文件有有效期过期后无法真机调试App ID唯一标识一个App不要随意用通配符推送等功能无法匹配私钥对App进行签名私钥丢失后无法备份只能重新生成证书具体操作流程上有几个高频用户会踩坑的场景我直接列出来证书到期证书到期前系统会提示但很多人习惯忽略。到期后已经安装的App不受影响但无法再使用Xcode进行真机调试也无法提交新版本到App Store。解决办法是提前在开发者后台续期重新生成描述文件并下载到本地。描述文件失效如果你的App添加了推送、CarPlay等新能力必须重新生成描述文件否则Archive打包时Xcode会报错。加急审核遇到线上严重Bug需要紧急发版可以通过App Store Connect的“申请加快审核”入口提交请求一般24小时内会有响应但一年只有两次机会且只适用于修复严重问题不建议滥用。2.5 iOS自动化与开发者模式练习卷里关于自动化的考点主要集中在XCTest、UI测试脚本以及“开发者模式”这几个词上。这里我要多说一句很多人把自动化等同于TestFlight分发或者Appium脚本其实iOS生态里自动化分两条线一条是苹果官方的XCTest框架做单元测试和UI测试另一条是使用Appium、Macaca等第三方框架做跨平台自动化。卷子既然考了那就两条线都得有概念。实际做UI测试时我最常用的方式是录制回放Xcode的UI测试支持录制操作步骤然后自动生成代码再结合xcodebuild命令行输出测试报告。这套东西配合CI/CD比如GitLab CI或Jenkins可以做到每次提交代码自动跑一遍冒烟测试省下的手工回归时间非常可观。“开发者模式”这个词也需要多说两句它主要指iOS 16之后真机调试前需要在手机设置里手动开启的“开发者模式”开关。这个开关的目的是防止非开发者用户误安装调试包但实际操作中很多人找不到路径在设置 - 隐私与安全性 - 开发者模式打开后手机会提示重启重启后即可正常连接Xcode真机调试。3. 实操过程与核心环节实现3.1 用Charles抓包排查线上问题练习卷里出现“Charles iOS抓包”这个热词一点都不意外这是iOS开发排查网络问题绕不开的利器。很多人装上Charles之后发现抓不到App的HTTPS包便开始怀疑工具不行其实是没正确配置证书和代理。完整流程按顺序走一遍电脑端安装Charles默认监听端口8888记录好电脑的局域网IP地址。手机和电脑连同一个WiFi手机WiFi设置里手动配置HTTP代理服务器填电脑IP端口填8888。用手机浏览器访问chls.pro/ssl下载并安装Charles根证书。注意iOS 10.3之后证书需要到“设置 - 通用 - 关于本机 - 证书信任设置”里手动开启完全信任否则TLS解密还是失败。打开Charles的SSL Proxying设置在SSL Proxying Settings里添加需要解密的域名*代表全部域名。这里有一个我踩过多次的坑Charles只能解密基于HTTP/HTTPS的流量。如果App内部用了TCP长连接、WebSocket、或者本地HTTPDNS方案Charles默认抓不到需要在Charles的External Proxy设置里配上游代理或者换用Wireshark做底层抓包。不要一抓不到包就怀疑证书配置先确认App的流量是不是真的走了HTTP代理链路。3.2 通过iOS模拟器与设备模拟验证多机型适配iOS模拟器是练习卷里另一个高频词。模拟器的优势是启动快、不占用真机资源但它的局限也很明显不模拟CPU指令集架构不模拟GPU渲染不模拟硬件传感器。所以用模拟器做初步布局验证是没问题的但遇到摄像头、陀螺仪、定位、低功耗蓝牙这类功能一定要回到真机去验证。模拟器最容易被忽略的需求是“模拟特定机型/系统版本”。Xcode的Device界面里可以下载不同版本的iOS Simulator Runtime然后创建不同机型的模拟器。我经常用iPhone SE短宽度和iPhone Pro Max大尺寸两个模拟器同时跑同一个App布局是否异常基本一眼就知道。如果你开发的是iPad适配App还可以在模拟器里把Window切换成分屏宽度直接看压缩布局效果这就省去了手动拉约束验证的功夫。另外一个模拟器的实用技巧模拟器可以模拟网络状态。Xcode新增了Network Link Conditioner的模拟器扩展可以模拟3G、4G、高延迟、丢包等网络条件用来验证弱网下的请求超时逻辑特别好用。这功能藏在模拟器菜单的Device - Manage Devices里需要单独安装但值得配置一次。3.3 真机调试与日志排查的常规操作真机调试是练习卷里必然要考的一环毕竟模拟器做得再好也不如真机上的帧率、内存、网络状态真实。真机调试的完整流程开发者账号登录Xcode、选对开发团队、Bundle Identifier设置好、手机开启开发者模式、连接数据线点击运行。这里我必须提醒一个隐蔽问题如果项目里使用了推送、后台模式、HealthKit等能力对应的Capability开关没开或者描述文件不包含该权限真机编译时不会报错但运行时功能会直接不生效或崩溃排查起来很头疼。日志排查上我用得最多的是两个工具Xcode控制台的统一日志使用log stream命令过滤系统日志以及 Instruments 的 Time Profiler分析CPU耗时和 Leaks检测内存泄漏。很多新人遇到崩溃只会看系统弹窗实际上更高效的做法是拿到崩溃日志后用Xcode的符号化功能xcrun atos把十六进制地址转换回源代码行号这一步能让你从“崩溃在地址0x1023f4”直接跳到“崩在订单详情页的布局代码”。3.4 混合开发与跨端协作的落地路径练习卷里的热词中有几个明显的“跨端”信号Uniapp打包iOS、Android与iOS区别、混合开发方案、WebView访问本地图片。这说明现在的iOS工程师光会写原生代码已经不够至少要懂跨端App是怎么和原生层通信的。以Uniapp为例它的本质是Vue语法写界面通过DCloud提供的离线SDK打包成iOS原生壳再用JSBridge让JS层和原生层互相调用。常见的业务场景是页面由JS渲染需要调起原生相机、推送、定位时通过Uniapp的uni.xxxAPI走SDK桥接层再由原生代码实现功能。这套体系下原生工程师的基础能力依然很重要原因很现实Uniapp里很多高级功能比如动态修改Icon、自定义推送渠道不能用现成API完成必须写原生插件再通过SDK暴露给JS层调用。所以卷子考iOS核心能力跟跨端趋势并不冲突反而是在告诉你原生是跨端的底层地基地基不牢上层再好也白搭。另外再补充一个WebView相关的实操细节WKWebView加载本地HTML时默认没法直接通过相对路径访问沙盒里的本地图片需要把HTML的baseURL设置成图片所在目录的绝对路径或者直接用自定义Scheme拦截加载本地图片。这个问题在纯浏览器调试时不会暴露一打包到iOS端才出现属于典型的跨端环境差异坑。4. 常见问题与排查技巧实录4.1 定位、蓝牙与传感器类问题的调试思路练习卷的热词里多次出现定位和BLE连接参数这是iOS系统能力集成的两个重灾区我单独拎出来说。定位不准、不回调、第一次弹权限框没反应这些问题的排查思路其实比较固定先确认Info.plist里添加了NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription不添加会直接崩溃或弹框后自动消失。再确认CLLocationManagerDelegate回调里是否在主线程更新UI否则会出现UI不刷新但定位实际成功的情况。模拟器上定位不准不要慌模拟器默认没有GPS硬件可以通过Xcode的Features - Location菜单手动模拟经纬度。真要验证真实定位能力必须配合真机。iOS模拟器和真机还有一个容易被忽视的区别模拟器上定位可以秒回真机在室内环境第一次定位可能要几十秒排查时不要一上来就怀疑代码有问题。BLE连接这块练习卷里出现的“iOS BLE连接参数规范”我猜是在考CoreBluetooth连接时的几个关键参数扫描时设置CBCentralManagerScanOptionAllowDuplicatesKey为NO避免重复扫描连接时如果设备连接后快速断开要检查CBPeripheral的maximumWriteValueLength不同设备返回值不同超过这个长度会导致写入失败另外iOS后台扫描BLE时不能指定service UUID这是系统限制只能全量扫描再过滤。4.2 iOS电池优化别把性能优化做成玄学电池优化这个考点在练习卷的热词里看着挺冷门实际上跟每个开发者的日常都相关。一个App耗电严重用户的卸载率会直线上升而苹果在App Store审核时也会关注后台电量消耗耗电异常有被拒风险。耗电排查的常见手段是通过Xcode的Energy Log查看CPU、网络、定位三项的电量消耗。几个经典的耗电问题定位在后台连续请求定位而不降低精度是最常见的耗电方式。正确的做法是后台定位时使用startMonitoringSignificantLocationChanges重大位置变化监听或降低desiredAccuracy不需要持续运行时及时stopUpdatingLocation。网络频繁轮询接口、没有做好请求合并、没有使用缓存都可能导致系统长时间保持网络连接。建议用URLSession的waitsForConnectivity和httpMaximumConnectionsPerHost合理控制连接数。后台任务beginBackgroundTask没有在任务结束时调用endBackgroundTask后台任务会一直占用系统资源。用系统自带API做后台任务时一定要在expirationHandler里调用endBackgroundTask这个坑我见过无数人踩。最后说一个很多新人不知道的点iOS 11之后应用在后台不被允许做大量CPU密集型操作系统会给一个有限的执行窗口大约几秒到30秒不要试图在后台做数据同步或图片处理容易被系统直接杀掉而且用户还会投诉App后台耗电。4.3 常见崩溃与布局异常速查表练习卷最大的价值是帮你把知识体系串起来但这不意味着你不会在新项目里踩新的坑。这里送上一张我平时排查问题时的速查表覆盖高频崩溃和布局异常场景症状可能原因排查/解决思路启动闪退Info.plist配置错误、缺少系统权限描述查看崩溃日志堆栈检查第三行以上信息定位到代码具体模块页面布局错乱Auto Layout约束冲突或缺失在Xcode菜单Debug - View Debugging里检查约束冲突列表列表滚动卡顿Cell复用机制错误、图片频繁解码检查cellForRowAtIndexPath里的复用逻辑用异步图片加载并做缓存地图/相机无响应系统权限未配置或未请求检查Info.plist权限描述检查是否有UI控件冲突低版本系统崩溃使用了高版本API未做兼容判断使用available或respondsToSelector做版本判断App被系统杀掉内存占用过高或后台任务违规用 Instruments 的 Allocations 和 Energy Log 做检测做这套练习卷的过程中我最大的感受是iOS开发的知识体系是网状的不是线性的。你今天学一个UIStackView可能明天就要用它解决一个自动布局冲突后天配置证书可能又会牵扯出描述文件和推送权限的问题。所以如果你正处于入行阶段不要焦虑“我是不是还有很多不会”按卷子的模块逐个击破比追求一蹴而就要靠谱得多。最后再分享一个我个人的小习惯每做完一个模块的练习卷我会把卷子里的场景题改造在模拟器里做一遍、真机上做一遍然后把差别记录下来。这套做法保持了大约两年对我理解各种iOS开发细节帮助极大。也许就是这种“反复验证、持续记录”的笨方法才让一个普通的iOS开发者在遇到各种奇怪问题时知道该去哪儿找答案。希望这份练习卷解读能帮你少踩几条我当年踩过的坑。