iOS框架的創(chuàng)建(一) —— 一個(gè)詳細(xì)的框架創(chuàng)建流程(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.08.11

前言

很多時(shí)候我們可以用第三方庫炭晒,比如是SDWebImage或者一些視頻云播放器的框架或庫执庐,這些框架其實(shí)也是有人寫好了封裝起來的贰镣,不同的工程都可以直接拿來使用榴啸,以達(dá)到代碼分享孽惰、模塊化你的代碼以及將其作為第三方庫進(jìn)行發(fā)布。

必要說明

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

也許您希望以類似于iOS SDK按功能分離其API的方式模塊化您的代碼。 或許您希望以與流行的第三方庫相同的方式發(fā)布您的代碼库说。

在本教程中狂鞋,您將學(xué)習(xí)如何使用Frameworks完成上述所有操作!

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

  • 代碼封裝潜的。
  • 代碼模塊化骚揍。
  • 代碼重用。

您可以與其他應(yīng)用啰挪,團(tuán)隊(duì)成員或iOS社區(qū)共享您的框架信不。 當(dāng)與Swift的access control結(jié)合使用時(shí),框架有助于在代碼模塊之間定義強(qiáng)大亡呵,可測(cè)試的接口抽活。

用Swift的說法,module是一組編譯在一起發(fā)布的代碼政己。 框架是一種類型的模塊酌壕,而應(yīng)用程序是另一個(gè)示例。

在本教程中歇由,您將通過以下方式了解框架的細(xì)節(jié):

  • 為旋鈕控件創(chuàng)建一個(gè)新框架卵牍。
  • 遷移現(xiàn)有代碼。
  • 將整個(gè)內(nèi)容導(dǎo)回到應(yīng)用程序中沦泌。
  • 在Interface Builder中動(dòng)態(tài)渲染自定義組件糊昙。
  • 將其打包成超便攜式CocoaPod。
  • Bonus:為您的框架設(shè)置存儲(chǔ)庫谢谦。

當(dāng)你完成時(shí)释牺,應(yīng)用程序?qū)⑼耆褚郧耙粯舆\(yùn)行萝衩,但將使用你開發(fā)的可移植框架!


開始

在Xcode中打開啟動(dòng)已有的項(xiàng)目没咙。

KnobShowcase是一個(gè)簡(jiǎn)單的應(yīng)用程序猩谊,它演示了如何與控件(如圓形滑塊)進(jìn)行交互,例如在調(diào)音臺(tái)上找到的控件祭刚。

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

此控件的代碼位于兩個(gè)文件中:

  • Knob.swift具有所有視圖邏輯。
  • ViewController.swift負(fù)責(zé)創(chuàng)建旋鈕并與之交互涡驮。

這個(gè)旋鈕控制很有趣暗甥,但是在更多的應(yīng)用中使用到不是更好嗎?框架就可以幫你做到這一點(diǎn)捉捅。


Creating a Framework - 創(chuàng)建一個(gè)框架

框架是獨(dú)立的撤防,可重復(fù)使用的代碼和資源塊,您可以將其導(dǎo)入任意數(shù)量的應(yīng)用程序棒口,甚至可以在iOS寄月,tvOS,watchOS和macOS應(yīng)用程序之間共享陌凳。

如果您使用其他語言編程剥懒,您可能聽說過node modulespackages合敦,gemsjars初橘。 框架是這些的Xcode版本。 iOS SDK中常見框架的一些示例是Foundation充岛,UIKit保檐,AVFoundationCloudKit

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

1. Framework Set Up - 框架設(shè)置

在Xcode 6中夜只,Apple引入了Cocoa Touch Framework模板以及access control,因此創(chuàng)建框架從未變得如此簡(jiǎn)單蒜魄。 首先要做的是為框架創(chuàng)建項(xiàng)目扔亥。

  • 1)在Xcode中,選擇File ? New ? Project….
  • 2)選擇iOS ? Framework & Library ? Cocoa Touch Framework
  • 3)點(diǎn)擊Next
  • 4)設(shè)置Product NameKnobControl谈为,使用你自己的Organization NameOrganization Identifier
  • 5)點(diǎn)擊Next
  • 6)在文件選擇器中旅挤,選擇在與KnobShowcase根文件夾相同的級(jí)別創(chuàng)建項(xiàng)目。
  • 7)點(diǎn)擊Create

