庫(kù)的相關(guān)問題(一) —— iOS Framework的創(chuàng)建的簡(jiǎn)單示例(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2021.01.25 星期一

前言

iOS中有很多庫(kù),包括系統(tǒng)庫(kù)還有我們使用的三方封裝庫(kù),這個(gè)專題我們就一起看學(xué)習(xí)一下相關(guān)庫(kù)的知識(shí)。

開始

首先看下主要內(nèi)容:

了解如何構(gòu)建iOS框架,該框架可讓您在應(yīng)用之間共享代碼,模塊化代碼或?qū)⑵渥鳛榈谌綆?kù)分發(fā)。內(nèi)容來(lái)自翻譯。

下面看下寫作環(huán)境:

Swift 5, iOS 14, Xcode 12

接著就是正文啦。

您是否曾經(jīng)想在兩個(gè)應(yīng)用程序之間共享大量代碼,或者想與其他開發(fā)人員共享程序的一部分?

也許您想對(duì)代碼進(jìn)行模塊化,就像iOS SDK通過功能將其API分開一樣。 或者,您可能想像流行的第三方庫(kù)一樣分發(fā)代碼。

在本教程中,您將把在 Creating a Custom CalendarControl for iOSCalendarControl提取到一個(gè)單獨(dú)的可重用框架中。 在此過程中,您將:

  • CalendarControl創(chuàng)建一個(gè)新框架。
  • 遷移現(xiàn)有代碼。
  • 將所有內(nèi)容導(dǎo)入回應(yīng)用程序。
  • 構(gòu)建一個(gè)二進(jìn)制框架XCFramework。
  • 將其打包為超級(jí)便攜式Swift Package。
  • 為您的Swift Package設(shè)置一個(gè)存儲(chǔ)庫(kù)并發(fā)布它。

待您完成時(shí),該應(yīng)用程序?qū)⑾褚郧耙粯邮褂媚_發(fā)的便攜式XCFramework進(jìn)行操作!

查找入門項(xiàng)目文件夾。 找到1-RWCalendarPickerUI并打開RWCalendarPicker.xcodeproj

RWCalendarPicker是一款類似于提醒的清單應(yīng)用程序,可讓用戶創(chuàng)建任務(wù)并設(shè)置截止日期。

構(gòu)建并運(yùn)行以了解其工作原理。

查看RWCalendarPicker中的文件以熟悉該項(xiàng)目。 CalendarControl的代碼分為幾類:

  • Day.swift:一種數(shù)據(jù)模型,其中包含每個(gè)日對(duì)象的數(shù)據(jù)。
  • MonthMetadata.swift:數(shù)月的數(shù)據(jù)模型。
  • CalendarDateCollectionViewCell.swift:使用collection view中的單元格顯示一個(gè)月中的幾天。 每個(gè)單元格都在此處自定義。
  • CalendarPickerFooterView.swift:允許用戶選擇不同的月份。
  • CalendarPickerHeaderView.swift:顯示當(dāng)前月份和年份,讓用戶關(guān)閉選擇器并顯示工作日標(biāo)簽。
  • CalendarPickerViewController.swift:日歷的主體,在其中結(jié)合了所有相關(guān)視圖。

CalendarPicker非常方便。 在此應(yīng)用程序之外的多個(gè)應(yīng)用程序中使用它會(huì)不會(huì)很好? 框架就是可以做到!


What is a Framework?

框架是獨(dú)立的,可重用的代碼和資源塊,您可以將其導(dǎo)入許多應(yīng)用程序。 您甚至可以在iOS,tvOS,watchOS和macOS應(yīng)用程序之間共享它們。 與Swift的access control結(jié)合使用時(shí),框架可幫助定義代碼模塊之間強(qiáng)大的,可測(cè)試的接口。

框架具有三個(gè)主要目的:

  • 封裝代碼
  • 模塊化代碼
  • 重用代碼

如果您使用其他語(yǔ)言編程,則可能聽說(shuō)過node modules, packages, gems or jars。 框架與Apple生態(tài)系統(tǒng)中的框架相同。 iOS SDK中常見框架的一些示例包括Foundation,UIKit,SwiftUI,CloudKitCombine。

用Swift的話來(lái)說(shuō),模塊是分布在一起的一組編譯后的代碼。 框架是模塊的一種,而應(yīng)用程序是另一種。

