ARTICLE DETAIL

资讯详情

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

从零开始学iOS开发:环境搭建到跑通第一行代码

从零开始学iOS开发:环境搭建到跑通第一行代码 不少朋友问过我同一个问题作为一个完全没接触过iOS开发的新手第一行代码到底该怎么写这个问题听起来简单背后牵扯出的东西却不少——你得先搞清楚用什么语言、搭什么环境、建什么工程然后才算真正“上手写代码”。这篇文章我按自己当年踩过来的一条路线把从零到跑通第一行代码的完整过程讲一遍。它适合完全零基础、想入门iOS开发的人也适合之前用uniapp或HBuilderX打过iOS包、但对原生开发一直心里没底的朋友。全文不绕弯子直接上实操。1. 先想明白iOS开发到底是什么方向1.1 三条常见的入门路径先对号入座很多新手一上来就问“iOS开发怎么学”这个问题太大我得先帮你拆一下方向。市面上最常见的其实是三条路第一条是原生iOS开发用Swift或者Objective-C写App这也是这篇文章重点讲的一条第二条是跨平台开发用Flutter、React Native、uniapp这类框架写一套代码同时出iOS和Android两个平台的包第三条是iOS生态周边比如自动化测试、脚本工具、快捷指令玩法、逆向分析之类这条路基本不适合刚接触编程的人建议先放一放。这三条路不是互斥的但你的第一行原生代码一定要会写。原因很简单就算你用uniapp打包iOS包选证书、配Bundle Identifier、写隐私权限描述、调原生插件时你还是得明白iOS工程的基本逻辑。我在实际带新人时发现凡是能把原生Hello World跑通的人学跨平台框架都快得离谱反过来只会在HBuilderX里点“云打包”的人遇到一点工程问题就卡死。所以不管最终选哪条路先把原生第一行代码跑通永远不亏。1.2 一台Mac是不是硬性要求这个问题我几乎每周都被人问。直接说结论想正常学iOS原生开发一台Mac电脑是硬性要求逃不掉。原因是App的编译、签名、打包、上传到App Store整个链路都高度依赖苹果自家的Xcode工具链而Xcode只跑在macOS上。苹果对生态的控制就是这么严这既是劣势也是优势——正因为闭环iOS项目的工程结构才比Android那边规范得多。没有Mac的新手我有几个务实的建议预算紧就买一台二手Mac mini两三千块钱足够入门不想花钱可以先租云Mac按月付费体验完全一样还有人在普通电脑上折腾黑苹果我个人不推荐新手走这条路单是驱动和系统稳定性就能消耗掉你全部热情。另外提醒一句Xcode加模拟器占空间不小至少准备好40GB的剩余磁盘硬盘256GB起步是底线我见过好几个同事因为磁盘满了导致编译报错排查半天才发现是空间问题。1.3 Swift还是Objective-C新手不要纠结我遇到的新手十个里有八个会在“学Swift还是学Objective-C”这件事上纠结半天。我的答案非常明确直接学Swift别回头。Swift是苹果从2014年开始主推的语言2019年Swift 5发布后ABI就已经稳定系统库和第三方库的兼容性早就不是问题了。Swift语法更现代写起来接近Python和TypeScript对新人友好得多。那不学ObjC行不行短期行长期看需求。现在很多老项目、知名大厂的存量代码还是ObjC写的面试时如果对方团队技术栈偏旧会问ObjC相关的东西。但这不是新手阶段要考虑的事。你先用Swift把iOS开发的框架和思路学会后面真有需要ObjC和Swift可以混编再补不迟。很多公司招聘写的“会Objective-C优先”其实就是希望你有一定基础而不是要求你会两门语言。2. 环境搭建Xcode的安装与配置细节2.1 Xcode版本与系统版本的匹配关系环境搭建是整个入门过程里最劝退的一步我现在还能想起自己当年卡在Xcode安装上整整半天的样子。先记住一个核心概念每一个Xcode版本都要求对应的macOS版本苹果在这件事上没有任何通融。比如最新版Xcode可能要求macOS 14以上你系统版本不够App Store里连下载按钮都点不了。反过来太老的macOS最高只能装某个老版本Xcode而老版本Xcode又不支持最新版iOS的模拟器或真机调试会出现“Could not find developer disk image”这类报错。所以正确操作是先查清楚你的macOS版本再去找对应能装的Xcode版本。新机器直接去App Store搜Xcode下载就行旧机器则要去苹果开发者网站翻历史版本。装完之后在终端里执行xcodebuild -version能正常输出版本号就说明命令行工具链没问题。首次启动Xcode时它会提示安装额外组件比如模拟器运行时这一步别跳过要把整个下载流程走完否则后面建工程时一堆东西用不了。2.2 初始化三件事授权、命令行工具、SDK确认很多人装完Xcode就急着建工程结果第一步就出各种奇怪问题。我建议新环境装好后按下面三步走一遍初始化能省掉后面大量麻烦。第一步打开终端执行sudo xcodebuild -license accept这条命令会把Xcode的许可协议一次性接受掉避免后续操作到一半弹窗卡住。第二步如果你打算用Homebrew、Git、cocoapods这些开发工具还需要执行xcode-select --install安装命令行开发者工具。第三步是确认模拟器运行时已经装好可以在Xcode的Settings - Components里看到不同iOS版本的模拟器下载你需要的那一版。这步初始化真的很重要。我记得带过一个小伙伴他Xcode能开、能建工程但一跑pod install就报错后面发现是命令行工具没配置好。iOS开发越往后越依赖终端工具链所以环境问题最好在一开始就根治。2.3 免费Apple ID注册与开发者模式现在学习阶段的签名问题已经比前几年友好太多了。以前必须要花99美元注册开发者账号才能真机调试现在苹果允许免费Apple ID做个人签名调试。操作起来很简单打开Xcode菜单栏Xcode - Settings - Accounts点左下角加号把自己的Apple ID登录进去就行。登录后会出现一个Personal Team这个就是你的免费开发者身份。免费签名有两个硬限制新手必须知道第一签名证书有效期只有7天7天后需要重新到Xcode跑一次才能继续用第二个人免费团队不支持推送通知、CloudKit等部分云端能力但这些功能学习阶段用不上。此外从iOS 16开始苹果在真机上加了“开发者模式”开关第一次真机调试时手机会提示你需要在iPhone的设置 - 隐私与安全性 - 开发者模式里手动打开并重启手机。这是安全机制不是报错看到别慌。3. 第一行代码从新建工程到Hello World3.1 新建工程时这些选项怎么选环境搞定之后终于可以开始写代码了。打开Xcode选File - New - Project在模板页选择iOS - App然后会进入一堆配置项的页面。这里有几个选项我逐个给你说明白。Product Name是你的项目名起一个英文名比如HelloWorld。Team选你刚才登录的个人Team。Organization Identifier是组织标识一般填com.你的名字这种逆域名格式它会和项目名拼成真正的Bundle Identifier比如com.example.HelloWorld这个值后面在真机调试和上架时是唯一标识别乱改。Interface这个选项比较关键现在最新Xcode默认是SwiftUI它代表界面写法如果你选了Storyboard则是UIKit那套老方案两者后面的代码风格完全不同。我这里建议新手先用SwiftUI因为代码更少、更直观。Language选Swift其他选项保持默认就行。点击下一步选好工程保存位置Xcode会自动生成一个完整的工程。你先别急着写代码花五分钟把左侧导航栏的文件结构看一遍HelloWorldApp.swift是App入口ContentView.swift是第一个界面Assets.xcassets管图片资源HelloWorld.entitlements管能力权限。知道这些文件是干嘛的后面改了代码才知道影响范围。3.2 三种写第一行代码的方式对比很多人以为“第一行代码”就是打开某个文件敲一句话其实在iOS里至少有三种常见写法我建议你都亲手敲一遍。第一种是SwiftUI声明的界面代码在ContentView.swift里原本就有一行Text(Hello, World!)这就是你的第一行真正的界面代码。SwiftUI用声明式语法像搭积木一样往视图上堆组件非常直观import SwiftUI struct ContentView: View { var body: some View { VStack { Image(systemName: globe) .imageScale(.large) .foregroundColor(.accentColor) Text(Hello, World!) } .padding() } }第二种是UIKit的命令式代码。如果你选择的是Storyboard模板打开ViewController.swift在viewDidLoad里写这样的代码手动创建一个UILabel放到屏幕上import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let label UILabel() label.text Hello, World! label.frame CGRect(x: 100, y: 200, width: 200, height: 50) label.textColor .label view.addSubview(label) } }这里CGRect(x:y:width:height:)其实就是一个坐标矩形理解成“把标签放到屏幕的某个位置”就行。第三种写法最简单纯粹在控制台输出一行日志override func viewDidLoad() { super.viewDidLoad() print(第一行代码) }三种写法都值得体验一次。SwiftUI写界面快UIKit能让你理解iOS底层视图体系的运作逻辑而print输出则让你学会用控制台观察App运行状况——后面调试时这个技能天天用。3.3 在模拟器上跑起来代码写完之后点Xcode左上角的运行按钮或者直接按Command R工程就会开始编译并自动启动模拟器。第一次编译会比较慢机器配置一般的可能要一两分钟别反复点运行按钮耐心等编译进度条走完。编译过程其实有几个阶段先由Swift编译器把代码编译成机器码再把工程里用到的资源复制进App包最后对App做代码签名并安装到模拟器里。这就是为什么哪怕改了一个UI颜色重新运行也要等一会儿。跑起来之后你在模拟器里点开App图标看到“Hello, World!”出现在屏幕上恭喜你的第一行iOS代码就正式生效了。这里分享几个模拟器必备快捷键Command Shift H模拟按下Home键Command K可以开关模拟器的软件键盘翻转设备在Device - Rotate里。另外Xcode底部调试区域的输出框里能看到print打印的内容以后排查日志全靠它。4. 读懂你写的代码新手必会的Swift基础4.1 变量、常量和类型推断写第一行代码只需要复制粘贴但想真正理解它你得补一点Swift基础语法。首先要分清变量和常量Swift里用var声明变量、用let声明常量var message Hello let appName MyApp let version: Double 1.0message可以后续重新赋值appName定义之后就不允许再改了。这个设计对新手来说一开始会觉得不自由但它其实是Swift的一大优点编译器能提前帮你判断哪些值不该变写出更安全的代码。日常开发里我建议默认能用let就用let确实需要修改的时候再改成var。Swift还有一个让很多新手舒服的特性自动类型推断。你写let appName MyApp编译器自动知道它是String类型不用像别的语言那样写全类型名。只有当推断不够清晰时才需要显式标注类型比如let version: Double 1.0这种。4.2 字符串插值、print与注释写Hello World时你一定会用到字符串拼接。Swift里最推荐的写法是字符串插值用反斜杠加括号把变量嵌进字符串里let name 小明 print(你好\(name)这是你的第一行iOS代码)这比用加号拼接字符串你好 name可读性好得多也是Swift社区的主流写法。如果你是从JavaScript或Python转过来的注意别把反引号或者百分号占位符的习惯带进来Swift里就用\(变量)这套。代码注释用双斜杠//写单行注释用/* */写多行注释。我在带新人时反复强调注释是写给未来的自己看的关键逻辑一定要写但别把注释写成流水账。一行print(第一行代码)你加个“打印日志”注释纯属浪费阅读时间。4.3 可选类型Optional是新手第一道坎iOS开发里有一个概念几乎每个新手都会卡住那就是Optional可选类型。你可以把它理解成一个“可能为空的盒子”普通变量Int一定装着一个整数而Int?这个问号表示盒子里可能是整数也可能是nil空值。var score: Int? nil if let s score { print(分数是\(s)) } else { print(还没有分数) }上面这段用了if let的写法它的意思是如果盒子非空就把里面的值解包给s然后执行第一段代码如果为空就走else分支。这种机制是Swift避免空指针崩溃的核心设计Android开发里常见的空指针崩溃在Swift里用这套机制能规避掉大部分。新手入门阶段不需要把Optional玩得很深但你一定要认识?和!这两个符号看到代码里出现它们时至少知道这是在处理“可能为空的值”。4.4 从JS/Python转过来的三个语法差异很多学iOS开发的新手之前写过JavaScript或Python这些差异一定要提前知道否则会反复踩坑。Swift是强类型语言一个变量定义成什么类型就只能存什么类型不能像JavaScript那样随便混。第二Swift不需要写分号结尾写习惯了反而觉得清爽。第三Swift的函数定义和调用方式差异很大函数签名里参数标签是非常核心的语法比如func greet(name: String)调用时要写成greet(name: 小明)。这些差异不是难只是需要时间适应每天写一点两周左右就顺手了。5. 模拟器与真机调试的实操要点5.1 模拟器日常操作与效率技巧iOS模拟器和Android模拟器完全不是一回事。iOS模拟器本质上是跑在Mac上的一个完整的iOS运行时性能非常接近真机启动App的速度有时比真机还快。日常开发中模拟器是最高频的调试环境所以几个操作技巧必须掌握。在Xcode顶部的设备栏可以直接切换不同型号的模拟器比如iPhone 14、iPhone 15 Pro等。想要增加更多模拟器型号在Window - Devices and Simulators里下载对应的模拟器运行时就行。模拟器本身支持旋转、模拟摇一摇、模拟定位、切换深色模式还有个很好用的功能是模拟内存警告在Features菜单里可以手动触发。你现在用不到这些但知道在哪找后面调试时能省很多事。5.2 真机调试免费证书的7天限制模拟器再好有些能力也只能真机验证——比如相机、定位、蓝牙这类硬件功能还有App的实际安装和启动体验。真机调试的流程比跑模拟器多几步先用数据线把iPhone连到Mac在手机上点“信任此电脑”然后到设置里打开开发者模式并重启手机。重启后打开Xcode在设备选择栏里选中你的真机Xcode会自动处理签名。第一次真机运行需要选Team就是你在Xcode账号里登录的个人Team。选完之后再点运行Xcode会生成一个免费签名放到你手机上。这里有个坑我必须提醒你免费签名7天就过期过期后App在手机上打不开哪怕是从Xcode装的也一样。解决办法是重新点一次运行让Xcode重新签名代码不用改。如果长期频繁调试建议以后注册付费开发者账号一年99美元还能用TestFlight内测、推送、云端能力值不值看个人需求。5.3 Bundle Identifier与签名机制的关系很多新手会好奇为什么iOS真机调试一定要选Team做签名直接安装不行吗这里涉及苹果的安全机制。iOS规定所有运行的App必须携带合法签名签名包含两个信息一是这个App是谁编译的二是这个App有没有被篡改过。Xcode把App安装到真机时会用你的证书给App打上签名同时设备上已经记录了你这个开发者的身份双方对上号才允许运行。你可以把签名机制理解成换锁配钥匙设备认得你的钥匙你配的新钥匙装上去就能开锁。而免费签名7天过期相当于钥匙有效期到了需要重新配一把。Bundle Identifier则相当于App的身份证号同一台设备上不能装两个相同Bundle ID的App所以在新建工程时设置好之后别乱改。我在开发中就用这个特性同时装正式版和测试版两个不同的Bundle ID互不干扰非常方便。6. 新手必踩的坑与排查速查表6.1 安装与启动阶段的典型问题我统计过自己带过的新人环境搭建阶段出问题的概率最高而且问题五花八门。下面这张表是我整理的高频问题建议你收藏备用。现象常见原因解决方案App Store里点不了Xcode下载系统版本过低上苹果开发者网站找老版本Xcode首次启动一直卡在“Installing additional components”网络波动或磁盘不足清理磁盘后重启Xcode重试模拟器下拉列表里没有设备模拟器运行时未下载Settings - Components里下载对应版本终端执行xcodebuild提示command not found未装命令行工具执行xcode-select --installXcode能打开但编译报错Swift版本不对选错Xcode版本确认Xcode和macOS版本配套安装阶段还有一个隐藏问题——磁盘空间。Xcode本体加模拟器运行时轻松超过30GB很多Mac老用户空间本来就紧张装到一半失败导致各种莫名其妙的状态。如果你也遇到“下载完了但安装失败”先清出至少40GB空间再试多半能解决。6.2 编译与运行阶段的典型问题工程能建起来之后编译报错才是真正高频的拦路虎。新手第一次跑工程最常见的报错是“Signing for X requires a development team”这句英文翻译过来就是“你还没选开发者团队”。解决方法是在右侧Signing Capabilities里勾选你的Team或者到工程设置里把Team选上。另一个高频报错是“Could not find developer disk image”中文意思是找不到开发者磁盘镜像。这种情况通常出现在Xcode版本较老、手机系统版本较新的时候苹果的系统镜像没有跟上升级Xcode版本到最新基本就能解决。“No such module”这类报错通常是第三方依赖没安装好比如你刚配置CocoaPods但还没执行pod install。还有黑屏问题App启动后一片黑多半是界面配置出了问题检查Info.plist里的启动配置或者Storyboard入口是不是被删掉了。我排障时还有终极三招几乎能解决60%以上的玄学问题关掉模拟器重启、删除DerivedData在Xcode - Settings - Locations里点箭头打开文件夹删掉整个文件夹、重启Xcode。很多编译缓存导致的问题在这三连招之后直接消失。6.3 排查思路比报错本身更重要遇到报错时新手最容易犯的错误是只盯着报错信息那一行看然后就傻眼了。我的建议是养成三个习惯第一先把报错信息完整读一遍英文不好就复制到翻译工具大部分Xcode报错其实已经把解决方案说得很清楚第二看Build Log里的完整编译日志Xcode左侧导航栏里的Build选项能看到每一步的详细输出报错前后的日志往往能告诉你是哪一步挂了第三学会用控制台看运行时日志App崩溃时控制台会打印崩溃原因配合print日志能快速定位问题出在哪一行。这三个习惯本质上是在教你一个思路报错不可怕可怕的是没有定位问题的方法。能把自己从“一报错就慌”的状态调整到“按部就班找原因”的状态你就算入门了。7. 第一行代码之后下一步学习路线7.1 先过语法关再选UI框架跑通第一行代码只是开了个头。接下来不要急着写复杂App先把Swift基础语法系统过一遍Optional的进阶用法、闭包Closure、结构体和类、协议与扩展、泛型入门这些是后面读任何开源项目都绕不开的基础。你可以用Swift Playgrounds这个App在iPad上做语法练习也可以在Xcode里直接新建一个Playground文件边写边看结果比硬啃文档轻松得多。语法关过了之后面临一个分叉口继续学SwiftUI还是学UIKit。我的建议是如果是为了求职先去了解目标公司技术栈很多大厂存量项目还是UIKit但新项目越来越多用SwiftUI如果纯自学玩直接从SwiftUI开始就行。千万别两头同时学很容易混淆。7.2 收藏这份高频面试题清单现在很多iOS开发面试不管初级还是中高级都喜欢问一些基础题来考察你对iOS生态的理解。这里列几个新手阶段就能开始留意的高频题UIView和CALayer的区别和联系iOS中同步异步、串行并行的区别App启动流程是怎样的内存管理ARC的原理组件化模块化开发怎么做。这些题目背后的知识点不深但都很基础建议你在学完语法和UI后逐个攻破。比如UIView和CALayer这道题面试官真正想考察的是你有没有理解iOS的视图体系UIView是负责交互和布局的视图层CALayer是负责渲染的图层UIView内部有一层layer属性负责绘制内容两者互相协作。这种理解不是背答案能拿到的而是写代码慢慢悟出来的。同步异步和串行并行则是多线程里的基础概念涉及到GCD和队列的理解这部分等你有一定代码量之后再看会事半功倍。7.3 用一个小项目完成闭环学编程最忌讳只看不写。我强烈建议你跑通Hello World之后把下一个目标定成一个“待办事项App”能添加任务、勾选完成、删除任务。这个项目虽然小但会逼着你用到列表界面、数据存储、页面跳转、输入交互这几个iOS开发的核心模块。做完之后再给这个App加一个“深色模式适配”、或者搬到真机上每天用一次体验一下真实开发的感觉。做完这个小项目你再回头看自己写的Hello World会觉得当时觉得震撼的东西不过如此——这种质变就是持续写代码带来的回报。GitHub上有很多开源iOS项目建议你找个喜欢的、代码量适中的项目读源码看不懂的地方逐个点进去看这是进阶路上性价比最高的学习方式。我个人在实际带新人的过程中有一个很深的体会第一行代码其实不是起点而是一个确认“这条路我能走通”的里程碑。我见过太多人倒在了环境搭建和第一次编译报错上不是能力不行而是被开头的一堆陌生概念吓退了。所以遇到问题别硬扛先重启再搜索搜索不到就问人工程方法永远多于困难。跑通Hello World只是几分钟的事保持写下去的手感比什么都重要。
返回列表