現(xiàn)在你有一個(gè)創(chuàng)建框架的項(xiàng)目(盡管很無聊)伞鲫!

2. Add Code - 添加代碼

您當(dāng)前的狀態(tài)是沒有代碼的框架粘茄,這與沒有糖的巧克力一樣吸引人。 在本節(jié)中,您將通過將現(xiàn)有文件添加到框架來引入代碼柒瓣。

KnobShowcase源目錄中儒搭,將Knob.swift文件拖到Xcode中的KnobControl項(xiàng)目中。 如果需要芙贫,請(qǐng)務(wù)必選中Copy items if needed搂鲫,以便將文件實(shí)際復(fù)制到新項(xiàng)目中,而不是僅添加引用屹培。 框架需要自己的代碼才能獨(dú)立默穴,而不是引用怔檩。

仔細(xì)檢查Knob.swiftKnobControl中是否具有Target Membership褪秀,以確保它出現(xiàn)在最終框架中。 您可以在File inspector中對(duì)此進(jìn)行驗(yàn)證薛训。

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

Knob.swift中包含三個(gè)不同的類:

  • Knob - 旋鈕:實(shí)際的自定義控件。
  • KnobRenderer:一個(gè)私有類乙埃,用于跟蹤與渲染旋鈕本身相關(guān)的代碼闸英。
  • RotationGestureRecognizer:一個(gè)私有類,可以與旋鈕進(jìn)行交互介袜。

您的下一個(gè)任務(wù)是將這些組件分成不同的文件甫何。 首先移動(dòng)KnobRenderer

  • 1)轉(zhuǎn)到File ? New ? File…并選擇iOS ? Source ? Swift File
  • 2)點(diǎn)擊Next遇伞。
  • 3)在下一個(gè)屏幕截圖上辙喂,將類名指定為KnobRenderer,然后選擇KnobControl?KnobControl目錄鸠珠。
  • 4)點(diǎn)擊Create
  • 5)打開Knob.swift巍耗,剪切(Command-X)整個(gè)KnobRenderer類并將其粘貼(Command-V)import Foundation語句正下方的KnobRenderer.swift中。
  • 6)刪除KnobRenderer的私有修飾符渐排。 當(dāng)代碼全部包含在Knob.swift中時(shí)炬太,這很好,但現(xiàn)在必須可以使用默認(rèn)的internal修飾符訪問整個(gè)模塊驯耻。

對(duì)RotationGestureRecognizer類重復(fù)步驟1到6亲族。 在這種情況下,當(dāng)您執(zhí)行第五步時(shí)可缚,請(qǐng)確保您還獲取導(dǎo)入UIKit.UIGestureRecognizerSubclass語句霎迫,否則編譯器將在構(gòu)建階段進(jìn)行complain

創(chuàng)建了兩個(gè)新文件后城看,Knob.swift現(xiàn)在只包含Knob類女气。

注意:將類分成它們自己的文件并不是絕對(duì)必要的,但為了使代碼組織起來测柠,這是一個(gè)很好的做法炼鞠。 您不希望擁有難以理解和維護(hù)的龐大文件缘滥。


Add the Framework to the Project - 將框架添加到項(xiàng)目

關(guān)閉KnobControl項(xiàng)目,然后返回KnobShowcase項(xiàng)目谒主。 刪除Knob.swift文件朝扼。 在確認(rèn)對(duì)話框中選擇Move to Trash

Build項(xiàng)目霎肯,你會(huì)看到幾個(gè)可預(yù)測(cè)的錯(cuò)誤擎颖,其中包含了Xcode不知道什么是旋鈕。 好吧观游,你實(shí)際上會(huì)看到Use of undeclared type ‘Knob’錯(cuò)誤消息搂捧。

添加KnobControl框架項(xiàng)目是解決這些問題的方法。


Embed Your Binary - 嵌入你的二進(jìn)制

