跳转至

第12章:苹果应用开发生态系统

在你继续构建本书的另外两个应用程序之前,这里还有一个概述章节。

在构建HIITFit的时候,你学到了很多关于XcodeSwiftSwiftUI的细节。在上一章中,你得到了一种"阳台视角",即各种属性封装器如何帮助你管理应用程序的数据状态。本章提供了整个苹果应用开发生态系统的鸟瞰图,解开了你在iOS开发者聚在一起聊天时可能听到的许多术语的神秘感。你将开始建立自己的心智模型,了解所有部分是如何结合在一起的,为苹果每年增加的所有新东西创建自己的框架。

SwiftUI的简要历史

你一直在使用SwiftUI构建HIITFit,但这只是苹果公司最新的应用开发范式。

苹果在2019年6月的全球开发者大会上宣布了SwiftUISwiftUI建立在苹果于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电脑公司。

A brief history of SwiftUI

Objective-C编写的NeXTSTEP操作系统构成了2001年发布的Mac OS X的基础。苹果为开发者提供了Cocoa API,以便为OS X创建应用程序。Cocoa由三个反映Model-View-Controller原则的框架组成:Core DataAppKitFoundationAppKitFoundation中的NS前缀是对其NeXTSTEP遗产的认可。

苹果在2007年发布了iPhone,并在2008年发布了iPhone SDK(软件开发工具包)。这包括Cocoa TouchUIKit取代了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的三个原因:

  1. SwiftUI只适用于iOS 13或更高版本。一些公司仍然需要支持iOS 12或更早的版本,所以他们还不能切换到SwiftUI
  2. SwiftUI仍然没有UIKit那么成熟。苹果在2008年发布了UIKit,它建立在来自NeXTSTEPmacOS AppKit之上,所以有很多时间来把事情做好。SwiftUI仍然有缺失的功能或粗糙的边缘,所以一些公司希望给SwiftUI多一点时间来成熟。
  3. 许多公司已经用UIKit编写了他们的应用程序,在这个时候用SwiftUI重写整个东西简直是太累了,所以很多旧的UIKit遗留代码会保留下来。

SwiftUI or UIKit?

问:你应该学习哪个?SwiftUI还是UIKit?

答:如果你真的想成为一名专业的iOS开发者,我们的建议是同时学习SwiftUIUIKit。如果你最终在一家已经发布了iOS应用的公司工作,很有可能是用UIKit做的。因此,如果你想在这些公司中工作,对你来说,能够使用这些代码库也很重要。我们创建了一个特殊的可选学习路径,叫做"iOS User Interfaces with UIKit"(bit.ly/2OaK4ye)。如果你需要为你的工作学习UIKit开发,你肯定应该去看看。但如果你只关心SwiftUI,你可以安全地跳过它。

这并不是全有或全无:你有可能用SwiftUI制作你的应用程序的某一部分,而用UIKit制作其他部分。随着公司开始从UIKit过渡到SwiftUI,我们预计在未来几年会看到许多代码库同时混合了SwiftUIUIKit的代码。

谢谢你,Ray! 这是进入下一节的完美过渡...

整合新的和旧的

苹果总是为开发者提供支持,让他们过渡到新事物。Carbon API使开发者能够将"经典"的Mac OS应用移植到OS X。桥接头文件使开发者能够在Swift应用中使用Objective-C代码,反之亦然。

开发人员仍然可以在没有Swift的情况下创建Objective-C应用,在没有SwiftUI的情况下创建Swift应用。UIKitSwiftUI有更多的功能,对用户界面元素的外观和操作提供了更多的控制。

但是没有FOMO(害怕错过)! 你可以在你的SwiftUI应用程序中使用UIKit视图。

Integrating a UIKit view

你将在第17章"与UIKit交互"中使用新的PHPickerViewController,在第21章"愉悦的用户体验--最后的修饰"中使用UIActivityViewController

UIActivityViewController in Cards app

在第22章"列表和导航"中,你将用UINavigationBarAppearanceUISegmentedControl.appearance()来控制导航条和分段控件的外观。

