創(chuàng)建發(fā)布 Cocoapods Framework (swift版本)

前言

翻譯已與 raywenderlich 社區(qū)取得聯(lián)系(可翻譯10篇文章)抒钱,原文鏈接

是否想過(guò)把參與過(guò)的多個(gè)項(xiàng)目中功能相近的代碼拆分成可復(fù)用的模塊呢铆,是否想過(guò)與其他開(kāi)發(fā)者分享你寫的模塊贷屎?

也許你想像 iOS SDK 按功能來(lái)組織 API 一樣來(lái)模塊化你的代碼罢防,也許也想像知名三方庫(kù)那樣發(fā)布自己的代碼。

通過(guò)這篇文章你將會(huì)學(xué)會(huì)如何創(chuàng)建 Framework 以及如何進(jìn)行發(fā)布唉侄。

iOS 8咒吐,Xcode 6 中,蘋果提供了一種新的開(kāi)發(fā)模板属划,Cocoa Touch Framework恬叹。這使得創(chuàng)建 Framework 更加容易。

Framework 有一下三個(gè)主要目的:

  • 代碼封裝
  • 代碼模塊化
  • 代碼復(fù)用

你可以在你的其他 App 中同眯,團(tuán)隊(duì)成員绽昼,或 iOS 社區(qū)分享你的 Framework。swift 的訪問(wèn)控制機(jī)制使得 framework 在代碼模塊之間提供了健壯可靠的接口须蜗。

swift 中硅确,module 是作為一個(gè)編譯發(fā)布的代碼單元。framework 和 App 都是一種 module明肮。

在這篇教程中菱农,我們將會(huì)拆解一個(gè)已存在的 App 為例子,通過(guò)下面的步驟把部分代碼拆分出來(lái)打包成 framework :

  • 為 rings widget 創(chuàng)建一個(gè)新的 framework
  • 將代碼和測(cè)試單元移植到 framework 中
  • 導(dǎo)入 framework 到 App 中
  • 打包成 cocoapods
  • 為你的 framework 設(shè)置代碼倉(cāng)庫(kù)

完成上面步驟后柿估,你已經(jīng)成功將該 App 中的部分代碼打包成了可移植的 framework循未。

開(kāi)始

下載 Phonercise Starter Project

Phonercise 是一款簡(jiǎn)單的呈現(xiàn)蘋果手表 Activity 應(yīng)用數(shù)據(jù)的 App,另外還會(huì)記錄你手機(jī)的物理狀態(tài)秫舌。主界面的三個(gè)環(huán)分別代表移動(dòng)的妖,站立,運(yùn)動(dòng)足陨。

該項(xiàng)目需要在真機(jī)上進(jìn)行調(diào)試嫂粟,并打開(kāi)音量,開(kāi)始吧钠右。

移動(dòng)手機(jī)赋元,搖晃手機(jī),保持站立來(lái)分別記錄移動(dòng)飒房,運(yùn)動(dòng)搁凸,站立的數(shù)據(jù)。

該 App 的邏輯如下:

  • ActionViewController 包含 view 的生命周期管理和動(dòng)作邏輯狠毯。
  • 所有包含視圖邏輯的文件都在 Three Ring View 這個(gè)文件夾下护糖。該文件夾下有管理視圖的 ThreeRingView.swift 類,管理音頻的 Fanfare.swift 類嚼松,和管理管理自定義視圖的其他類嫡良。

下面開(kāi)始將環(huán)的控制打包成可復(fù)用的 framework锰扶。

創(chuàng)建 Framework

framework 是自包含,可復(fù)用的代碼和其他資源的組織單元寝受。你可以將 framework 導(dǎo)入其他 App 中坷牛,甚至可以在 iOS,tvOS很澄,watchOS 和 macOS 跨平臺(tái)使用京闰。

如果你使用過(guò)其他編程語(yǔ)言,你應(yīng)該聽(tīng)過(guò)節(jié)點(diǎn)模塊甩苛,包蹂楣,gems,jars 等等讯蒲。framework 是 Xcode 對(duì)于包或者模塊的實(shí)現(xiàn)方式痊土。比如 iOS SDK 中通用的 framework:Foundation, UIKit, AVFoundation, CloudKit 等。

設(shè)置 Framework

