Framework開發

之前一直想要封裝一個自己積累的“工具包”,以便日后搬磚家伙齊全一些,但是出于”懶“進而遲遲沒有邁出第一步;最近對支付、數據持久化、動畫將進一步學習與總結。

首先對整體的 iOS 的庫有個整體的概念

庫是共享程序代碼的方式,一般分為靜態庫和動態庫。

靜態庫:鏈接時完整地拷貝至可執行文件中,被多次使用就有多份冗余拷貝。【.a和.framework】

動態庫:鏈接時不復制,程序運行時系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存?!?dylib和.framework】

注:系統的.framework是動態庫,我們自己建立的.framework是靜態庫。

網上的相關資料有很多,主要參考進行學習,為方便記憶,主要以截圖的方式進行記錄:

創建新的工程


為做實例,簡單的輸出一個message
在此設置需要給外界暴露的.h,然后Run,


找到生成的Framework所在位置,導出用于新工程


存儲路徑如上


導入新的工程之后的目錄結構
run --- crash

在stackoverflow上找到關于Link binary 和 Embeb Framework 的區別,感覺原文更直接,就直接復制過過來了;

??http://stackoverflow.com/questions/27015154/link-binary-with-libraries-vs-embed-frameworks

Link?binary with libraries Linkframeworks and libraries with your project’s object files to produce a binaryfile. You can link a target’s source files against libraries in the target’sactive SDK or against external libraries.

Embed?Frameworks You can create an embedded framework to share code between your app extension andits containing app.

在Embebdded Binaries中將自定義的Framework添加進去


制作通用動態庫,這一塊目前還沒有完全理解,先記錄一下流程,

新建Aggregate Target

添加script到新建的Target

# Sets the target folders and the final framework product.

# 如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME

# 例如: FMK_NAME = "MyFramework"

FMK_NAME=${PROJECT_NAME}

# Install dir will be the final output to the framework.

# The following line create it in the root folder of the current project.

INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework

# Working dir will be deleted after the framework creation.

WRK_DIR=build

DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework

SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework

# -configuration ${CONFIGURATION}

# Clean and Building both architectures.

xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build

xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build

# Cleaning the oldest.

if [ -d "${INSTALL_DIR}" ]

then

rm -rf "${INSTALL_DIR}"

fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"

# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"

rm -r "${WRK_DIR}"

open "${INSTALL_DIR}"

選中新建的Target,Run, 如果沒有異常的話,會自動彈出生成的Framework文件

這樣生成的動態庫就能同時支持模擬器和真機了

xCode6下制作通用靜態庫

上面我們也提到了,這樣生成的動態庫恐怕很難在xCode5上使用,那我們為什么非要用動態庫呢,一般情況下不是用靜態庫就好了嗎? So Easy!只需要修改一個參數即可生成靜態庫了

使用靜態庫的話,就可以把Framework從‘Embedded Binaries’中刪除了. 親測在xCode5下可用。把新生成的庫導入到測試工程,試試在模擬器和真機上運行,一切OK.

不巧,如果你用的真機是iPhone5 C, 那悲劇又要發成了,生成的Framework竟然不支持armv7s,不知是xCode6的bug,還是因為蘋果認為使用armv7s的設備太少,可以不支持了.xCode6新建工程,默認的Architectures竟然不包含armv7s

想要生成的庫支持armv7s,把armv7s添加到Architectures中,重新生成Framework即可

判斷一個Framework支持哪些架構

我們該怎么驗證生成的Framework支持哪些平臺呢,總不能一個個測試吧?當然不用.下面的命令是加上armv7s前后生成的framework的對比

Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework

Architectures in the fat file: ./MyFramework.framework/MyFramework are: i386 x86_64 armv7 arm64

Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework

Architectures in the fat file: ./MyFramework.framework/MyFramework are: armv7 armv7s i386 x86_64 arm64



制作Framework的注意事項

1注意理解:無論是.a靜態庫還.framework靜態庫,我們需要的都是二進制文件+.h+其它資源文件的形式,不同的是,.a本身就是二進制文件,需要我們自己配上.h和其它文件才能使用,而.framework本身已經包含了.h和其它文件,可以直接使用。

2圖片資源的處理:兩種靜態庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內容可以向其中添加圖片資源。

3 category是我們實際開發項目中經常用到的,把category打成靜態庫是沒有問題的,但是在用這個靜態庫的工程中,調用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態庫的工程中配置other

linker flags的值為-ObjC 。(注:一些第三方庫里對系統庫的類加了category;這時,就需要使用編譯參數:-ObjC,這樣第三方庫中對系統類作的擴展方法才能在工程中使用)

4如果一個靜態庫很復雜,需要暴露的.h比較多的話,就可以在靜態庫的內部創建一個.h文件(一般這個.h文件的名字和靜態庫的名字相同),然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了。


接下來對github的本地倉庫與遠程倉庫進行總結,代碼總的有個歸宿。。。。利人利己

更多精彩內容請關注“IT實戰聯盟”哦~~~

![IT實戰聯盟.jpg](http://upload-images.jianshu.io/upload_images/326255-f67b0f0dd5fe5874.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/500)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容