Using UIKit to control appearances

使用UIColor来访问系统和UI元素的颜色也非常容易,你可以从UIImage创建一个Image视图。

Apple Developer

尽管史蒂夫-乔布斯最初的意图是,苹果希望每个人都能成为苹果开发者。你的需求和兴趣可能被其他几个人或很多人分享。但也许不是专业的iOS开发者。如果你创建了一个你需要或想要的应用程序,它也会成为其他这些人可用的。如果你的应用程序使用一些只在最新的苹果小工具上工作的技术,那就更好了,所以他们必须升级才能使用你的应用程序。;]

所以苹果公司在developer.apple.com提供了大量的资源来帮助你成为一个开发者并保持最新的状态。

  • 文档在apple.co/3v9YVcL和Xcode的Help ▸ Developer Documentation(Shift-Command-0)
  • 人机界面指南在apple.co/3cgQJPkXcodeHelp ▸ Human Interface Guidelines(Shift-Command-H)

WWDC

每年六月,苹果公司都会举行为期五天的全球开发者大会。第一天的主题演讲展示了iOSmacOS和所有其他操作系统的新版本的所有功能计划。这些功能在今年晚些时候推出,大约在9月或10月。

对于iOS开发者来说,更重要的演讲是第2天的"平台状况",在那里你可以第一次看到用于将这些新功能添加到你的应用程序的API,以及对Xcode等开发工具的改进。在这一周的其余时间里,你可以观看介绍和深入研究新功能的演讲。

苹果公司提供了多平台的苹果开发者应用程序(apple.co/3eoIfs1),你可以在这里查看WWDC视频,并将你的最爱加入书签或下载。

Apple Developer app

如果你是苹果开发者计划的付费会员,你可以下载Xcode和操作系统的测试版本,并立即开始探索所有的新事物。你的目标是在新的或现有的应用程序中包含新的功能,所有这些都将在新的iOS推出时进入App Store

有一点需要注意的是。WWDC的演讲者使用了一个特殊的内部版本的Xcode。它与你可以下载的Xcode测试版不同,所以你在演讲中看到的所有东西在测试版1中并不适用。或者测试版2。或者永远不会。当苹果发布最终版本时,API的细节经常发生变化,一些承诺的功能会悄然消失。

Platforms

使用SwiftUI来构建新的iOS应用程序,使其更容易在苹果的其他平台上创建类似的应用程序:macOSwatchOStvOS。这并不是说你的iOS应用会在另一个平台上"正常运行"。它可能不会。

你可以在其他平台上使用许多SwiftUI视图,但它们的外观或功能可能会有一些不同。而且其他平台的视图在iOS上是不存在的。另外,你的iOS应用的一些功能在tvOS这样的固定平台或watchOS这样的小屏幕上是没有意义的。

无论你的目标是哪个平台,你组装SwiftUI应用的方式都是一样的。苹果是这样表述的。只需学习一次,就能在任何地方应用。

Mac Catalyst是苹果公司的程序,使其更容易从iPad应用程序创建一个本地Mac应用程序。你在iPad应用程序的项目设置中打开Mac Catalyst,然后修改用户界面,使之更像Mac。一些iPadUI元素不太适合Mac的用户体验,而一些iPad框架在macOS中是不可用的。你的代码使用这个编译器指令来控制包括什么。

#if targetEnvironment(macCatalyst)
...
#endif

请看苹果公司的Mac Catalyst教程(apple.co/3qPaen7)。要想更深入地了解,请浏览我们的《Catalyst by Tutorials》)。

Note

Apple Silicon怎么样?这是苹果公司设计和制造自己的Mac处理器的计划。自1984年推出以来,Mac已经使用了摩托罗拉68000PowerPC和英特尔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)来帮助你前进。

本书中的应用程序都使用了这些框架。

HIITFitRWFreeView中,AVKit用于VideoPlayer中的AVPlayer

AVKit for AVPlayer in VideoPlayer

在第17章"与UIKit接口"中,PhotosUI用于PHPickerViewController

PhotosUI for photo picker