Xcode 6˙中開(kāi)始新增了 Cocoa Touch Framework 代碼模板墨林,這使得創(chuàng)建 framework 變得非常容易赁酝。首先創(chuàng)建 framework 的項(xiàng)目。

  1. Xcode 中萌丈,通過(guò) File/New/Project 創(chuàng)建一個(gè)新項(xiàng)目赞哗。
  2. 選擇 iOS/Framework & Library/Cocoa Touch Framework 創(chuàng)建一個(gè)新的 framework。
  1. 點(diǎn)擊 Next
  2. 設(shè)置 Product Name 為 ThreeRingControl辆雾。使用你自己的 Organization Name 和 Organization Id恩替覅而肪笋。點(diǎn)擊 Include Unit Tests。這樣項(xiàng)目將會(huì)包含測(cè)試單元來(lái)確保項(xiàng)目中沒(méi)有 bug度迂。
  1. 點(diǎn)擊 Next
  2. 在文件選擇框中藤乙,選擇在 Phonercise 項(xiàng)目同級(jí)目錄中創(chuàng)建項(xiàng)目。
  1. 點(diǎn)擊 Create

現(xiàn)在已成功創(chuàng)建了一個(gè) framework惭墓。

添加代碼和資源

現(xiàn)在你的 framework 中還沒(méi)有代碼坛梁。從 Phonercise 項(xiàng)目中把以下八個(gè)文件拖拽到當(dāng)前項(xiàng)目中:

  • CircularGradient.swift
  • coin07.mp3
  • Fanfare.swift
  • RingLayer.swift
  • RingTip.swift
  • ThreeRingView.swift
  • Utilities.swift
  • winning.mp3

點(diǎn)擊了 Copy items if needed,確保文件被拷貝進(jìn)了新項(xiàng)目而不是只添加了文件的引用腊凶。framework 需要自己的源碼文件而不是文件引用划咐。

編譯,確保編譯沒(méi)有任何警告和錯(cuò)誤钧萍。

將 Framework 添加到項(xiàng)目中

回到 Phonercise 項(xiàng)目中褐缠。刪除 Three Ring View 組下的六個(gè)文件和 Helper Files 文件夾下兩個(gè) MP3 文件。點(diǎn)擊 Move to Trash风瘦。

編譯队魏,出現(xiàn) “Use of undeclared type 'ThreeRingView” 錯(cuò)誤信息。

Phonercise 項(xiàng)目導(dǎo)航器中右鍵万搔,點(diǎn)擊 Add Files to "Phonercise"胡桨。在文件選擇器中選擇 ThreeRingControl.xcodeproj官帘。這樣把 ThreeRingControl.xcodeproj 作為子項(xiàng)目添加進(jìn)來(lái)。

注意:也可以直接添加 ThreeRingControl.framework 到項(xiàng)目中昧谊。然而添加整個(gè)項(xiàng)目會(huì)讓同時(shí)開(kāi)發(fā) framework 和 App 變得更容易刽虹。你對(duì) framework 項(xiàng)目做的任何改變都將自動(dòng)應(yīng)用到 App 上。

雖然這兩個(gè)項(xiàng)目在同一工作空間中揽浙,Phonercise 仍然無(wú)法訪問(wèn) ThreeRingControl状婶。

通過(guò)鏈接 framework 到 App 的 target 能夠解決這個(gè)問(wèn)題意敛。打開(kāi) ThreeRingControl 項(xiàng)目的 Products 文件夾馅巷,里面有一個(gè) ThreeRingControl.framework 文件。該文件打包了二進(jìn)制代碼草姻,頭文件钓猬,資源等。

點(diǎn)擊 Phonercise 項(xiàng)目的項(xiàng)目導(dǎo)航器撩独,點(diǎn)擊 Phonercise target敞曹,選擇 General tab。

滾動(dòng)到 Embedded Binaries 選擇综膀。把 ThreeRingControl.xcodeproj Products 文件夾下的 ThreeRingControl.framework 拖拽到該選項(xiàng)中澳迫。

這樣同時(shí)為 Embedded Binaries 和 Linked Frameworks and Binaries 添加了 framework 的入口。

這樣 App 就知道如何查找該 framework剧劝,編譯橄登,出現(xiàn)更多相同錯(cuò)誤。