注意:如果要了解有關(guān)框架的更多信息,請(qǐng)閱讀What are Frameworks?

1. Creating a Framework

蘋果在Xcode 6中引入了Cocoa Touch Framework,最近又將其更改為Framework。 創(chuàng)建框架從未如此簡(jiǎn)單。 首先,您將為框架創(chuàng)建項(xiàng)目(project)

在Xcode中,選擇File ? New ? Project…。 然后選擇iOS ? Framework & Library ? Framework

點(diǎn)擊Next。 然后將Product Name設(shè)置為CalendarControl。 使用您自己的Organization NameOrganization Identifier

點(diǎn)擊下一步。 在文件選擇器中,選擇在2-Framework處創(chuàng)建項(xiàng)目。 然后單擊Create

現(xiàn)在您有一個(gè)項(xiàng)目,盡管很無(wú)聊,但卻創(chuàng)建了一個(gè)框架!

2. Adding the Source Code to the Framework

您當(dāng)前的狀態(tài)是一個(gè)沒有代碼的框架。 這和不含糖的純巧克力一樣誘人。 在本部分中,您將通過將現(xiàn)有文件添加到框架中來(lái)引入代碼。

RWCalendarPicker源目錄中,將Day.swift拖動(dòng)到Xcode中的CalendarControl項(xiàng)目中。 確保根據(jù)需要選中Copy items if needed ,以便將文件復(fù)制到新項(xiàng)目中,而不是添加引用。 框架需要自己的代碼(而不是引用)才能獨(dú)立。

仔細(xì)檢查Day.swiftCalendarControl中是否具有Target Membership,以確保它出現(xiàn)在最終框架中。 通過選擇此文件并確保在File inspectorTarget Membership區(qū)域中選擇了CalendarControl來(lái)驗(yàn)證這一點(diǎn)。

現(xiàn)在,按照上述步驟將這些文件添加到您的項(xiàng)目中:

  • MonthMetadata.swift
  • CalendarDateCollectionViewCell.swift
  • CalendarPickerFooterView.swift
  • CalendarPickerHeaderView.swift
  • CalendarPickerViewController.swift

注意:嚴(yán)格來(lái)說(shuō),將類劃分為各自的文件夾組不是必須的,但是這是組織代碼的一種很好的做法。

在“項(xiàng)目”導(dǎo)航器中選擇項(xiàng)目,然后在Targets中選擇CalendarControl。 打開Build Settings。 然后將Build Libraries for Distribution設(shè)置為yes。 這將產(chǎn)生一個(gè)模塊接口文件,當(dāng)有人跳轉(zhuǎn)到Xcode中的模塊定義時(shí),該文件將顯示您的公共API。

構(gòu)建框架項(xiàng)目。 確保您沒有任何構(gòu)建警告或錯(cuò)誤的情況下獲得Build Succeeded。

3. Adding Framework to the Project

關(guān)閉CalendarControl。 返回到RWCalendarPicker。 現(xiàn)在,您已經(jīng)將calendar framework組裝到框架framework中,您不再需要在主項(xiàng)目中遷移文件。 刪除以下文件。 在確認(rèn)對(duì)話框中選擇Move to Trash

  • Day.swift
  • MonthMetadata.swift
  • CalendarDateCollectionViewCell.swift
  • CalendarPickerFooterView.swift
  • CalendarPickerHeaderView.swift
  • CalendarPickerViewController.swift

構(gòu)建項(xiàng)目。 您會(huì)看到幾個(gè)可預(yù)測(cè)的錯(cuò)誤,其中Xcode報(bào)警不知道CalendarPickerViewController到底是什么。 具體來(lái)說(shuō),您會(huì)在范圍錯(cuò)誤消息中看到Cannot find ‘CalendarPickerViewController’ in scope。

您可以通過添加CalendarControl框架項(xiàng)目來(lái)解決這些問題。

4. Embedding Your Binary

現(xiàn)在,右鍵單擊項(xiàng)目導(dǎo)航器中的根RWCalendarPicker節(jié)點(diǎn)。 單擊Add Files to “RWCalendarPicker”。

在文件選擇器中,導(dǎo)航到2-Framework / CalendarControl,然后選擇CalendarControl.xcodeproj。 然后單擊添加將其添加為子項(xiàng)目。

