Swift + framework 的制作(基于project)

1.framework開始前的 理論

1).初衷

開始的理由千千萬(wàn),但殊途同歸.
(1) 提供給公司外部的人員使用, 不希望暴露內(nèi)部"高大上"的實(shí)現(xiàn)
(2) 公司內(nèi)部多個(gè)項(xiàng)目公用資源, 使用方便
(3) 模塊化榕吼、分工合作, 架構(gòu)組完成基礎(chǔ)的實(shí)現(xiàn), 功能開發(fā)工程師只需要關(guān)注功能實(shí)現(xiàn), 不需要關(guān)注底層實(shí)現(xiàn)
(4) 提高編譯速度顽素,減少少量的改動(dòng)引起的大量重復(fù)的編譯
......

2).動(dòng)態(tài)庫(kù),靜態(tài)庫(kù)

動(dòng)態(tài)庫(kù)存在形式: .framework, .dylib, .tbd

動(dòng)態(tài)庫(kù)是引用關(guān)系徒蟆,編譯時(shí)不會(huì)被拷貝到程序中胁出,程序運(yùn)行時(shí) 由系統(tǒng)動(dòng)態(tài)加載

靜態(tài)庫(kù)存在形式: .a 和 .framework

靜態(tài)庫(kù)編譯時(shí)會(huì)被完整拷貝一份到目標(biāo)程序中

動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)詳細(xì)的區(qū)別 參考:
https://my.oschina.net/shoutan/blog/786636

2.創(chuàng)建framework

1).創(chuàng)建工程

模板選擇Cocoa Touch Framework

1創(chuàng)建framework.png
2).編寫自定義代碼

對(duì)需要共享的內(nèi)容分模塊添加

2編輯自定義代碼.png
!建庫(kù)時(shí)不得不注意的就是 swift的訪問(wèn)級(jí)別

Swift 提供了三種訪問(wèn)級(jí)別段审。這些訪問(wèn)級(jí)別相對(duì)于源文件中定義的實(shí)體全蝶,同時(shí)也相對(duì)于這些源文件所屬的模塊。
其中,函數(shù)的訪問(wèn)級(jí)別需要根據(jù)該函數(shù)的參數(shù)類型訪問(wèn)級(jí)別抑淫、返回類型訪問(wèn)級(jí)別得出绷落。如果根據(jù)參數(shù)類型和返回類型得出的函數(shù)訪問(wèn)級(jí)別不符合上下文,那么就需要明確的申明該函數(shù)的訪問(wèn)級(jí)別始苇。

代碼中的所有實(shí)體砌烁,如果你不明確的定義其訪問(wèn)級(jí)別,那么它們默認(rèn)為internal級(jí)別催式, 所以函喉, 只是在一個(gè)工程中使用, 可以不用聲明訪問(wèn)類型荣月, 該工程 均可訪問(wèn)函似。

swift 三個(gè)等級(jí)的訪問(wèn)控制權(quán)限,可以簡(jiǎ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)

具體參考文檔: http://wiki.jikexueyuan.com/project/swift/

3.編譯 真機(jī) / 模擬器 的 包

1).編譯

對(duì)工程進(jìn)行編譯(command + B), 找到project->products->選中EKWBaseUIKit.framework->Show In Finder撇寞, 如下圖:

3編譯得到framework.png
2).查看庫(kù)文件

可以看到生成的 真機(jī)和模擬器下的兩個(gè)包文件(當(dāng)前設(shè)置的模式為release模式, 所以為release模式下的兩個(gè)包文件)堂氯, 如下圖:

編譯得到的庫(kù)文件.png
3). 查看庫(kù)文件支持框架

在終端通過(guò)lipo -info 靜態(tài)庫(kù)名字可以查看動(dòng)態(tài)庫(kù)支持的架構(gòu), 如下:

4lipinfo.gif

可以看到當(dāng)前支持的框架包含: 有armv7arm64

目前iOS設(shè)備包含的架構(gòu):
模擬器:iPhone4s-iPnone5:i386蔑担; iPhone5s-iPhone7 Plus:x86_64
真機(jī): iPhone3gs-iPhone4s:armv7; iPhone5-iPhone5c:armv7s咽白; iPhone5s-iPhone7Plus:arm64

我們需要把對(duì)應(yīng)的framework引入工程中即可使用啤握, 但是我們平時(shí)可能用到真機(jī)調(diào)試,也可能使用模擬器調(diào)試晶框,來(lái)回切換framework會(huì)很繁瑣排抬,所以一般使用終端把支持真機(jī)和模擬器的framework合并成一個(gè)framework(fat版)

命令格式:lipo -create 第一個(gè).framewor下的esec文件的絕對(duì)路徑 第二個(gè).framework下的esec文件的絕對(duì)路徑 -output 最終的.framework文件路徑
操作如下:

lipocreate.gif

4.使用腳本編譯

如上的單調(diào)頻繁的操作可能會(huì)讓你感覺(jué)累覺(jué)不愛(ài),xcode目前支持的腳本編譯授段,包治百病

1).創(chuàng)建Aggregate

targets點(diǎn)擊左下角 “+”蹲蒲, 添加Aggregate

創(chuàng)建Aggregate.png
2). 添加腳本文件
添加腳本.png

Run Script 中可以放入待執(zhí)行的腳本文件, 也可以放入待執(zhí)行的腳本侵贵, 但是放入待執(zhí)行腳本時(shí)届搁, 遇到過(guò)文件權(quán)限的問(wèn)題(涉及pod管理的framework), 所以此處推薦使用腳本文件的路徑代替腳本

