Xcode7 Framework探索

在設(shè)計(jì)SDK或其它框架的時(shí)候峡碉,我們大多數(shù)不想將自己的源碼暴露給別人抄课。在iOS中可行的辦法有靜態(tài)庫和靜態(tài)Framework(雖然蘋果今年來開放了動(dòng)態(tài)Framework归形,但是目前項(xiàng)目中用的最多還是前面兩種)糯景。最開始在Xcode中制作靜態(tài)Framework是很麻煩的拴泌,制作靜態(tài)庫要簡單的多贱案,畢竟Xcode帶了這樣一選項(xiàng)肛炮。但是使用Xcode6或7的時(shí)候發(fā)現(xiàn)自帶了和靜態(tài)庫制作一樣的功能,因此制作動(dòng)態(tài)庫已經(jīng)很簡單了宝踪。

1. Framework靜態(tài)庫

其中最重要的設(shè)置就是將Mach-O Type設(shè)為Static Library侨糟,因?yàn)槟J(rèn)創(chuàng)建Framework的時(shí)候是動(dòng)態(tài)庫Dynamic Library類型。

步驟
a. 點(diǎn)擊創(chuàng)建Framework選項(xiàng)

1.png

b. 設(shè)置Mach-O Type為Static Library瘩燥。(如果要支持bitcode秕重, 還需要在TAGETS的Build setting中搜索Other C Flags,添加命令“-fembed-bitcode”)厉膀。

24543C0F-87D3-4673-BDD3-3C50B1C097E1.png
C8929E52-A3B6-4481-8978-A4CC69D94EA5.png

如果沒有加cflags可能在使用的時(shí)候出現(xiàn)以下錯(cuò)誤:


3957B515-0B53-496A-B099-5F1ECD334E77.png

c. 設(shè)置頭文件類型溶耘。(Public(公共的),這里存放供其他人查看的header服鹅。Private(私有的)這里存放私有的Header凳兵,以上兩個(gè)Headers存放位置都會(huì)暴露出來,所有人可以查看企软。有些Header是不想給別人看到的庐扫。這種header放在第三個(gè)類Project中。設(shè)置的時(shí)候直接將工程中的頭文件拖到對(duì)應(yīng)的區(qū)域)仗哨。如果你用了Category形庭,別人在用你的Framework時(shí)會(huì)發(fā)生崩潰。這時(shí)別人在引用時(shí)需要在工程中other linker flags中添加-objC如果依然有問題厌漂,再添加-all_load萨醒。

757C152E-2C8B-47EE-A424-1D9C832A1F4B.png

d.選擇通用iOS設(shè)備build

如果需要制作模擬器和真機(jī)通用版本的可以使用shell腳本在命令行構(gòu)建,也可以在Xcode新建個(gè)build的target桩卵,添加構(gòu)建腳本验靡。
a. 新建target


FA3219B5-2D38-4BA5-8E32-EA61F3C0735F.png

b. 為target添加Run Script,這樣就可以在項(xiàng)目工程文件的Products目錄生成通用的靜態(tài)FrameWork雏节。


0C150FC0-6E11-41E0-9F16-4070E5D485AB.png
# 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 -arch armv7 -arch armv7s -arch arm64 clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator -arch x86_64 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
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"

rm -r "${WRK_DIR}"

open "${SRCROOT}/Products/"

echo ${FMK_NAME}

c. 查看庫的架構(gòu)可以通過file或者lipo命令來查看

BE5F7DE5-962F-4C78-963D-D1B21A874DD9.png

在使用的時(shí)候(鏈接狀態(tài)為Required),我們通過MachOView查看可執(zhí)行文件钩乍,并不能看見動(dòng)態(tài)鏈接了我們的FrameWork辞州,因?yàn)殪o態(tài)庫編譯進(jìn)了二進(jìn)制可執(zhí)行文件中,并不需要?jiǎng)討B(tài)鏈接寥粹。


7C928AAD-0F66-4A00-92FA-97D19F2C6A68.png

2. Framework動(dòng)態(tài)庫

默認(rèn)情況下如果我們不強(qiáng)制設(shè)置Mach-O Type為Static Library变过,那么編譯出來Framework就是動(dòng)態(tài)庫埃元。

a. 使用Xcode自動(dòng)鏈接動(dòng)態(tài)Framework。此時(shí)我們只需要在Embedded Binaries中添加需要使用的動(dòng)態(tài)Framework媚狰,如下圖:


EF75F2CF-B8BC-4F7C-ABED-12A43559407C.png

添加之后在Build Phases中會(huì)多出一項(xiàng)Embed Fraworks岛杀,它的作用也就是拷貝動(dòng)態(tài)庫到Runpath Search Paths目錄。


FA54044E-9958-4D97-AB27-4D23F73B11B6.png

至于app運(yùn)行的時(shí)候如何找到動(dòng)態(tài)庫崭孤,我們可以設(shè)置Runpath Search Paths路徑类嗤。默認(rèn)會(huì)在@executable_path/Frameworks目錄中找,@executable_path/表示可執(zhí)行文件所在路徑辨宠,即沙盒中的.app目錄遗锣,注意不要漏掉最后的/。