注意:并非必須將框架項(xiàng)目添加到應(yīng)用程序項(xiàng)目中。 您可以添加CalendarControl.framework輸出。

但是,將項(xiàng)目組合在一起可以更輕松地同時(shí)開發(fā)框架和應(yīng)用程序。 您對(duì)框架項(xiàng)目所做的任何更改都會(huì)自動(dòng)傳播到應(yīng)用程序。 這也使Xcode更容易解析路徑并知道何時(shí)重建項(xiàng)目。

構(gòu)建并運(yùn)行。 您會(huì)看到相同的編譯錯(cuò)誤!

即使兩個(gè)項(xiàng)目現(xiàn)在在一起,RWCalendarPicker仍然無(wú)法獲得CalendarControl。 就像他們坐在同一個(gè)房間里一樣,但是RWCalendarPicker無(wú)法看到新框架。

請(qǐng)按照以下步驟解決問題:

  • 1) 將scheme更改為CalendarControl并進(jìn)行構(gòu)建。
  • 2) 然后,展開CalendarControl項(xiàng)目以查看Products文件夾。
  • 3) 在其下面查找CalendarControl.framework。 該文件是框架項(xiàng)目的輸出,該項(xiàng)目打包了二進(jìn)制代碼,header,資源和元數(shù)據(jù)。
  • 4) 然后選擇頂層RWCalendarPicker節(jié)點(diǎn)以打開項(xiàng)目編輯器。
  • 5) 單擊RWCalendarPicker target。 然后轉(zhuǎn)到General選項(xiàng)卡。
  • 6) 向下滾動(dòng)到Frameworks, Libraries and Embedded Content部分。
  • 7) 將CalendarControl.frameworkCalendarControl.xcodeprojProducts文件夾中拖到此部分。

您在Frameworks, Libraries and Embedded Content中為框架添加了一個(gè)條目entry。

現(xiàn)在,該應(yīng)用程序知道了框架以及在何處可以找到它。 這樣就足夠了吧?

切換到RWCalendarPicker scheme并構(gòu)建項(xiàng)目。 更多相同的錯(cuò)誤。

您錯(cuò)過了框架開發(fā)的重要部分:Access Control


Access Control

盡管框架是項(xiàng)目的一部分,但是項(xiàng)目的代碼對(duì)此并不了解。 看不見,也想不到。

轉(zhuǎn)到ItemDetailViewController.swift,并將以下行添加到文件頂部的導(dǎo)入列表中:

import CalendarControl

至關(guān)重要的是,此包含仍然不能解決構(gòu)建錯(cuò)誤,因?yàn)?code>Swift使用access control來(lái)確定構(gòu)造是否對(duì)其他文件或模塊可見。

默認(rèn)情況下,Swift將所有內(nèi)容內(nèi)部化(internal)-僅在其自己的模塊中可見。

要恢復(fù)該應(yīng)用程序的功能,您必須更新CalendarControl類上的訪問控制。

盡管有點(diǎn)乏味,但是更新訪問控制的過程通過隱藏不需要出現(xiàn)在框架外部的代碼來(lái)提高模塊化。您可以通過使某些函數(shù)不具有訪問修飾符或明確聲明它們internal來(lái)實(shí)現(xiàn)此目的。

Swift具有五個(gè)級(jí)別的access control。創(chuàng)建自己的框架時(shí),請(qǐng)遵循以下經(jīng)驗(yàn)法則:

  • Open and public:適用于應(yīng)用或其他框架(例如自定義視圖)調(diào)用的代碼。
  • Internal:用于在框架內(nèi)的函數(shù)和類之間使用的代碼,例如該視圖中的自定義層。
  • Fileprivate:用于單個(gè)文件中使用的代碼,例如用于計(jì)算布局高度的輔助函數(shù)。
  • Private:用于封閉聲明中使用的代碼,例如單個(gè)類class塊和同一文件中該聲明的擴(kuò)展。

當(dāng)CalendarControl成為RWCalendarPicker應(yīng)用程序的一部分時(shí),內(nèi)部訪問就不成問題?,F(xiàn)在,它位于單獨(dú)的模塊中,您必須將其公開,以供應(yīng)用使用。您將在下一部分中進(jìn)行操作。

注意:如果要了解有關(guān)訪問控制的更多信息并了解openpublic之間的區(qū)別,請(qǐng)查看 Access Control Documentation。