訪問(wèn)控制

此時(shí)雖然 framework 已經(jīng)是該項(xiàng)目的一部分了讥此,但該項(xiàng)目代碼仍然無(wú)法訪問(wèn)拢锹。

進(jìn)入 ActionViewController.swift,在該文件的頂部添加如下代碼進(jìn)行導(dǎo)入萄喳。

import ThreeRingControl

導(dǎo)入后仍然沒(méi)有解決錯(cuò)誤信息卒稳。因?yàn)?swift 使用了訪問(wèn)控制權(quán)限來(lái)讓開(kāi)發(fā)者決定哪些東西可以暴露給其他用戶。

swift 默認(rèn)使用 internal 訪問(wèn)控制權(quán)限他巨,這使得代碼僅在模塊內(nèi)可見(jiàn)充坑。

雖然很麻煩,但訪問(wèn)控制權(quán)限讓開(kāi)發(fā)者能夠隱藏核心功能以防被修改染突,或者顯示的通過(guò) internal 來(lái)暴露給其他用戶捻爷。

swift 有三個(gè)等級(jí)的訪問(wèn)控制權(quán)限。通過(guò)下面的規(guī)則來(lái)進(jìn)行選擇:

  • Public: 對(duì) App 或其他 framework 可見(jiàn)觉痛。
  • Internal: 對(duì)該 framework 可見(jiàn)
  • Fileprivate: 對(duì)該編譯文件可以見(jiàn)
  • Private: 對(duì)該類可見(jiàn)

創(chuàng)建 Cocoapod 源

創(chuàng)建 Pod

在終端進(jìn)入到 ThreeRingControl 目錄下役衡。運(yùn)行下面命令:

pod spec create ThreeRingControl

該命令會(huì)在當(dāng)前目錄下創(chuàng)建 ThreeRingControl.podsepc 文件。該模板文件描述了 pod 以及如何進(jìn)行編譯薪棒。通過(guò) vi 打開(kāi)手蝎。

該模板文件包含大量注釋和通用設(shè)置建議

  1. 使用下面代碼替換 Spec Metadata:
s.name         = "ThreeRingControl"
s.version      = "1.0.0"
s.summary      = "A three-ring control like the Activity status bars"
s.description  = "The three-ring is a completely customizable widget that can be used in any iOS app. It also plays a little victory fanfare."
s.homepage     = "http://raywenderlich.com"

2.該 iOS framework 使用了 MIT 協(xié)議榕莺,使用下面的代碼替換 Spec License:

s.license      = "MIT"

3.該 framework 僅用于 iOS 平臺(tái),使用下面的代碼替換 Platform Specifics:

s.platform     = :ios, "10.0"

4.使用下面代碼替換 Source Location棵介。當(dāng)你想通過(guò) pod 進(jìn)行發(fā)布钉鸯,需要將這里替換成 GitHub repo 的地址和提交的 tag。

s.source       = { :path => '.' }

5.使用下面代碼替換 Source Code:

s.source_files = "ThreeRingControl", "ThreeRingControl/**/*.{h,m,swift}"

6.添加 Resources 項(xiàng):

s.resources    = "ThreeRingControl/*.mp3"

這樣可以把音頻文件包含進(jìn) framework 的 bundle 中邮辽。

7.刪除 Project Linking 和 Project Setting 項(xiàng)唠雕。

8.指定該 pod 代碼使用的 swift 版本號(hào)。

s.pod_target_xcconfig = { 'SWIFT_VERSION' => '3' }

