在本教程中,您将在iOS 中为创建自定义日历控件中的开发人员的日历控件提取到一个单独的可重用框架中。在过程中,您将:
完成后,在您使用开发的便携式应用程序运行时,XCFramework 程序将像以前一样
使用本教程底部底部的“下载材料”按钮或下载最初和最终项目。找到项目文件夹。找到RWCalendarPickerUI并打开RWCalendarPicker.xcodeproj。
RWCalendarPicker是一个类似的提醒清单应用程序,可以让用户创建任务并设置截止日期。
构建并运行以了解其工作原理。
查看RWCalendarPicker中的文件以该项目为主。CalendarControl的代码分为几个类:
框架是独立的、可重复使用的代码和资源块,您可以将其导入到许多应用程序中。您甚至可以在 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。
单击下一步,然后将产品名称设置为CalendarControl。使用您自己的组织名称和组织名称。
点击下一步。在文件选择中,选择在2-Framework创建项目。然后点击创建。
你现在有一个项目,虽然很无聊,但它创建了一个框架!
您当前的状态是一个没有的框架。这与不加糖的纯巧克力一样吸引人。在本节中,您将通过将现有文件添加到框架来介绍代码。
RWCalendarPicker ,将*Day.swift*拖到Xcode中的CalendarControl项目中。,智力。
仔细检查Day.swift在CalendarControl中是否有Target Membership,以确保它出现在最终框架中。通过选择此文件并确保在*File inspectors的*Target Membership区域中选择CalendarControl来验证这一点。
现在,按照上述步骤将这些文件添加到您的项目中:
将类代码分开它们的组中,这是组织到必须自己注意的,但好习惯。
在项目导航器中选择您的项目,然后在*Targets中选择*CalendarControl。打开设置。然后将Build Libraries for Distribution设置为y。这会生成一个接口模块文件,当Xcode中有人定义时跳转到您的模块时,该文件会显示您的公共 API。
制造框架项目。确保您在没有制造警告或错误的情况下获得制造成功。
您已关闭日历控件。返回到日历中的日历框架到现在的纸框架中,不再需要项目中的迁移文件。删除。在确认中选择*至废*篓。
项目。您看到看到几个可预见的消息的错误,Xcode 会显示会在不知道CalendarPickerViewController
是什么。具体来说,您创建的范围错误中找不到“CalendarPickerViewController”。
您将通过添加CalendarControl框架项目来解决这些问题。
现在,点击点击项目导航器中的节点RWCalendarPicker根。点击将文件添加到“RWCalendarPicker”。
在文件选择器中,导航到2-Framework/CalendarControl并选择CalendarControl.xcodeproj。然后单击添加将其添加为子项目。
注意:将框架项目添加到应用程序中自己需要的。您可以添加CalendarControl.framework输出。
结合这些项目,可以同时更新框架和应用程序。您对框架和应用程序进行开发部署的任何项目都可以使用。
构建并运行。你会看到同样的编译错误!
即使这两个项目现在,RWCalendarPicker仍然没有拥有CalendarControl。就像他们坐在同一个房间里,但是RWCalendarPicker看不到新框架。
请按照以下步骤解决问题:
您在Frameworks, Libraries and Embedded Content中为框架添加了一个目录。
现在应用程序知道了框架以及在哪里可以找到它。应该够了吧?
切换到RWCalendarPicker方案并制作项目。更多相同的错误。
您访问了框架开发的一个重要部分:访问控制。
这些框架的代码是项目的一部分,但项目并不是它。眼不见,心不烦。
转到ItemDetailViewController.swift ,将列表添加到文件顶部的导入中:
导入日历控件
这很关键,但这个包含的控制仍然不会修复构建错误,因为 Swift 使用访问来确定您是否确定对其他文件或模块的结构是显而易见的。
在这种情况下,Swift 使所有内容internal
——仅在其自己的模块中可见。
要恢复应用程序的功能,您必须更新CalendarControl类的访问控制。
通过的有点乏味,但更新访问控制过程隐藏不应该出现在框架之外的代码来提高启动。您可以通过使某些函数不带访问符式显式声明它们来完成这一点internal
。
Swift 有几个等级的访问控制。创建自己的框架时,请使用以下规则:
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 。
恭喜!您现在拥有一个工作的独立框架和一个使用它的应用程序!
*您可能在2019 年*听说过 XCFramework。是的,对的:这是可以 Xcode 生成的框架是您在 WWDC 使用的框架。
在 219 年前你只有一次机会制作自己的框架,框架也称为通用静态库。
为了支持架构,您的例如和设备的组合库,您必须将它们中的一个胖框架的下一个。但是,在此之后,框架再胖了。
在本节中,您将与您的老朋友终端一起工作。呜呼!
打开终端并使用以下命令导航到框架文件夹。或者,您可以在 cd命令将项目文件夹拖到终端:
cd "CreateFrameworkForiOS/starter/2-Framework"
开始为以下目标归档您的框架传送:
在终端中输入从以下命令:
xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination '通用/平台=iOS' \
-archivePath './build/CalendarControl.framework-iphoneos.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
此命令将使用以下列表作为输入生成框架的记录:
通过制作命令添加到您的终端来记录:
xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination通用/平台=iOS 引导' \
-archivePath './build/CalendarControl.framework-iphonesimulator.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
这些命令选项与 iOS 的命令选项相同,但有以下区别:
最后,为macOS生成一个新文档。在终端中添加以下命令:
xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination '平台=macOS,arch=x86_64,variant=Mac Catalyst' \
-archivePath './build/CalendarControl.framework-catalyst.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
此命令与其他命令相同,但有以下不同:
正如您在取景器和以下屏幕截图中所见,您从框架中生成了三个不同的归档文件。
现在,制作框架。将下面的框架添加到终端上。
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 包含的内容。
呜呜!您现在已经制作了第一个 XCFramework。
是时候从RWCalendarPicker项目中删除CalendarControl引用了,如下所示:
您的源代码是您不再需要访问框架的源代码。将XC拖到项目目标的Frameworks、Libraries和Embedded Content部分:
您将可以与以前相同的类,但这次的框架只是简单的访问。
在 WWDC220上,Apple 宣布您可以轻松地在 Swift 包中分发您的 XCFramework。那不是很了不起吗?
注意:如果您不是Swift Packages或Swift Package Manager,您可以通过阅读Swift Package Manager for iOS了解更多信息。
你应该有一个 Swift 包来分发你的 XCFramework。你将在下一节中创建一个。然后你可以通过在 GitHub 上发布来分享你喜欢的框架。
在启动项目文件中,您已经有了一个 Swift 包。导航简单到/starter/3-SwiftPackage/CalendarControl并打开Package.swift
这个类是你的 Swift 包的清单。您需要进行修改以使CalendarControl成为 Swift 包。
按照以下步骤并使用正确的值填充清单:
平台:[
.macOS(.v10_15) 、 .iOS(.v14) 、 .tvOS(.v14)
],
这个它的代码指示可以在哪个平台上运行。
产品: [
。图书馆(
名称:《日历控件》,
目标:[“日历控件”]),
],
这些是软件包提供的产品。这些可以是库——可以导入其他 Swift 项目的代码——也可以是可执行的——可以由操作系统运行的代码。产品是您可以导出以供其他包使用的目标。
目标:[
.二进制目标(
名称:“日历控件”,
路径:“./Sources/CalendarControl.xcframework”)
]
目标是独立构建的代码模块。在这里为您的 XCFramework 添加路径。
注意:清单的第一行必须包含一个格式化的注释,告诉 Swift 包管理器构建包所需的 Swift 编译器的最低版本。
最后,将您的 XCFramework 添加到项目中并将其放在Sources下:
恭喜!您的 Swift 包已准备好分发。
尽管情况并非如此CalendarControl
,但一个特别庞大的框架将需要格外小心。如果您想了解有关处理较大二进制文件的更多信息,请打开下面的剧透。
揭示
Xcode 使发布你的包变得容易。接下来,您将发布您创建的CalendarControl Swift 包。
使用 Xcode,打开Swift Package项目。然后从菜单栏中选择Source Control ▸ New Git Repositories...。
这会在您的计算机上创建一个 Git 存储库以及您的代码的初始提交。
在你可以发布你的包供其他人使用之前,它必须是公开的。最简单的方法是发布到GitHub。
如果您没有 GitHub 帐户,您可以在github.com免费创建一个。然后,如果您还没有这样做,请通过在 Xcode 菜单中选择Xcode ▸ Preferences将您的 GitHub 帐户添加到 Xcode。选择帐户。
现在,单击+添加一个新帐户。选择GitHub并按要求填写您的凭据。
打开源代码管理导航器并选择CalendarControl包。然后通过右键单击或Control-click打开上下文菜单。
接下来,选择New “CalendarControl” Remote…。您可以将可见性更改为私人或接受默认设置。然后单击创建。
这会在 GitHub 上创建一个新存储库,并自动为您推送代码。
接下来,通过为您的包创建标签来设置您的框架的版本。在上下文菜单中,选择标记主…。将其标记为版本1.0.0并单击Create。
最后,从 Xcode 菜单栏中选择Source Control ▸ Push...。确保选择了包含标签。然后点击推送。
这会将标签推送到 SwiftPM 可以读取的 GitHub。您的软件包的 1.0.0 版现已上线。:]
现在是时候在RWCalendarPicker项目中使用 Swift 包了。
再次打开RWCalendarPicker。从项目目标中删除导入的CalendarControl框架:
接下来,您将学习如何使用Swift Package Manager将 Swift 包添加到项目中。
选择File ▸ Swift Packages ▸ Add Package Dependency ...。粘贴 Git 存储库 URL。单击下一步。
根据您的 GitHub 设置,您可能需要在此处验证您的 SSH 密钥。然后,在Rules下,确保为1.0.0版本选择了Up to Next Major。单击下一步。
如果您想了解有关主要和次要版本控制的更多信息,请查看semver.org。在 Xcode 获取包后,确保选择CalendarControl产品并将其添加到RWCalendarPicker目标。然后选择完成。
构建并运行。确保一切都像以前一样运行。
极好的!现在你有了一个在项目中使用的远程 Swift 包。
本教程的最终项目资料下载地址
链接:https://pan.baidu.com/s/1vIg0rxlw11UoaKqBbLzadQ
提取码:adiz
在本教程中,您学习了如何:
这里也推荐一些面试相关的内容!
① BAT等各个大厂iOS面试真题+答案大全
② iOS中高级开发必看的热门书籍(经典必看)
③ iOS开发高级面试"简历制作"指导
④ iOS面试流程到基础知识大全