1. Updating the Framework Access Level

打開CalendarPickerViewController.swift。通過將public關(guān)鍵字添加到類定義中來(lái)使該類成為公共類,如下所示:

public class CalendarPickerViewController: UIViewController {

現(xiàn)在,CalendarPickerViewController對(duì)導(dǎo)入CalendarControl框架的任何應(yīng)用程序文件都是可見的。

接下來(lái),將public關(guān)鍵字添加到:

  • 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聲明為public。 Apple在其Access Control Documentation中解釋了訪問控制的這一點(diǎn)和其他一些要點(diǎn)。

構(gòu)建并運(yùn)行。 現(xiàn)在,您獲得了CalendarControl。

恭喜你! 現(xiàn)在,您有了一個(gè)有效的獨(dú)立框架和使用該框架的應(yīng)用程序!


Publishing the XCFramework

您可能在WWDC 2019期間聽說(shuō)過XCFramework。是的,您是對(duì)的:這是可以使用Xcode生成的二進(jìn)制框架的名稱。

2019年之前,您只有一個(gè)機(jī)會(huì)來(lái)制作自己的二進(jìn)制框架:Universal Static Library,也稱為Fat Framework。

為了支持多種架構(gòu),例如模擬器和設(shè)備,您必須將它們組合在fat框架的一個(gè)庫(kù)下。 但是,在本文之后,您的框架不必再胖了。

1. Archiving Your Framework

在本部分中,您將與老朋友Terminal一起工作。 hoo!

打開您的終端,并使用以下命令導(dǎo)航到framework文件夾。 或者,您可以在cd命令后將項(xiàng)目文件夾拖到終端:

cd "CreateFrameworkForiOS/starter/2-Framework"

接下來(lái),開始為以下targets歸檔您的框架:

  • iOS
  • Simulator
  • macOS

從iOS開始。 在終端中輸入以下命令:

xcodebuild archive \
-scheme CalendarControl \
-configuration Release \
-destination 'generic/platform=iOS' \
-archivePath './build/CalendarControl.framework-iphoneos.xcarchive' \
SKIP_INSTALL=NO \
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

該命令將使用以下列表作為輸入來(lái)生成您的框架的存檔:

  • 1) -scheme CalendarControl:它將使用此scheme進(jìn)行archiving。
  • 2) -configuration Release:它將使用發(fā)布配置進(jìn)行構(gòu)建。
  • 3) -destination“ generic / platform = iOS”:這是架構(gòu)類型。
  • 4) -archivePath:它將archives以給定名稱保存到該文件夾路徑中。
  • 5) SKIP_INSTALL:設(shè)置為NO即可將框架安裝到archive中。
  • 6) BUILD_LIBRARIES_FOR_DISTRIBUTION:確保為分發(fā)而構(gòu)建您的庫(kù)并創(chuàng)建接口文件。

接下來(lái),目標(biāo)Simulator。 通過將此命令添加到終端來(lái)進(jìn)行歸檔:

xcodebuild archive \
-scheme CalendarControl \
-configuration Release \
-destination 'generic/platform=iOS Simulator' \
-archivePath './build/CalendarControl.framework-iphonesimulator.xcarchive' \
SKIP_INSTALL=NO \
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

這些命令選項(xiàng)與iOS的選項(xiàng)相同,不同之處在于:

  • 1)-destination“ generic / platform = iOS Simulator”:在此處設(shè)置架構(gòu)類型。
  • 2) -archivePath:這會(huì)將archive生成到具有給定名稱的文件夾路徑中。

最后,為macOS生成一個(gè)新的存檔。 在終端中添加以下命令:

xcodebuild archive \
-scheme CalendarControl \
-configuration Release \
-destination 'platform=macOS,arch=x86_64,variant=Mac Catalyst' \
-archivePath './build/CalendarControl.framework-catalyst.xcarchive' \
SKIP_INSTALL=NO \
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

該命令與其他命令相同,不同之處在于:

  • 1) -destination‘platform = macOS,arch = x86_64,variant = Mac Catalyst':在此指示體系結(jié)構(gòu)類型。
  • 2) -archivePath:這會(huì)將archive生成到具有給定名稱的文件夾路徑中。

如您在查找器和以下屏幕截圖中所見,您從框架中生成了三個(gè)不同的存檔文件。

2. Generating the XCFramework