FE464BE5-93B6-436D-B173-A3C1F3D06D5E.png

編譯好嗤形,進(jìn)入到生成的.app文件的根目錄精偿,發(fā)現(xiàn)Framework已經(jīng)拷貝到了Frameworks目錄(Runpath Search Paths路徑)。


7A1C1BF9-71EA-4FF0-B71A-84C9C540642D.png

通過MachOView查看可執(zhí)行文件赋兵,這時(shí)候發(fā)現(xiàn)程序需要?jiǎng)討B(tài)鏈接我們剛創(chuàng)建的Framework笔咽。


378BD826-9F2A-4F16-91DE-7A1634A4525C.png

在使用的過程中如果出現(xiàn)ld: warning: embedded dylibs/frameworks only run on iOS 8 or later警告,這是因?yàn)楣こ棠J(rèn)編譯設(shè)置的是Dynamic Framework毡惜。這種編譯只有在iOS8以后才能使用拓轻,因此需要設(shè)置工程最低支持iOS8.0


68611C0C-A325-44DB-852E-31C58747E98F.png

b. dlopen或NSBundle加載動(dòng)態(tài)庫
動(dòng)態(tài)庫中真正的可執(zhí)行代碼為KGSDK.framework/KGSDK文件斯撮,因此使用dlopen時(shí)如果僅僅指定加載動(dòng)態(tài)庫的路徑為KGSDK.framework是沒法成功加載的经伙。使用時(shí)將動(dòng)態(tài)庫傳到特定目錄,然后手動(dòng)加載勿锅,最后用runtime來執(zhí)行相關(guān)操作帕膜。

- (IBAction)clickButton:(id)sender
{
    NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/KGSDK.framework/KGSDK",NSHomeDirectory()];
    [self openDylibWithPath:documentsPath];
}

- (void)openDylibWithPath:(NSString *)path
{
    void* libHandle = NULL;
    libHandle = dlopen([path cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW);
    if (libHandle == NULL) {
        char *error = dlerror();
        NSLog(@"dlopen error: %s", error);
    } else {
        NSLog(@"dlopen load framework success.");
    }
}
- (void)openDylib
{
    NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/KGSDK.framework",NSHomeDirectory()];
    NSError *err = nil;
    NSBundle *bundle = [NSBundle bundleWithPath:documentsPath];
    if ([bundle loadAndReturnError:&err]) {
        NSLog(@"bundle load framework success.");
    } else {
        NSLog(@"bundle load framework err:%@",err);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溢十,隨后出現(xiàn)的幾起案子垮刹,更是在濱河造成了極大的恐慌,老刑警劉巖张弛,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荒典,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吞鸭,警方通過查閱死者的電腦和手機(jī)寺董,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刻剥,“玉大人遮咖,你說我怎么就攤上這事≡炻玻” “怎么了御吞?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵麦箍,是天一觀的道長。 經(jīng)常有香客問我陶珠,道長挟裂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任揍诽,我火速辦了婚禮话瞧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寝姿。我一直安慰自己交排,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布饵筑。 她就那樣靜靜地躺著埃篓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪根资。 梳的紋絲不亂的頭發(fā)上架专,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音玄帕,去河邊找鬼部脚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裤纹,可吹牛的內(nèi)容都是我干的委刘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鹰椒,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锡移!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漆际,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤淆珊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后奸汇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體施符,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年擂找,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戳吝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婴洼,死狀恐怖骨坑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤欢唾,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布且警,位于F島的核電站,受9級(jí)特大地震影響礁遣,放射性物質(zhì)發(fā)生泄漏斑芜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一祟霍、第九天 我趴在偏房一處隱蔽的房頂上張望杏头。 院中可真熱鬧,春花似錦沸呐、人聲如沸醇王。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寓娩。三九已至,卻和暖如春呼渣,著一層夾襖步出監(jiān)牢的瞬間棘伴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工屁置, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焊夸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荷愕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理颇象,服務(wù)發(fā)現(xiàn)伍伤,斷路器并徘,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • 靜態(tài)庫與動(dòng)態(tài)庫的區(qū)別 首先來看什么是庫麦乞,庫(Library)說白了就是一段編譯好的二進(jìn)制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,882評(píng)論 3 42
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,519評(píng)論 25 707
  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動(dòng)態(tài)庫有什么異同劝评?靜態(tài)庫:鏈接時(shí)完整地拷貝至可執(zhí)行文件中姐直,被多次使用就有多份冗...
    190CM閱讀 4,178評(píng)論 0 4
  • 周末一直到昨天都為兒子忙了,復(fù)盤停了兩天蒋畜∩罚總算告一段落了,接下來就等著周末兒子回來了,對(duì)于初中就讓兒子住宿插龄,起初很...
    王沐妍閱讀 236評(píng)論 0 0