9.刪除多余的注釋(注釋以#開(kāi)頭)

使用 Pod

這一節(jié)會(huì)帶領(lǐng)你完成最后一步吨述,發(fā)布 pod 到 GitHub岩睁。

發(fā)布到 Pod

創(chuàng)建代碼倉(cāng)庫(kù)

如果你還沒(méi)有 GitHub 賬號(hào),創(chuàng)建賬號(hào).
創(chuàng)建一個(gè)托管該 pod 代碼的新倉(cāng)庫(kù)揣云。把該倉(cāng)庫(kù)命名為 ThreeRingControl捕儒,也可以使用任何其他名字。確保 .gitignore 選項(xiàng)為 swift license 為 MIT邓夕。

點(diǎn)擊創(chuàng)建倉(cāng)庫(kù)刘莹。

克隆倉(cāng)庫(kù)

回到終端創(chuàng)建一個(gè)新的文件夾。下面的命令會(huì)創(chuàng)建一個(gè)名為 repo 的文件夾焚刚。

mkdir repo
cd repo

克隆剛才創(chuàng)建的 GitHub 倉(cāng)庫(kù)点弯。替換下面命令中 URL 為 GitHub 倉(cāng)庫(kù)的鏈接。

git clone URL

這會(huì)創(chuàng)建一個(gè) Git 文件夾矿咕,并把之前創(chuàng)建的 README 和 LICENSE 文件克隆下來(lái)抢肛。

把代碼拷貝到克隆下來(lái)的文件夾中

把 ThreeRingControl 文件夾中的文件拷貝到 repo/ThreeRingControl 文件夾中。
打開(kāi)拷貝的 ThreeRingControl.podsepc痴腌,更新 s.source 信息:

s.source       = { :git => "URL", :tag => "1.0.0" }

把 URL 設(shè)置你的 GitHub 上代碼倉(cāng)庫(kù)鏈接雌团。

提交代碼

提交并把代碼 push 到 GitHub 上。

cd ThreeRingControl/
git add .
git commit -m "initial commit"
git push

打標(biāo)記

運(yùn)行下面命令給倉(cāng)庫(kù)打上標(biāo)記士聪,以便 Podspec 能夠匹配锦援。

git tag 1.0.0
git push --tags

歡迎關(guān)注我的簡(jiǎn)書,我會(huì)定期做一些技術(shù)分享:)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末剥悟,一起剝皮案震驚了整個(gè)濱河市灵寺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌区岗,老刑警劉巖略板,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異慈缔,居然都是意外死亡叮称,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瓤檐,“玉大人赂韵,你說(shuō)我怎么就攤上這事∧域龋” “怎么了祭示?”我有些...
    開(kāi)封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谴古。 經(jīng)常有香客問(wèn)我质涛,道長(zhǎng),這世上最難降的妖魔是什么掰担? 我笑而不...
    開(kāi)封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任汇陆,我火速辦了婚禮,結(jié)果婚禮上恩敌,老公的妹妹穿的比我還像新娘瞬测。我一直安慰自己,他們只是感情好纠炮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著灯蝴,像睡著了一般恢口。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上穷躁,一...
    開(kāi)封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天耕肩,我揣著相機(jī)與錄音,去河邊找鬼问潭。 笑死猿诸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狡忙。 我是一名探鬼主播梳虽,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼灾茁!你這毒婦竟也來(lái)了窜觉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤北专,失蹤者是張志新(化名)和其女友劉穎禀挫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拓颓,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡语婴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砰左。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡画拾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菜职,到底是詐尸還是另有隱情青抛,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布酬核,位于F島的核電站蜜另,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫡意。R本人自食惡果不足惜举瑰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔬螟。 院中可真熱鬧此迅,春花似錦、人聲如沸旧巾。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鲁猩。三九已至坎怪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廓握,已是汗流浹背搅窿。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隙券,地道東北人男应。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像娱仔,于是被迫代替她去往敵國(guó)和親沐飘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)拟枚、插件薪铜、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • 什么是好書隔箍? 我的答案是:符合你目前的狀態(tài)和需求,能讓你做出哪怕一點(diǎn)點(diǎn)的改變脚乡。 但是蜒滩,這樣的好書有很多滨达,怎么辦? ...
    小白和小布頭們閱讀 997評(píng)論 7 35
  • 與其說(shuō)這是爸爸寫給女兒的信,不如說(shuō)是情書竹握,封封訴說(shuō)著相思画株,字字傾訴著愛(ài)。作家丁午在那段深重荒誕的歲月里啦辐,經(jīng)...
    陽(yáng)光ai森林閱讀 552評(píng)論 0 0
  • 這兩日因一位合一家人來(lái)家玩谓传,倆人在聊天中總會(huì)因觀點(diǎn)的不同時(shí)而發(fā)生沖突與爭(zhēng)執(zhí)。過(guò)程中自己完全失去覺(jué)知芹关,被對(duì)方的語(yǔ)言內(nèi)...
    和蔓閱讀 389評(píng)論 0 2