現(xiàn)在,創(chuàng)建二進(jìn)制框架XCFramework。 將以下命令添加到終端:

xcodebuild -create-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' \
-output './build/CalendarControl.xcframework'

此命令使用您生成的先前archivesXCFramework添加到build文件夾。

檢查構(gòu)建文件夾以查看XCFramework包含的內(nèi)容。

噓! 現(xiàn)在,您已經(jīng)完成了第一個(gè)XCFramework。

3. Integrating XCFramework Into Your Project

現(xiàn)在該從RWCalendarPicker項(xiàng)目中刪除CalendarControl引用,如下所示:

這樣做是因?yàn)槟辉傩枰L問框架源代碼。 將XCFramework拖到項(xiàng)目targetFrameworks, Libraries and Embedded Content

構(gòu)建并運(yùn)行。 您將擁有與以前相同的類的訪問權(quán)限,但是這次您的框架僅是二進(jìn)制的。


Distributing XCFramework as a Swift Package

WWDC 2020上,Apple宣布您可以輕松地在Swift Packages中分發(fā)XCFramework。 那不是很棒嗎?

注意:如果您不熟悉Swift PackagesSwift Package Manager,可以通過閱讀Swift Package Manager for iOS來(lái)了解更多信息。

您應(yīng)該有一個(gè)Swift Package來(lái)分發(fā)XCFramework。 您將在下一部分中創(chuàng)建一個(gè)。 然后,您可以通過在GitHub上發(fā)布框架來(lái)共享您的框架。

1. Preparing the Swift Package

在入門項(xiàng)目文件中,您已經(jīng)有一個(gè)簡(jiǎn)單的Swift Package。 導(dǎo)航到/ starter / 3-SwiftPackage / CalendarControl并打開Package.swift

此類是您的Swift Package的清單。 您需要對(duì)其進(jìn)行修改,以使CalendarControl成為Swift Package。

請(qǐng)按照下列步驟,并用正確的值填充清單:

  • 1) Platforms
platforms: [
  .macOS(.v10_15), .iOS(.v14), .tvOS(.v14)
],

此代碼指示它可以在哪些平臺(tái)上運(yùn)行。

  • 2) Products
products: [
  .library(
    name: "CalendarControl",
    targets: ["CalendarControl"]),
],

這些是包裝提供的產(chǎn)品。 這些可以是庫(kù)(可以導(dǎo)入其他Swift項(xiàng)目中的代碼)或可執(zhí)行文件(可以由操作系統(tǒng)運(yùn)行)。 product是您可以導(dǎo)出以供其他軟件包使用的target。

  • 3) Targets
targets: [
  .binaryTarget(
    name: "CalendarControl",
    path: "./Sources/CalendarControl.xcframework")
]

Targets是獨(dú)立構(gòu)建的代碼模塊。 在這里,您可以為XCFramework添加路徑。

注意:清單的第一行必須包含格式化的注釋,該注釋告訴Swift Package Manager構(gòu)建軟件包所需的最低Swift編譯器版本。

最后,將XCFramework添加到項(xiàng)目中并將其放在Sources下:

恭喜你! 您的Swift Package已準(zhǔn)備好分發(fā)。

2. Large Binary and Compute Check-Sum

盡管CalendarControl并非如此,但特別龐大的框架仍需要格外小心。 如果您想了解有關(guān)處理較大二進(jìn)制文件的更多信息,請(qǐng)打開下面的spoiler。

如果您有大型二進(jìn)制框架(如Apple所建議的那樣),則不應(yīng)將其添加到存儲(chǔ)庫(kù)中。 相反,您可以將其上傳到主機(jī),并在manifest target中添加一個(gè)URL,如下所示:

targets: [
  .binaryTarget(
    name: "CalendarControl",
    >url:"https://example.com/CalendarControl.xcframework.zip",
    checksum: "4d4053074fd8b92f9f2f339c48980b99")
]

這里有三個(gè)輸入:

  • 1) Name:這是您的包名稱。
  • 2) URL:您的XCFramework壓縮文件URL
  • 3) Checksum:您的Swift Package將確??蚣?code>zip文件與通過檢查此checksum和所生成的壓縮文件相同。

