第12章:苹果应用开发生态系统¶
在你继续构建本书的另外两个应用程序之前,这里还有一个概述章节。
在构建HIITFit
的时候,你学到了很多关于Xcode
、Swift
和SwiftUI
的细节。在上一章中,你得到了一种"阳台视角",即各种属性封装器如何帮助你管理应用程序的数据状态。本章提供了整个苹果应用开发生态系统的鸟瞰图,解开了你在iOS
开发者聚在一起聊天时可能听到的许多术语的神秘感。你将开始建立自己的心智模型,了解所有部分是如何结合在一起的,为苹果每年增加的所有新东西创建自己的框架。
SwiftUI
的简要历史¶
你一直在使用SwiftUI
构建HIITFit
,但这只是苹果公司最新的应用开发范式。
苹果在2019年6月的全球开发者大会上宣布了SwiftUI
。SwiftUI
建立在苹果于2014年6月宣布的Swift
编程语言之上。SwiftUI
是一种特定领域语言(DSL
),使用这些新的Swift
功能用Swift
编写。
- 属性封装器,如
@State
来监控属性的状态。 - 结果生成器,如
@ViewBuilder
来创建视图层次结构。 - 不透明的结果类型,如
some View
以避免明确地写出视图层次。
与Objective-C
相比,Swift
可以创建更快、更安全的应用程序,而且更多的是面向协议而不是面向对象。第15章"结构、类和协议"解释了类的继承和协议的区别。
到2018年3月,Redmonk
编程语言排名(bit.ly/3rsZmwq)将Swift和Objective-C并列排在第十位。
Objective-C
是在1997
年苹果收购NeXT
时进入苹果历史的,这也让史蒂夫-乔布斯回到了苹果。乔布斯在1985年与首席执行官约翰-斯库利(John Sculley
)就Macintosh
电脑的未来进行的董事会斗争中失败后,从苹果公司辞职了。乔布斯和其他五位前苹果公司高管随后成立了NeXT
电脑公司。
用Objective-C
编写的NeXTSTEP
操作系统构成了2001年发布的Mac OS X
的基础。苹果为开发者提供了Cocoa API
,以便为OS X
创建应用程序。Cocoa
由三个反映Model-View-Controller
原则的框架组成:Core Data
、AppKit
和Foundation
。AppKit
和Foundation
中的NS
前缀是对其NeXTSTEP
遗产的认可。
苹果在2007年发布了iPhone
,并在2008年发布了iPhone SDK
(软件开发工具包)。这包括Cocoa Touch
,UIKit
取代了AppKit
。现在被称为iOS SDK
,它帮助你创建的应用程序的外观和行为符合用户的期望。
有趣的事实¶
- 第一台万维网服务器是一台
NeXT
电脑,id
软件公司在运行NeXT
操作系统NeXTSTEP
的机器上开发了视频游戏《毁灭战士》和《雷神》。1996年,NeXT
软件公司发布了WebObjects
,一个用于网络应用程序开发的框架。苹果公司使用WebObjects
建立并运行苹果商店、MobileMe
服务和iTunes
商店。 Cocoa != Java for kids
。在乔布斯回到苹果公司之前,苹果先进技术集团创建了KidSim
,一个教孩子们编程的应用程序。KidSim
程序被嵌入到网页中运行,因此他们将该应用程序重新命名并注册为Cocoa
--"儿童的Java"。Cocoa
程序是1997年被砍掉的众多程序之一,苹果在OS X API
中重新使用了这个名字,以避免注册新商标的延误。- 在开发
iPhone
时,史蒂夫-乔布斯不希望非苹果开发者建立原生iPhone
应用程序。他们应该满足于为Safari
制作网络应用。这一立场因开发者的反响而改变,iPhone SDK
于2008年3月6日发布。
SwiftUI vs. UIKit¶
虽然你只用了SwiftUI
来创建HIITFit
,但UIKit
有很多资源可以帮助你为你的应用添加功能,或者微调它的外观和功能。
最受欢迎的情节¶
正如你在本书第3节所看到的,"SwiftUI vs. UIKit"(bit.ly/2PGuNFy)是raywenderlich.com
上最受欢迎的免费节目。由Ray
亲自主讲,值得一看,但这里有一个TL;DW
摘要。
Note
和本网站的很多内容一样,这一集是针对想在iOS
应用开发公司工作的人。如果这不是你,请跳到下一节。另外,这是2019年的一集。有一个较新的,但它还没有时间积累浏览量来超越原来的。
使用UIKit
的开发者仍然多于SwiftUI
的三个原因:
SwiftUI
只适用于iOS 13
或更高版本。一些公司仍然需要支持iOS 12
或更早的版本,所以他们还不能切换到SwiftUI
。SwiftUI
仍然没有UIKit
那么成熟。苹果在2008年发布了UIKit
,它建立在来自NeXTSTEP
的macOS AppKit
之上,所以有很多时间来把事情做好。SwiftUI
仍然有缺失的功能或粗糙的边缘,所以一些公司希望给SwiftUI
多一点时间来成熟。- 许多公司已经用
UIKit
编写了他们的应用程序,在这个时候用SwiftUI
重写整个东西简直是太累了,所以很多旧的UIKit
遗留代码会保留下来。
问:你应该学习哪个?SwiftUI还是UIKit?
答:如果你真的想成为一名专业的iOS
开发者,我们的建议是同时学习SwiftUI
和UIKit
。如果你最终在一家已经发布了iOS
应用的公司工作,很有可能是用UIKit
做的。因此,如果你想在这些公司中工作,对你来说,能够使用这些代码库也很重要。我们创建了一个特殊的可选学习路径,叫做"iOS User Interfaces with UIKit"
(bit.ly/2OaK4ye)。如果你需要为你的工作学习UIKit
开发,你肯定应该去看看。但如果你只关心SwiftUI
,你可以安全地跳过它。
这并不是全有或全无:你有可能用SwiftUI
制作你的应用程序的某一部分,而用UIKit
制作其他部分。随着公司开始从UIKit
过渡到SwiftUI
,我们预计在未来几年会看到许多代码库同时混合了SwiftUI
和UIKit
的代码。
谢谢你,Ray
! 这是进入下一节的完美过渡...
整合新的和旧的¶
苹果总是为开发者提供支持,让他们过渡到新事物。Carbon API
使开发者能够将"经典"的Mac OS
应用移植到OS X
。桥接头文件使开发者能够在Swift
应用中使用Objective-C
代码,反之亦然。
开发人员仍然可以在没有Swift
的情况下创建Objective-C
应用,在没有SwiftUI
的情况下创建Swift
应用。UIKit
比SwiftUI
有更多的功能,对用户界面元素的外观和操作提供了更多的控制。
但是没有FOMO
(害怕错过)! 你可以在你的SwiftUI
应用程序中使用UIKit
视图。
你将在第17章"与UIKit
交互"中使用新的PHPickerViewController
,在第21章"愉悦的用户体验--最后的修饰"中使用UIActivityViewController
。
在第22章"列表和导航"中,你将用UINavigationBarAppearance
和UISegmentedControl.appearance()
来控制导航条和分段控件的外观。
使用UIColor
来访问系统和UI
元素的颜色也非常容易,你可以从UIImage
创建一个Image
视图。
Apple Developer¶
尽管史蒂夫-乔布斯最初的意图是,苹果希望每个人都能成为苹果开发者。你的需求和兴趣可能被其他几个人或很多人分享。但也许不是专业的iOS开发者。如果你创建了一个你需要或想要的应用程序,它也会成为其他这些人可用的。如果你的应用程序使用一些只在最新的苹果小工具上工作的技术,那就更好了,所以他们必须升级才能使用你的应用程序。;]
所以苹果公司在developer.apple.com提供了大量的资源来帮助你成为一个开发者并保持最新的状态。
- 文档在apple.co/3v9YVcL和Xcode的
Help ▸ Developer Documentation
(Shift-Command-0
) - 人机界面指南在apple.co/3cgQJPk 和
Xcode
的Help ▸ Human Interface Guidelines
(Shift-Command-H
)
WWDC¶
每年六月,苹果公司都会举行为期五天的全球开发者大会。第一天的主题演讲展示了iOS
、macOS
和所有其他操作系统的新版本的所有功能计划。这些功能在今年晚些时候推出,大约在9月或10月。
对于iOS
开发者来说,更重要的演讲是第2天的"平台状况",在那里你可以第一次看到用于将这些新功能添加到你的应用程序的API
,以及对Xcode
等开发工具的改进。在这一周的其余时间里,你可以观看介绍和深入研究新功能的演讲。
苹果公司提供了多平台的苹果开发者应用程序(apple.co/3eoIfs1),你可以在这里查看WWDC
视频,并将你的最爱加入书签或下载。
如果你是苹果开发者计划的付费会员,你可以下载Xcode
和操作系统的测试版本,并立即开始探索所有的新事物。你的目标是在新的或现有的应用程序中包含新的功能,所有这些都将在新的iOS推出时进入App Store
。
有一点需要注意的是。WWDC
的演讲者使用了一个特殊的内部版本的Xcode
。它与你可以下载的Xcode
测试版不同,所以你在演讲中看到的所有东西在测试版1中并不适用。或者测试版2。或者永远不会。当苹果发布最终版本时,API
的细节经常发生变化,一些承诺的功能会悄然消失。
Platforms¶
使用SwiftUI
来构建新的iOS
应用程序,使其更容易在苹果的其他平台上创建类似的应用程序:macOS
、watchOS
和tvOS
。这并不是说你的iOS
应用会在另一个平台上"正常运行"。它可能不会。
你可以在其他平台上使用许多SwiftUI
视图,但它们的外观或功能可能会有一些不同。而且其他平台的视图在iOS
上是不存在的。另外,你的iOS
应用的一些功能在tvOS
这样的固定平台或watchOS
这样的小屏幕上是没有意义的。
无论你的目标是哪个平台,你组装SwiftUI
应用的方式都是一样的。苹果是这样表述的。只需学习一次,就能在任何地方应用。
Mac Catalyst
是苹果公司的程序,使其更容易从iPad
应用程序创建一个本地Mac
应用程序。你在iPad
应用程序的项目设置中打开Mac Catalyst
,然后修改用户界面,使之更像Mac
。一些iPad
的UI
元素不太适合Mac
的用户体验,而一些iPad
框架在macOS
中是不可用的。你的代码使用这个编译器指令来控制包括什么。
#if targetEnvironment(macCatalyst)
...
#endif
请看苹果公司的Mac Catalyst
教程(apple.co/3qPaen7)。要想更深入地了解,请浏览我们的《Catalyst by Tutorials》)。
Note
Apple Silicon
怎么样?这是苹果公司设计和制造自己的Mac
处理器的计划。自1984年推出以来,Mac
已经使用了摩托罗拉68000
、PowerPC
和英特尔CPU
芯片。苹果M1
芯片将苹果的新CPU
与它的新GPU
、神经引擎等整合在一起。你可以在Apple Silicon``Mac
上安装Rosetta 2
,运行为英特尔Mac
编写的应用程序。
Frameworks¶
SDK
有很多框架,而且苹果每年都会增加新的框架。每个应用程序需要的都是原始Cocoa
的现代化版本。
Core Data
或其他一些数据库技术用于数据持久性。- 用于用户界面的
SwiftUI
和/或UIKit
。 - 处理和协调数据和视图的基础。
Note
Core Data
是一个庞大的话题,如果你想了解更多,我们有一本书《核心数据教程》(bit.ly/39lo2k3)和视频课程《初级核心数据》(bit.ly/2OGjuwG)和《中级核心数据》(bit.ly/3bE2H6z)来帮助你前进。
本书中的应用程序都使用了这些框架。
在HIITFit
和RWFreeView
中,AVKit
用于VideoPlayer
中的AVPlayer
:
在第17章"与UIKit接口"中,PhotosUI
用于PHPickerViewController
:
在第17章的挑战中,PencilKit
为PKCanvasView
:
在第26章"Widgets
"中,WidgetKit
可以创建Widge`ts:
接下来的这两个框架很重要,但超出了本书的范围:
Accessibility
:关注可访问性是增加应用程序受众的最简单方法之一。参见《SwiftUI教程》第12章"Accessibility
"(bit.ly/32oFTCs)和我们的三部分教程《SwiftUI中的iOS可访问性教程》(从bit.ly/2WYD9sI开始)。Combine
:你在第6章"为你的应用程序添加功能"中使用了一个Timer
发布器,但关于Combine
还有很多东西需要学习。这个新的框架是对iOS应用程序处理并发的方式的一个重大改变。见Combine
。Swift
中的异步编程(bit.ly/3l7VqPq)和视频课程Combine
在iOS
中的响应式编程(bit.ly/3rGsL6D)。
你可能想要探索其他一些框架。
MapKit
为你的应用程序添加地图、用户位置、路线或覆盖视图:
WatchKit
为Apple Watch
创建应用程序。请关注我们的《watchOS教程》一书中的更新。
ARKit
用于增强现实。请看苹果增强现实教程(bit.ly/3tabJxZ)和我们的视频课程"初学ARKit
"(bit.ly/3qJ2a7n)。为苹果的混合现实头盔做好准备,预计在2022年中期(bit.ly/38rEE8K)。
在apple.co/3rwyxrj探索所有技术:
而且你可以在苹果开发者应用程序中浏览特定框架的视频:
能力¶
许多框架都是为了给你的应用程序添加特殊功能。苹果将这些功能称为能力。
➤ 要查看能力列表,请打开您的一个Xcode
项目或创建一个新项目。在项目页面上,选择一个目标,单击签名和能力选项卡,然后单击+
能力:
你将在第26章"小部件"中使用应用程序组在你的应用程序和其小部件之间共享数据。
如果你不在苹果开发者计划中,你只能将这些功能中的一部分添加到你的应用程序中。它们列在本页面的第三栏。[apple.co/3rOhlNW](https://developer.apple.com/support/app-capabilities/)。
➤ 向下滚动页面以查看如果加入苹果开发者计划可以添加的所有功能。
开发者计划¶
那么,什么是三种类型的开发者?
苹果开发者:
- 没有年费。
- 可以访问文档和视频。
- 免费提供在您的设备上安装
Xcode
项目。Xcode
创建了一个供应配置文件,让您安装一些应用程序。配置文件在七天后过期,因此这些应用程序将停止在您的设备上运行。只需删除配置文件并重新安装您的应用程序。
苹果开发者计划(apple.co/3emR2ur)。
- 年费大约相当于你的货币
99
美元。 - 可以使用测试版操作系统和应用程序。
- 用于管理你的证书、标识符和配置文件的网络界面。
- 访问
App Store Connect
。通过TestFlight
向测试人员分发您的测试版应用程序;向App Store
提交您的应用程序。 - 在虚拟
WWDC
期间:你可以申请实验室预约或向苹果工程师发布有关WWDC
内容的论坛问题。当亲身参与的WWDC
恢复时,你可以注册参加门票抽奖。
如果你在App Store
中有应用,但你没有更新你的会员资格怎么办?这里是苹果的答案:
过期的会员资格:如果您的Apple Developer Program
会员资格过期,您的应用程序将不再可供下载,您将无法提交新的应用程序或更新。您将失去对预发布软件、证书、标识符和配置文件以及技术支持事件的访问。
苹果企业计划是为那些只想向员工分发应用程序的公司准备的。费用为每年299
美元或同等金额。企业应用程序不提交给App Store
,因此不必遵守苹果的要求。但有很多法律要求(apple.co/3coUHVU),使用TestFlight
可能更容易。
应用程序分发¶
让你的应用程序进入App Store
的实际程序每年都有一些变化。苹果公司的文档可能很混乱。
请查看我们的《iOS应用发布与最佳实践》(bit.ly/3al3Hez)或视频课程《发布到App Store》(bit.ly/3tckW8Z)。
内务管理和故障排除¶
希望你在创建HIITFit
时没有遇到任何问题。Xcode
的错误和警告信息通常是有帮助的,但有时它们就是错误的。一开始,你不能确定这是否是你需要解决的问题,但是,随着你经验的增加,你会对Xcode
的错误或困惑有一个感觉。它确实发生了。当这种情况发生在iOS
开发者身上时,他们做的第一件事就是清理构建文件夹。继续阅读以了解这其中的内容。
DerivedData/Build
¶
Xcode
在~/Library/Developer/Xcode
中维护了很多文件。特别值得注意的是DerivedData
,在这里Xcode
为你曾经创建或打开的每个项目创建了一个文件夹。这是Xcode
存储中间的构建结果、索引和日志的地方。
找到您项目的衍生数据文件夹的最简单方法是使用新的Xcode
菜单项Reveal Build Products Folder
。
➤ 打开您的一个Xcode
项目或创建一个新项目。如果是新的,按Command-B
或刷新预览来构建它。然后选择Product ▸ Reveal Build Products Folder
:
➤ 在Finder
列视图中,向左滚动以看到DerivedData
中项目的文件夹:
文件夹名称以你的项目名称开头,后面是一个哈希值。
➤ 选择此文件夹,然后以列表形式查看,并打开Build
文件夹:
➤ 打开Intermediates.noindex
,通过其.build
、Debug
和.build
文件夹向下钻,找到Objects-normal/x86_64
,或者,对于你们这些幸运的M1
所有者,找到arm64
:
➤ 双击x86_64
或arm64
来打开它,然后对修改日期进行排序:
➤ 注意ContentView.o
的位置和时间戳。
➤ 在Xcode
中,对ContentView.swift
进行修改,按Command-B
键重建,然后在x86_64
或arm64
中查看ContentView.o
:
Xcode
更新了大约一半的文件,包括大部分的ContentView
文件。Xcode
重新编译了ContentView.swift
,但没有编译HousekeepingApp.swift
。它知道(大多数时候)哪些文件已经改变,不会重新编译没有改变的文件。但是有时候,这个系统会出问题,Xcode
会抱怨那些正确的代码,或者无缘无故出现奇怪的错误。那么就需要清理构建文件夹了。
➤ 在Xcode
中,按Shift-Command-K
或从Xcode
菜单中选择Product ▸ Clean Build Folder
:
这个命令删除了项目Build
文件夹中的所有内容,给你一个全新的开始。
DerivedData/Index
¶
Index
文件夹存储了Xcode
用于搜索、Open Quickly
和重构的数据。同样,有时索引会被混淆,导致奇怪的Xcode
行为。没有菜单命令来删除索引。你只需要删除整个派生数据文件夹并让Xcode
重新创建它。
➤ 按Command-up-arrow
键回到你的派生数据文件夹,或者在路径栏中双击其名称:
➤ 在Finder
中,按Command-delete
删除整个文件夹,然后在Xcode
中,按Command-B
重新建立:
Xcode创建了一个新的派生数据文件夹,名称相同。
当Xcode
表现得很奇怪的时候¶
Xcode
是一个非常复杂的应用程序,有时它需要一个提示或更强大的东西来"清除它的头脑"。
以下是大多数开发者所遵循的干预的升级级别:
- 清理建设文件夹。
- 删除项目的
DerivedData
文件夹。 - 重新启动
Xcode
。 - 重新启动
Mac
。
很奇怪但却是事实。删除早期版本的Xcode
可以解决一些奇怪的问题,比如在编辑器中没有颜色编码或Command-/
不工作。
重新获得磁盘空间¶
奇怪的Xcode
行为并不是删除衍生数据文件夹的唯一原因。在你完成一个项目的工作后很久--甚至删除它--它的派生数据文件夹仍然存在,占用磁盘空间。许多开发者每隔一个月左右就会例行删除整个DerivedData
文件夹,回收数千兆字节的空间。如果你的磁盘空间不足,它肯定是你应该首先查看的地方。
Command-delete
只是把它移到垃圾箱,在那里它仍然会占用空间。要想真正删除这个文件夹,你可以在终端输入这个命令:
rm -rf ~/Library/Developer/Xcode/DerivedData/
或者,如果你正在运行Big Sur
,你可以打开垃圾箱,有选择地删除该文件夹。但Big Sur
的存储管理提供了一个更简单的方法来清除更多的空间。
➤ 在苹果菜单中,选择"关于此Mac
",然后点击"存储"。然后点击管理并选择开发者。选择Xcode Caches
和Project Build Data and Indexes
,然后单击Delete...
向社区寻求帮助¶
SwiftUI
的错误信息可能很神秘。如果你收到一条错误信息,却不知道它要你做什么,请选择整个信息,然后从右键菜单中选择"用谷歌搜索"。
许多搜索结果将是Stack Overflow
或苹果开发者论坛的问题,希望能有答案。
还可以查看raywenderlich.com
论坛(bit.ly/3rHLXRj)和Discord
(bit.ly/3lajOjf)。
raywenderlich.com团队和成员是一个了不起的资源,但也有一个庞大的全球iOS开发者社区。他们几乎都很友好,很热情,而且对他们的时间和专业知识很慷慨。
加入这个社区的一个简单途径是在Twitter上关注@codeine_coding并参加他每月的#iOSDevHappyHour活动:
关键点¶
SwiftUI
是一种建立在Swift
基础上的特定领域语言,是一种比Objective-C
更快、更安全的编程语言。SwiftUI vs. UIKit
是raywenderlich.com
上最受欢迎的免费节目,回答了一个大问题。你应该学习哪个?- 你可以在你的
SwiftUI
应用程序中使用UIKit
视图和视图控制器。 - 苹果公司提供了大量的资源来帮助你成为一名开发者并保持最新:在网站和
Xcode
中可以找到文档和人机界面指南。使用苹果开发者应用程序来观看WWDC
视频。 SDK
有很多框架,许多框架用于向你的应用程序添加特殊功能(能力)。- 苹果开发者计划的成员可以添加所有的功能,还可以提前获得测试版操作系统和开发者工具。而且只有会员才能充分参与
WWDC
。 Xcode
将中间的构建结果、索引和日志存储在您项目的衍生数据文件夹中。有时您需要清理构建文件夹或删除整个派生数据文件夹。为了回收磁盘空间,定期删除整个DerivedData
目录。