右鍵單擊項(xiàng)目導(dǎo)航器中的根KnobShowcase節(jié)點(diǎn)懂缕。 單擊Add Files to “KnobShowcase”允跑。 在文件選擇器中,導(dǎo)航到并選擇KnobControl.xcodeproj搪柑。 單擊Add以將KnobControl.xcodeproj添加為子項(xiàng)目聋丝。

注意:將框架項(xiàng)目添加到app項(xiàng)目并不是絕對(duì)必要的。你可以添加KnobControl.framework輸出工碾。但是弱睦,組合這些項(xiàng)目可以更輕松地同時(shí)開發(fā)框架和應(yīng)用程序。 您對(duì)框架項(xiàng)目所做的任何更改都會(huì)自動(dòng)傳播到應(yīng)用程序渊额。 它還使Xcode更容易解析路徑并知道何時(shí)重建項(xiàng)目况木。

Build并運(yùn)行,您將看到相同的編譯錯(cuò)誤端圈!

即使這兩個(gè)項(xiàng)目現(xiàn)在在一起焦读,KnobShowcase仍然沒有得到KnobControl。 這就像他們坐在同一個(gè)房間舱权,但KnobShowcase無法看到新的框架矗晃。

您將框架鏈接到應(yīng)用程序的目標(biāo)以解決此問題。 首先宴倍,展開KnobControl項(xiàng)目以查看Products文件夾张症,然后在其下面查找KnobControl.framework。 此文件是框架項(xiàng)目的輸出鸵贬,用于打包二進(jìn)制代碼俗他,標(biāo)頭,資源和元數(shù)據(jù)阔逼。

選擇頂級(jí)KnobShowcase節(jié)點(diǎn)以打開項(xiàng)目編輯器兆衅。 單擊KnobShowcase目標(biāo),然后轉(zhuǎn)到General選項(xiàng)卡。

向下滾動(dòng)到Embedded Binaries部分羡亩。 將KnobControl.frameworkKnobControl.xcodeprojProducts文件夾拖到此部分摩疑。

您剛剛在Embedded BinariesLinked Frameworks and Binaries中添加了框架條目。

現(xiàn)在應(yīng)用程序知道框架以及在哪里找到它畏铆,所以這應(yīng)該足夠了雷袋,對(duì)吧?

構(gòu)建KnobShowcase項(xiàng)目辞居。 更多相同的錯(cuò)誤楷怒。


Access Control - 訪問獲取控制

你的問題是雖然框架是項(xiàng)目的一部分,但是項(xiàng)目的代碼并不知道它 - 看不見瓦灶。

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

import KnobControl

這很關(guān)鍵倚搬,但是這種包含仍然無法解決構(gòu)建錯(cuò)誤冶共。 這是因?yàn)镾wift使用access control來確定構(gòu)造是否對(duì)其他文件或模塊可見。

默認(rèn)情況下每界,Swift僅在其自己的模塊內(nèi)部使internal或可見。

要恢復(fù)應(yīng)用程序的功能家卖,您必須更新Knob類的訪問控制眨层。

雖然它有點(diǎn)單調(diào)乏味,但更新訪問控制的過程通過隱藏不應(yīng)出現(xiàn)在框架之外的代碼來提高模塊性上荡。 您可以通過將某些函數(shù)保留為無訪問修飾符趴樱,或通過明確聲明它們?yōu)?code>internal來實(shí)現(xiàn)此目的。

Swift有五個(gè)級(jí)別的訪問控制酪捡。 創(chuàng)建自己的框架時(shí)叁征,請(qǐng)遵循以下經(jīng)驗(yàn)法則:

  • Open and public:用于應(yīng)用程序或其他框架調(diào)用的代碼,例如 自定義視圖逛薇。
  • Internal:用于框架內(nèi)的函數(shù)和類之間使用的代碼捺疼,例如 該視圖中的自定義圖層。
  • Fileprivate:用于單個(gè)文件中使用的代碼永罚,例如 一個(gè)幫助函數(shù)啤呼,用于計(jì)算布局高度。
  • Private:用于封閉聲明中使用的代碼呢袱,例如單個(gè)類塊官扣,以及該聲明在同一文件中的擴(kuò)展。