3).使用到的腳本如下:
#!/bin/sh
#要build的target名
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}_Products/"

#創(chuàng)建輸出目錄窍育,并刪除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"

#分別編譯模擬器和真機(jī)的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

#拷貝framework到univer目錄
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"

#合并framework卡睦,輸出最終的framework到build目錄
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"

#刪除編譯之后生成的無(wú)關(guān)的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done
#判斷build文件夾是否存在,存在則刪除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
#打開合并后的文件夾
open "${UNIVERSAL_OUTPUT_FOLDER}"

4). 腳本以及生成的framework位置
腳本位置:framework位置.png
5).檢測(cè) framework支持的類型

使用lipo -info ...查看合成的framework支持的類型 包含:i386漱抓, Plus:x86_64表锻, armv7, arm64

framework 支持框架.gif

6.framework制作過(guò)程中的坑

1. Module

在工程中乞娄, 我們可以通過(guò)橋接文件引入需要使用的OC或者C相關(guān)的瞬逊, 但是swift動(dòng)態(tài)庫(kù)中檐迟, 是不能使用橋接文件的,比如: 需要使用CommonCrypto里面的內(nèi)容码耐, 在工程中可以直接導(dǎo)入CommonCrypto使用追迟, 在庫(kù)中則不能使用

8056F28B-E7F2-46C2-A2DF-D9429B6F25B1.png

這個(gè)問(wèn)題可以使用模塊化解決:
1).創(chuàng)建一個(gè)模塊化文件, 并加入對(duì)應(yīng)模塊

26C785ABDF49722CC331A28B994DD3E9.png
module CCommonCrypto [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h"
export *
}

2). 模塊化的使用
在需要使用的文件中 輸入 import CCommonCrypto即可使用相關(guān)內(nèi)容

3)參考文檔
https://spin.atomicobject.com/2015/02/23/c-libraries-swift/ 英文原文
http://blog.csdn.net/quentingui/article/details/44115285 翻譯
http://www.ethanwhy.com/2016/12/17/swift-framework-call-objective-c-c-language/
https://stackoverflow.com/questions/25248598/importing-commoncrypto-in-a-swift-framework/37125785#37125785
https://github.com/onmyway133/arcane

更新(2018-10-12):
xcode10中, swift增加了對(duì) CommonCrypto的支持骚腥,在需要使用的 CommonCrypto的swift庫(kù)中敦间,不需要Module的方式,直接添加使用即可束铭,如下:

import CommonCrypto

自己封裝的庫(kù)也可能使用了pod管理廓块,基于workspace的庫(kù)的制作將在接下來(lái)的文章中談到...

以上僅是個(gè)人使用總結(jié),歡迎批評(píng)指正補(bǔ)充~~~~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市契沫,隨后出現(xiàn)的幾起案子带猴,更是在濱河造成了極大的恐慌,老刑警劉巖懈万,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴清,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡会通,警方通過(guò)查閱死者的電腦和手機(jī)口予,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涕侈,“玉大人沪停,你說(shuō)我怎么就攤上這事∩烟危” “怎么了木张?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)端三。 經(jīng)常有香客問(wèn)我舷礼,道長(zhǎng),這世上最難降的妖魔是什么技肩? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任且轨,我火速辦了婚禮浮声,結(jié)果婚禮上虚婿,老公的妹妹穿的比我還像新娘。我一直安慰自己泳挥,他們只是感情好然痊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屉符,像睡著了一般剧浸。 火紅的嫁衣襯著肌膚如雪锹引。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天唆香,我揣著相機(jī)與錄音嫌变,去河邊找鬼。 笑死躬它,一個(gè)胖子當(dāng)著我的面吹牛腾啥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冯吓,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼倘待,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了组贺?” 一聲冷哼從身側(cè)響起凸舵,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎失尖,沒(méi)想到半個(gè)月后啊奄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掀潮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年增热,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胧辽。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峻仇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邑商,到底是詐尸還是另有隱情摄咆,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布人断,位于F島的核電站吭从,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恶迈。R本人自食惡果不足惜涩金,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暇仲。 院中可真熱鬧步做,春花似錦、人聲如沸奈附。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斥滤。三九已至将鸵,卻和暖如春勉盅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顶掉。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工草娜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痒筒。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓驱还,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親凸克。 傳聞我的和親對(duì)象是個(gè)殘疾皇子议蟆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別 首先來(lái)看什么是庫(kù)咐容,庫(kù)(Library)說(shuō)白了就是一段編譯好的二進(jìn)制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,938評(píng)論 3 42
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)蚂维、插件戳粒、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 2017.7.4 星期二 晴轉(zhuǎn)小雨 親子日記(72) 今天把兒子送托付去了,中午去給他送涼席虫啥,看到他在托付很開心...
    于澤媽媽閱讀 211評(píng)論 0 0
  • 想了半天蔚约,還是用這么俗的一個(gè)標(biāo)題,我也是一個(gè)俗人涂籽,從小就不安分苹祟,骨子深處藏著叛逆和不服,小的時(shí)候表現(xiàn)的還算乖巧评雌,只...
    unsaid閱讀 177評(píng)論 0 1
  • 第一次在黑板報(bào)上畫蝴蝶树枫。
    northern姑娘閱讀 200評(píng)論 0 2