在本教程中,您将在iOS 中为创建自定义日历控件中的开发人员的日历控件提取到一个单独的可重用框架中。在过程中,您将:
- 为CalendarControl*创建一个新框架。
- 迁移现有代码。
- 将所有内容导入应用程序。
- 创建一个框架,XCFramework
- 它把打包成一个便携的Swift超级包。
- 为您的 Swift 包设置一个存储库并发布它。
完成后,在您使用开发的便携式应用程序运行时,XCFramework 程序将像以前一样
入门
使用本教程底部底部的“下载材料”按钮或下载最初和最终项目。找到项目文件夹。找到RWCalendarPickerUI并打开RWCalendarPicker.xcodeproj。
RWCalendarPicker是一个类似的提醒清单应用程序,可以让用户创建任务并设置截止日期。
构建并运行以了解其工作原理。
01.gif查看RWCalendarPicker中的文件以该项目为主。CalendarControl的代码分为几个类:
- Day.swift:一个数据模型,其中包含每天对象的数据。
- MonthMetadata.swift:最近的数据模型。
- CalendarDateCollectionViewCell.swift:使用集合视图中的单元格显示一个月中的天数。每个单元格都是在这里定制的。
- CalendarPickerFooterView.swift:让用户选择不同的月份。
- CalendarPickerHeaderView:当前显示月份和年份,swift用户关闭选择器并显示日期标签。
- CalendarPickerViewController.swift:所有相关视图组合小说的日历主体。
什么是框架?
框架是独立的、可重复使用的代码和资源块,您可以将其导入到许多应用程序中。您甚至可以在 iOS、tvOS、watchOS 和 macOS 应用程序之间共享。当与 Swift 的访问控制结合时使用时,框架在代码模块之间定义强大的、可测试的接口。
框架有三个主要目的:
- 封装代码
- 代码初始化
- 重用代码
如果你使用其他语言编程,你可能听说过节点模块、包、gem 或 jars。框架相当于 Apple 生态系统中的框架。SDK 中的一些常见 iOS 框架示例包括Foundation、UIKit、SwiftUI、CloudKit和Combine。
用 Swift 的话说,模块是一组编译后的代码,它们部署在上面。框架是一种模块,而应用程序是另一种。
创建框架
在 Xcode 中,Apple 引入了 Cocoa Touch 框架,最近将其创建框架如此简单的创建项目。首先,更改框架为您创建框架。
在 Xcode 中,选择File ▸ New ▸ Project...。然后选择iOS ▸ Framework & Library ▸ Framework。
02.png单击下一步,然后将产品名称设置为CalendarControl。使用您自己的组织名称和组织名称。
03.png点击下一步。在文件选择中,选择在2-Framework创建项目。然后点击创建。
你现在有一个项目,虽然很无聊,但它创建了一个框架!
将源代码添加到框架中
您当前的状态是一个没有的框架。这与不加糖的纯巧克力一样吸引人。在本节中,您将通过将现有文件添加到框架来介绍代码。
RWCalendarPicker ,将Day.swift拖到Xcode中的CalendarControl项目中。,智力。
04.gif仔细检查Day.swift在CalendarControl中是否有Target Membership,以确保它出现在最终框架中。通过选择此文件并确保在File inspectors的Target Membership区域中选择CalendarControl来验证这一点。
现在,按照上述步骤将这些文件添加到您的项目中:
- MonthMetadata.swift
- CalendarDateCollectionViewCell.swift
- CalendarPickerFooterView.swift
- CalendarPickerHeaderView.swift
- CalendarPickerViewController.swift
将类代码分开它们的组中,这是组织到必须自己注意的,但好习惯。
在项目导航器中选择您的项目,然后在Targets中选择CalendarControl。打开设置。然后将Build Libraries for Distribution设置为y。这会生成一个接口模块文件,当Xcode中有人定义时跳转到您的模块时,该文件会显示您的公共 API。
06.png制造框架项目。确保您在没有制造警告或错误的情况下获得制造成功。
将框架添加到项目
您已关闭日历控件。返回到日历中的日历框架到现在的纸框架中,不再需要项目中的迁移文件。删除。在确认中选择至废篓。
- Day.swift
- MonthMetadata.swift
- CalendarDateCollectionViewCell.swift
- CalendarPickerFooterView.swift
- CalendarPickerHeaderView.swift
- CalendarPickerViewController.swift
项目。您看到看到几个可预见的消息的错误,Xcode 会显示会在不知道CalendarPickerViewController
是什么。具体来说,您创建的范围错误中找不到“CalendarPickerViewController”。
您将通过添加CalendarControl框架项目来解决这些问题。
嵌入你的文件
现在,点击点击项目导航器中的节点RWCalendarPicker根。点击将文件添加到“RWCalendarPicker”。
在文件选择器中,导航到2-Framework/CalendarControl并选择CalendarControl.xcodeproj。然后单击添加将其添加为子项目。
08.gif注意:将框架项目添加到应用程序中自己需要的。您可以添加CalendarControl.framework输出。
结合这些项目,可以同时更新框架和应用程序。您对框架和应用程序进行开发部署的任何项目都可以使用。
构建并运行。你会看到同样的编译错误!
09.png即使这两个项目现在,RWCalendarPicker仍然没有拥有CalendarControl。就像他们坐在同一个房间里,但是RWCalendarPicker看不到新框架。
请按照以下步骤解决问题:
- 将更改为CalendarControl并制造它。
- 然后,以CalendarControl项目查看产品文件夹。
- 在下面寻找它。该文件是框架控制和日历代码、资源数据的框架项目的输出。
- 然后选择顶级RWCalendarPicker节点以打开项目编辑器。
- 点击RWCalendarPicker目标。然后转到定期选项卡。
- 下面到框架、库和嵌入内容部分。
- 将CalendarControl.framework从CalendarControl.xcodeproj的产品文件夹拖到这个部分。
您在Frameworks, Libraries and Embedded Content中为框架添加了一个目录。
现在应用程序知道了框架以及在哪里可以找到它。应该够了吧?
切换到RWCalendarPicker方案并制作项目。更多相同的错误。
11.png您访问了框架开发的一个重要部分:访问控制。
访问控制
这些框架的代码是项目的一部分,但项目并不是它。眼不见,心不烦。
转到ItemDetailViewController.swift ,将列表添加到文件顶部的导入中:
导入日历控件
这很关键,但这个包含的控制仍然不会修复构建错误,因为 Swift 使用访问来确定您是否确定对其他文件或模块的结构是显而易见的。
在这种情况下,Swift 使所有内容internal
——仅在其自己的模块中可见。
要恢复应用程序的功能,您必须更新CalendarControl类的访问控制。
通过的有点乏味,但更新访问控制过程隐藏不应该出现在框架之外的代码来提高启动。您可以通过使某些函数不带访问符式显式声明它们来完成这一点internal
。
Swift 有几个等级的访问控制。创建自己的框架时,请使用以下规则:
- 公开和公开:用于应用程序或其他框架调用的代码,例如自定义视图。
- Internal:框架内部函数和类之间的,例如用于视图中的自定义代码层。
- Fileprivate:用于在一个文件中使用的代码,例如计算高度的辅助函数。
-
Private:使用和声明中使用的相同代码,例如
class
声明文件中的不同块该扩展。
当CalendarControl是RWCalendarPicker应用程序的某个部分时,操作内部不是问题。现在它位于一个程序的单独模块中,您必须将其公开以供使用使用。将在下一节中执行此操作。
注意:如果您想了解有关访问控制的更多信息并了解和了解它们之间的区别open
,public
请查看访问控制文档。
更新框架访问等级
打开CalendarPickerViewController.swift。通过将public
关键字添加类定义来使类公开,如下所示:
公共类CalendarPickerViewController : UIViewController {
现在CalendarPickerViewController
对导入CalendarControl框架的任何应用程序文件都是可见的。
将public
关键字添加到:
CalendarPickerViewController.init(baseDate:selectedDateChanged:)
CalendarPickerViewController.init(coder:)
CalendarPickerViewController.viewDidLoad()
CalendarPickerViewController.viewWillTransition(to:with:)
CalendarPickerViewController.collectionView(_:numberOfItemsInSection:)
CalendarPickerViewController.collectionView(_:cellForItemAt:)
CalendarPickerViewController.collectionView(_:didSelectItemAt:)
CalendarPickerViewController.collectionView(_:layout:sizeForItemAt:)
注意:您可能想知道为什么必须init
公开。Apple 在其访问控制中了这一声明和其他文档中更精细的访问点。
现在你得到了你的CalendarControl 。
恭喜!您现在拥有一个工作的独立框架和一个使用它的应用程序!
12.png发布 XCFramework
您可能在2019 年听说过 XCFramework。是的,对的:这是可以 Xcode 生成的框架是您在 WWDC 使用的框架。
在 219 年前你只有一次机会制作自己的框架,框架也称为通用静态库。
为了支持架构,您的例如和设备的组合库,您必须将它们中的一个胖框架的下一个。但是,在此之后,框架再胖了。
归档你的框架
在本节中,您将与您的老朋友终端一起工作。呜呼!
打开终端并使用以下命令导航到框架文件夹。或者,您可以在 cd命令将项目文件夹拖到终端:
cd "CreateFrameworkForiOS/starter/2-Framework"
开始为以下目标归档您的框架传送:
- iOS
- 下载
- 苹果系统
在终端中输入从以下命令:
xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination '通用/平台=iOS' \
-archivePath './build/CalendarControl.framework-iphoneos.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
此命令将使用以下列表作为输入生成框架的记录:
- -scheme CalendarControl:使用此方案进行归档。
- -configuration Release:使用发布配置进行构建。
- -destination 'generic/platform=iOS':这是一种架构类型。
- -archivePath:它使用给定名称将档案保存到此文件夹路径中。
- SKIP_INSTALL:设置NO将框架安装到文档中。
- BUILD_LIBRARIES_FOR_DISTRIBUTION:确保为分发而建造库并创建接口文件。
通过制作命令添加到您的终端来记录:
xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination通用/平台=iOS 引导' \
-archivePath './build/CalendarControl.framework-iphonesimulator.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
这些命令选项与 iOS 的命令选项相同,但有以下区别:
- -destination 'generic/platform=iOS Simulator':这是你设置架构类型的地方。
- -archivePath:这文档生成到带有给定名称的文件夹路径中。
最后,为macOS生成一个新文档。在终端中添加以下命令:
xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination '平台=macOS,arch=x86_64,variant=Mac Catalyst' \
-archivePath './build/CalendarControl.framework-catalyst.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
此命令与其他命令相同,但有以下不同:
- -destination 'platform=macOS,arch=x86_64,variant=Mac Catalyst':这是您指示架构类型的地方。
- -archivePath:这文档生成到带有给定名称的文件夹路径中。
正如您在取景器和以下屏幕截图中所见,您从框架中生成了三个不同的归档文件。
13.png生成 XCFramework
现在,制作框架。将下面的框架添加到终端上。
xcodebuild-创建-xcframework \
-framework './build/CalendarControl.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/CalendarControl.framework' \
-framework './build/CalendarControl.framework-iphoneos.xcarchive/Products/Library/Frameworks/CalendarControl.framework' \
-framework './build/CalendarControl.framework-catalyst.xcarchive/Products/Library/Frameworks/CalendarControl.framework' \
-输出'./build/CalendarControl.xcframework'
您在使用命令之前生成的文件将 XCFramework 添加到制造的文件夹中。
检查制作文件夹的内容以查看 XCFramework 包含的内容。
14.png呜呜!您现在已经制作了第一个 XCFramework。
15.png将 XCFramework 集成到您的项目中
是时候从RWCalendarPicker项目中删除CalendarControl引用了,如下所示:
16.gif您的源代码是您不再需要访问框架的源代码。将XC拖到项目目标的Frameworks、Libraries和Embedded Content部分:
17.gif您将可以与以前相同的类,但这次的框架只是简单的访问。
将 XCFramework 作为 Swift 包分发
在 WWDC220上,Apple 宣布您可以轻松地在 Swift 包中分发您的 XCFramework。那不是很了不起吗?
注意:如果您不是Swift Packages或Swift Package Manager,您可以通过阅读Swift Package Manager for iOS了解更多信息。
你应该有一个 Swift 包来分发你的 XCFramework。你将在下一节中创建一个。然后你可以通过在 GitHub 上发布来分享你喜欢的框架。
准备Swift包
在启动项目文件中,您已经有了一个 Swift 包。导航简单到/starter/3-SwiftPackage/CalendarControl并打开Package.swift
18.png这个类是你的 Swift 包的清单。您需要进行修改以使CalendarControl成为 Swift 包。
按照以下步骤并使用正确的值填充清单:
- 平台:
平台:[
.macOS(.v10_15) 、 .iOS(.v14) 、 .tvOS(.v14)
],
这个它的代码指示可以在哪个平台上运行。
- 产品:
产品: [
。图书馆(
名称:《日历控件》,
目标:[“日历控件”]),
],
这些是软件包提供的产品。这些可以是库——可以导入其他 Swift 项目的代码——也可以是可执行的——可以由操作系统运行的代码。产品是您可以导出以供其他包使用的目标。
- 目标:
目标:[
.二进制目标(
名称:“日历控件”,
路径:“./Sources/CalendarControl.xcframework”)
]
目标是独立构建的代码模块。在这里为您的 XCFramework 添加路径。
注意:清单的第一行必须包含一个格式化的注释,告诉 Swift 包管理器构建包所需的 Swift 编译器的最低版本。
最后,将您的 XCFramework 添加到项目中并将其放在Sources下:
19.png恭喜!您的 Swift 包已准备好分发。
20.png大二进制和计算校验和
尽管情况并非如此CalendarControl
,但一个特别庞大的框架将需要格外小心。如果您想了解有关处理较大二进制文件的更多信息,请打开下面的剧透。
揭示
发布你的 Swift 包
Xcode 使发布你的包变得容易。接下来,您将发布您创建的CalendarControl Swift 包。
使用 Xcode,打开Swift Package项目。然后从菜单栏中选择Source Control ▸ New Git Repositories...。
21.png这会在您的计算机上创建一个 Git 存储库以及您的代码的初始提交。
在你可以发布你的包供其他人使用之前,它必须是公开的。最简单的方法是发布到GitHub。
如果您没有 GitHub 帐户,您可以在github.com免费创建一个。然后,如果您还没有这样做,请通过在 Xcode 菜单中选择Xcode ▸ Preferences将您的 GitHub 帐户添加到 Xcode。选择帐户。
现在,单击+添加一个新帐户。选择GitHub并按要求填写您的凭据。
22.png打开源代码管理导航器并选择CalendarControl包。然后通过右键单击或Control-click打开上下文菜单。
接下来,选择New “CalendarControl” Remote…。您可以将可见性更改为私人或接受默认设置。然后单击创建。
23.gif这会在 GitHub 上创建一个新存储库,并自动为您推送代码。
接下来,通过为您的包创建标签来设置您的框架的版本。在上下文菜单中,选择标记主…。将其标记为版本1.0.0并单击Create。
24.gif最后,从 Xcode 菜单栏中选择Source Control ▸ Push...。确保选择了包含标签。然后点击推送。
这会将标签推送到 SwiftPM 可以读取的 GitHub。您的软件包的 1.0.0 版现已上线。:]
25.png使用 Swift 包
现在是时候在RWCalendarPicker项目中使用 Swift 包了。
再次打开RWCalendarPicker。从项目目标中删除导入的CalendarControl框架:
26.gif接下来,您将学习如何使用Swift Package Manager将 Swift 包添加到项目中。
使用 SPM 添加包依赖项
选择File ▸ Swift Packages ▸ Add Package Dependency ...。粘贴 Git 存储库 URL。单击下一步。
根据您的 GitHub 设置,您可能需要在此处验证您的 SSH 密钥。然后,在Rules下,确保为1.0.0版本选择了Up to Next Major。单击下一步。
如果您想了解有关主要和次要版本控制的更多信息,请查看semver.org。在 Xcode 获取包后,确保选择CalendarControl产品并将其添加到RWCalendarPicker目标。然后选择完成。
27.png构建并运行。确保一切都像以前一样运行。
28.gif极好的!现在你有了一个在项目中使用的远程 Swift 包。
29.png结论
本教程的最终项目资料下载地址
链接:https://pan.baidu.com/s/1vIg0rxlw11UoaKqBbLzadQ
提取码:adiz
在本教程中,您学习了如何:
- 从RWCalendarPicker 中提取CalendarControl并制作一个新框架。
- 使用RWCalendarPicker中的CalendarControl框架。
- 构建一个二进制框架并在 RWCalendarPicker 中使用该XCFramework。
- 发布一个 Swift 包并在RWCalendarPicker中使用它。
这里也推荐一些面试相关的内容,祝各位网友都能拿到满意offer!
GCD面试要点
block面试要点
Runtime面试要点
RunLoop面试要点
内存管理面试要点
MVC、MVVM面试要点
网络性能优化面试要点
网络编程面试要点
KVC&KVO面试要点
数据存储面试要点
混编技术面试要点
设计模式面试要点
UI面试要点
网友评论