在第17章的挑战中,PencilKitPKCanvasView

Using PencilKit to create a canvas

在第26章"Widgets"中,WidgetKit可以创建Widge`ts:

Using WidgetKit to create widgets

接下来的这两个框架很重要,但超出了本书的范围:

  • Accessibility:关注可访问性是增加应用程序受众的最简单方法之一。参见《SwiftUI教程》第12章"Accessibility"(bit.ly/32oFTCs)和我们的三部分教程《SwiftUI中的iOS可访问性教程》(从bit.ly/2WYD9sI开始)。
  • Combine:你在第6章"为你的应用程序添加功能"中使用了一个Timer发布器,但关于Combine还有很多东西需要学习。这个新的框架是对iOS应用程序处理并发的方式的一个重大改变。见CombineSwift中的异步编程(bit.ly/3l7VqPq)和视频课程CombineiOS中的响应式编程(bit.ly/3rGsL6D)。

你可能想要探索其他一些框架。

MapKit为你的应用程序添加地图、用户位置、路线或覆盖视图:

Popular MapKit tutorials

WatchKitApple Watch创建应用程序。请关注我们的《watchOS教程》一书中的更新。

ARKit用于增强现实。请看苹果增强现实教程(bit.ly/3tabJxZ)和我们的视频课程"初学ARKit"(bit.ly/3qJ2a7n)。为苹果的混合现实头盔做好准备,预计在2022年中期(bit.ly/38rEE8K)。

Apple Augmented Reality by Tutorials

apple.co/3rwyxrj探索所有技术:

Apple Developer Technologies filtered for ’data’

而且你可以在苹果开发者应用程序中浏览特定框架的视频:

Apple Developer app: Videos classified by framework

能力

许多框架都是为了给你的应用程序添加特殊功能。苹果将这些功能称为能力。

➤ 要查看能力列表,请打开您的一个Xcode项目或创建一个新项目。在项目页面上,选择一个目标,单击签名和能力选项卡,然后单击+能力:

Capabilities

你将在第26章"小部件"中使用应用程序组在你的应用程序和其小部件之间共享数据。

如果你不在苹果开发者计划中,你只能将这些功能中的一部分添加到你的应用程序中。它们列在本页面的第三栏。[apple.co/3rOhlNW](https://developer.apple.com/support/app-capabilities/)。

Capabilities Available to Developers

➤ 向下滚动页面以查看如果加入苹果开发者计划可以添加的所有功能。

开发者计划

那么,什么是三种类型的开发者?

苹果开发者:

  • 没有年费。
  • 可以访问文档和视频。
  • 免费提供在您的设备上安装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

Show .app file in Finder.

➤ 在Finder列视图中,向左滚动以看到DerivedData中项目的文件夹:

Scroll left in Finder.

文件夹名称以你的项目名称开头,后面是一个哈希值。

➤ 选择此文件夹,然后以列表形式查看,并打开Build文件夹:

Open Build folder.

➤ 打开Intermediates.noindex,通过其.buildDebug.build文件夹向下钻,找到Objects-normal/x86_64,或者,对于你们这些幸运的M1所有者,找到arm64

Locate x86_64 or arm64 folder.

➤ 双击x86_64arm64来打开它,然后对修改日期进行排序:

Sort x86_64 or arm64 by Date Modified.

➤ 注意ContentView.o的位置和时间戳。

➤ 在Xcode中,对ContentView.swift进行修改,按Command-B键重建,然后在x86_64arm64中查看ContentView.o

Build after code change

Xcode更新了大约一半的文件,包括大部分的ContentView文件。Xcode重新编译了ContentView.swift,但没有编译HousekeepingApp.swift。它知道(大多数时候)哪些文件已经改变,不会重新编译没有改变的文件。但是有时候,这个系统会出问题,Xcode会抱怨那些正确的代码,或者无缘无故出现奇怪的错误。那么就需要清理构建文件夹了。

➤ 在Xcode中,按Shift-Command-K或从Xcode菜单中选择Product ▸ Clean Build Folder

Empty Build folder

这个命令删除了项目Build文件夹中的所有内容,给你一个全新的开始。

DerivedData/Index

Index文件夹存储了Xcode用于搜索、Open Quickly和重构的数据。同样,有时索引会被混淆,导致奇怪的Xcode行为。没有菜单命令来删除索引。你只需要删除整个派生数据文件夹并让Xcode重新创建它。

➤ 按Command-up-arrow键回到你的派生数据文件夹,或者在路径栏中双击其名称:

Go to derived data folder.

➤ 在Finder中,按Command-delete删除整个文件夹,然后在Xcode中,按Command-B重新建立:

New derived data folder

Xcode创建了一个新的派生数据文件夹,名称相同。

Xcode表现得很奇怪的时候

Xcode是一个非常复杂的应用程序,有时它需要一个提示或更强大的东西来"清除它的头脑"。

以下是大多数开发者所遵循的干预的升级级别:

  1. 清理建设文件夹。
  2. 删除项目的DerivedData文件夹。
  3. 重新启动Xcode
  4. 重新启动Mac

很奇怪但却是事实。删除早期版本的Xcode可以解决一些奇怪的问题,比如在编辑器中没有颜色编码或Command-/不工作。

重新获得磁盘空间

奇怪的Xcode行为并不是删除衍生数据文件夹的唯一原因。在你完成一个项目的工作后很久--甚至删除它--它的派生数据文件夹仍然存在,占用磁盘空间。许多开发者每隔一个月左右就会例行删除整个DerivedData文件夹,回收数千兆字节的空间。如果你的磁盘空间不足,它肯定是你应该首先查看的地方。

Command-delete只是把它移到垃圾箱,在那里它仍然会占用空间。要想真正删除这个文件夹,你可以在终端输入这个命令:

rm -rf ~/Library/Developer/Xcode/DerivedData/

或者,如果你正在运行Big Sur,你可以打开垃圾箱,有选择地删除该文件夹。但Big Sur的存储管理提供了一个更简单的方法来清除更多的空间。

➤ 在苹果菜单中,选择"关于此Mac",然后点击"存储"。然后点击管理并选择开发者。选择Xcode CachesProject Build Data and Indexes,然后单击Delete...

Big Sur Developer storage management

向社区寻求帮助

SwiftUI的错误信息可能很神秘。如果你收到一条错误信息,却不知道它要你做什么,请选择整个信息,然后从右键菜单中选择"用谷歌搜索"。

许多搜索结果将是Stack Overflow或苹果开发者论坛的问题,希望能有答案。

还可以查看raywenderlich.com论坛(bit.ly/3rHLXRj)和Discordbit.ly/3lajOjf)。

raywenderlich.com团队和成员是一个了不起的资源,但也有一个庞大的全球iOS开发者社区。他们几乎都很友好,很热情,而且对他们的时间和专业知识很慷慨。

加入这个社区的一个简单途径是在Twitter上关注@codeine_coding并参加他每月的#iOSDevHappyHour活动:

iOS Dev Happy Hour

关键点

  • SwiftUI是一种建立在Swift基础上的特定领域语言,是一种比Objective-C更快、更安全的编程语言。
  • SwiftUI vs. UIKitraywenderlich.com上最受欢迎的免费节目,回答了一个大问题。你应该学习哪个?
  • 你可以在你的SwiftUI应用程序中使用UIKit视图和视图控制器。
  • 苹果公司提供了大量的资源来帮助你成为一名开发者并保持最新:在网站和Xcode中可以找到文档和人机界面指南。使用苹果开发者应用程序来观看WWDC视频。
  • SDK有很多框架,许多框架用于向你的应用程序添加特殊功能(能力)。
  • 苹果开发者计划的成员可以添加所有的功能,还可以提前获得测试版操作系统和开发者工具。而且只有会员才能充分参与WWDC
  • Xcode将中间的构建结果、索引和日志存储在您项目的衍生数据文件夹中。有时您需要清理构建文件夹或删除整个派生数据文件夹。为了回收磁盘空间,定期删除整个DerivedData目录。