請(qǐng)按照以下步驟計(jì)算校驗(yàn)和checksum

  • 1) 壓縮您的框架,然后將zip文件復(fù)制到Swift Package文件夾中。
  • 2) 在終端中,導(dǎo)航到Swift Package文件夾。
  • 3) 運(yùn)行以下命令并生成校驗(yàn)和。
swift package compute-checksum CalendarControl.xcframework.zip

您的XCFramework校驗(yàn)和在這里。 您可以將其復(fù)制到manifest。

3. Publishing Your Swift Package

Xcode使發(fā)布軟件包變得容易。 接下來(lái),您將發(fā)布您創(chuàng)建的CalendarControl Swift Package

使用Xcode打開Swift Package項(xiàng)目。 然后從菜單欄中選擇Source Control ? New Git Repositories…

這將在您的計(jì)算機(jī)上創(chuàng)建一個(gè)Git存儲(chǔ)庫(kù),并首次提交代碼。

必須先將其公開發(fā)布,然后才能發(fā)布您的軟件包供他人使用。 最簡(jiǎn)單的方法是發(fā)布到GitHub。

如果您沒有GitHub帳戶,則可以在github.com上免費(fèi)創(chuàng)建一個(gè)。 然后,如果還沒有這樣做,請(qǐng)通過在Xcode菜單中選擇Xcode ? Preferences,將GitHub帳戶添加到Xcode。 選擇Accounts。

現(xiàn)在,單擊+添加一個(gè)新帳戶。 選擇GitHub并按要求填寫您的憑據(jù)。

打開Source Control navigator,然后選擇CalendarControl程序包。 然后,通過右鍵單擊或按住Control鍵單擊打開上下文菜單。

接下來(lái),選擇New “CalendarControl” Remote…。 您可以將可見性更改為Private或接受默認(rèn)設(shè)置。 然后單擊Create。

這將在GitHub上創(chuàng)建一個(gè)新的存儲(chǔ)庫(kù),并自動(dòng)為您推送代碼。

接下來(lái),通過為包創(chuàng)建標(biāo)簽來(lái)設(shè)置框架的版本。 在上下文菜單中,選擇Tag main…。 將其標(biāo)記為1.0.0版本,然后單擊Create。

最后,從Xcode菜單欄中選擇Source Control?Push…。 確保選擇了Include tags。 然后單擊Push

這會(huì)將標(biāo)簽推送到SwiftPM可以讀取它的GitHub。 您的軟件包的1.0.0版現(xiàn)已發(fā)布。


Using Swift Package

現(xiàn)在是時(shí)候在RWCalendarPicker項(xiàng)目中使用您的Swift Package了。

再次打開RWCalendarPicker。 從項(xiàng)目target中刪除導(dǎo)入的CalendarControl框架:

接下來(lái),您將學(xué)習(xí)如何使用Swift Package ManagerSwift Package添加到項(xiàng)目中。

1. Adding Package Dependency Using SPM

選擇File ? Swift Packages ? Add Package Dependency…。 粘貼Git Repository URL。 單擊下一步。

根據(jù)您的GitHub設(shè)置,您可能需要在此處驗(yàn)證SSH密鑰。 然后,在Rules下,確保為1.0.0版本選擇了Up to Next Major。 點(diǎn)擊Next。

如果您想了解有關(guān)主要和次要版本控制的更多信息,請(qǐng)?jiān)L問semver.org。 Xcode提取包后,請(qǐng)確保已選擇CalendarControl產(chǎn)品并將其添加到RWCalendarPicker target。 然后選擇Finish。

構(gòu)建并運(yùn)行。 確保一切都像以前一樣運(yùn)行。

太棒了! 現(xiàn)在,您有一個(gè)在項(xiàng)目?jī)?nèi)部使用的遠(yuǎn)程Swift軟件包。

在本教程中,您學(xué)習(xí)了如何:

  • 1) 從RWCalendarPicker中提取CalendarControl并創(chuàng)建一個(gè)新框架。
  • 2) 在RWCalendarPicker中使用CalendarControl框架。
  • 3) 建立一個(gè)二進(jìn)制框架,并在RWCalendarPicker中使用該XCFramework。
  • 4) 發(fā)布一個(gè)Swift Package,并在RWCalendarPicker中使用它。

干得好!

從這里,觀看有關(guān)此主題的WWDC 20192020視頻:

后記

本篇主要講述了iOS Framework的創(chuàng)建的簡(jiǎn)單示例,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容