當(dāng)Knob成為Showcase應(yīng)用程序的一部分時(shí)羞福,內(nèi)部訪問不是問題惕蹄。 現(xiàn)在它已經(jīng)在一個(gè)單獨(dú)的模塊中,必須將其公開以供應(yīng)用程序使用它。 你將在下一節(jié)中做到這一點(diǎn)卖陵。

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


Update the Code - 更新代碼

KnobShowcase中打開Knob.swift赶促。 通過將public關(guān)鍵字添加到類定義來使類成為公共液肌,如下所示:

public class Knob : UIControl {

現(xiàn)在任何導(dǎo)入KnobControl框架的應(yīng)用程序文件都可以看到Knob

現(xiàn)在將public關(guān)鍵字添加到:

  • 屬性minimumValue鸥滨,maximumValue嗦哆,value,isContinuous婿滓,lineWidth老速, startAngle,endAngle凸主,pointerLength和color橘券。 注意value,該屬性將是public的卿吐,而setter繼續(xù)是私有的旁舰。
  • 兩個(gè)init函數(shù)。
  • 方法setValue(_:animated :)tintColorDidChange()嗡官。

注意:您可能想知道為什么必須將init方法聲明為public箭窜。 Apple在其訪問控制文檔中解釋了這個(gè)以及其他更精細(xì)的訪問控制點(diǎn)。

現(xiàn)在構(gòu)建并運(yùn)行衍腥。 好消息是錯(cuò)誤消失了磺樱,壞消息是你遇到了如下運(yùn)行時(shí)崩潰:

這是怎么回事? 下一篇會(huì)進(jìn)行介紹婆咸。

后記

本篇主要介紹了一個(gè)詳細(xì)的框架創(chuàng)建流程竹捉,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市尚骄,隨后出現(xiàn)的幾起案子块差,更是在濱河造成了極大的恐慌,老刑警劉巖乖仇,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憾儒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乃沙,警方通過查閱死者的電腦和手機(jī)起趾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來警儒,“玉大人训裆,你說我怎么就攤上這事眶根。” “怎么了边琉?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵属百,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我变姨,道長(zhǎng)族扰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任定欧,我火速辦了婚禮渔呵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砍鸠。我一直安慰自己扩氢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布爷辱。 她就那樣靜靜地躺著录豺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭弓。 梳的紋絲不亂的頭發(fā)上双饥,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音示启,去河邊找鬼兢哭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夫嗓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冲秽,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舍咖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了锉桑?” 一聲冷哼從身側(cè)響起排霉,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎民轴,沒想到半個(gè)月后攻柠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡后裸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年瑰钮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片微驶。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浪谴,死狀恐怖开睡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苟耻,我是刑警寧澤篇恒,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站凶杖,受9級(jí)特大地震影響胁艰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜智蝠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一腾么、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寻咒,春花似錦哮翘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叫挟,卻和暖如春艰匙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抹恳。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工员凝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奋献。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓健霹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瓶蚂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糖埋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 版本記錄 前言 很多時(shí)候我們可以用第三方庫,比如是SDWebImage或者一些視頻云播放器的框架或庫窃这,這些框架其實(shí)...
    刀客傳奇閱讀 946評(píng)論 0 6
  • 本文系半撇私塾新媒體創(chuàng)意寫作項(xiàng)目里程碑作品一 那些色彩斑斕的雨傘瞳别,不是只有在雨天才能看得見。 在位于上海市中心的最...
    觀月岑息閱讀 236評(píng)論 0 0
  • 我記得高中的時(shí)候經(jīng)常聽到一句話 很多人經(jīng)常把它抄下來 感謝曾經(jīng)傷害過我的人杭攻,他們磨礪了我的意志祟敛; 感謝曾經(jīng)欺騙過我...
    DJ沐格閱讀 629評(píng)論 0 0
  • 時(shí)間飛逝,2018年已經(jīng)接近尾聲兆解,回顧這一年來自己制定的目標(biāo)基本都實(shí)現(xiàn)了馆铁。這一年來雖覺得累,但是很充實(shí)痪宰,尤...
    Ivy冬閱讀 185評(píng)論 0 0