任意二進(jìn)制庫支持模擬器

問題描述

iOS開發(fā)中經(jīng)常要用到模擬器确封,甚至比真機(jī)被用得更頻繁礁阁。模擬器相對(duì)真機(jī)有下面幾種優(yōu)勢(shì):

* 模擬器一般不卡勾习,性能往往比在真機(jī)上跑更穩(wěn)定廊宪,因?yàn)殡娔X有更大的內(nèi)存矾瘾,更穩(wěn)定的網(wǎng)絡(luò)。

* 可以模擬系統(tǒng)箭启、設(shè)備壕翩、地理位置等。

* 調(diào)IM時(shí)傅寡,加一個(gè)模擬器放妈,就可以互發(fā)消息了。

* 導(dǎo)Sandbox數(shù)據(jù)方便荐操。

* 抓包比真機(jī)方便芜抒。

* 調(diào)試比真機(jī)方便,真機(jī)需要裝證書托启。

* ...

然而宅倒,有時(shí)候第三方SDK集成時(shí),第三方SDK可能不提供模擬器的x86架構(gòu)屯耸,那么在鏈接時(shí)拐迁,就會(huì)提示無法找到符號(hào)。

如項(xiàng)目中引入不支持模擬器的SDK疗绣,鏈接時(shí)线召,會(huì)報(bào)沒有找到x86_64架構(gòu)對(duì)應(yīng)的符號(hào):

如果用lipo -info 命令查看libMyLib.a這個(gè)庫,就會(huì)發(fā)現(xiàn)它只提供了 arm7和 arm64兩種架構(gòu)多矮,而沒有x86_64架構(gòu)灶搜。

# lipo -info libMyLib.a

Architectures in the fat file: libMyLib.a are: armv7 arm64

如果碰到這種庫,引入它之后工窍,項(xiàng)目就不再能在模擬器上運(yùn)行了割卖,因?yàn)樗溄佣疾粫?huì)過。而我們往往希望引入庫之前的其他功能仍能在模擬器上調(diào)試患雏。

解決思路

你可以要求SDK廠商提供模擬器的版本鹏溯,他們頂多改幾行腳本,多產(chǎn)生一個(gè)x86架構(gòu)淹仑,再把兩個(gè).a合并就行丙挽。但是如果碰上比較老沒有維護(hù)的SDK肺孵,或者廠商認(rèn)為SDK不需要考慮模擬器上運(yùn)行的場(chǎng)景,那就比較麻煩了颜阐。

你可以把所有用到SDK的代碼通過TARGET_OS_SIMULATOR宏來判斷平窘。但是這樣可能工作量比較大,而且容易出問題凳怨。

這里另外給出一種思路瑰艘,我們可以根據(jù)庫中的頭文件,自己空實(shí)現(xiàn)這些接口肤舞,最后編譯產(chǎn)生一個(gè)x86架構(gòu)的庫紫新,并把它加到工程里面,這樣工程鏈接時(shí)就不會(huì)出錯(cuò)了李剖。

空實(shí)現(xiàn)芒率,指的是函數(shù)里什么都不做,直接返回篙顺。如:

+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action {

? ? return 0;

}

我們知道偶芍,objc里面,如果調(diào)用空對(duì)象的方法德玫,程序并不會(huì)有問題匪蟀,只是什么都不做。如下面代碼化焕,雖然footer為nil萄窜,仍不會(huì)崩潰。

MyRefreshFooter *footer = [MyRefreshFooter footerWithRefreshingTarget:nil refreshingAction:nil];

[footer resetNoMoreData];

所以在模擬器上除了SDK的功能不能用撒桨,其他模塊的功能并不會(huì)受影響查刻。

這種思路除了能解決編譯問題,還有種好處是凤类,不用改任何原來工程中的代碼穗泵,只是附加了一個(gè)x86的lib,不影響應(yīng)用在真機(jī)上的功能谜疤。

確定了這種思路后佃延,還可以把這種邏輯泛化應(yīng)用到任意的庫中,通過使用適當(dāng)?shù)墓ぞ咭目模梢宰詣?dòng)解析objc或cpp的頭文件履肃,產(chǎn)生相應(yīng)空實(shí)現(xiàn)的代碼,并編譯產(chǎn)生需要的x86架構(gòu)的庫坐桩。

?著作權(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
  • 我被黑心中介騙來泰國打工杖小, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肆汹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓予权,卻偏偏與公主長(zhǎng)得像昂勉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扫腺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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