我們永遠(yuǎn)也看不透事物的本質(zhì),看到的只是自己思想的倒影!
開發(fā)背景
? ? ? ?在iOS應(yīng)用開發(fā)中,不免需要引入一些第三方SDK,方便開發(fā)。比如藍(lán)牙或相機(jī)掃描身份證IDCardRecognition
之類的。
存在問題
? 這些SDK僅支持真機(jī)不支持模擬器。即,真機(jī)上可以正常運(yùn)行,而模擬器會(huì)報(bào)錯(cuò),如error: Building for iOS Simulator, but the linked library 'OnlyForiOS.a' was built for iOS. (in target 'TestTarget' from project 'TestTarget')或者Undefined symbols for architecture x86_64...ld:symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
參考解決辦法
- 寫腳本或新建scheme
參考鏈接1:關(guān)于“不支持模擬器調(diào)試的第三方SDK”解決辦法 - 模擬器刪除相關(guān)第三方
copy新建一份代碼,刪除相關(guān)第三方,實(shí)現(xiàn)在模擬器上查看界面
不足
? 1.寫腳本繁瑣,對(duì)不懂腳本語言的同學(xué)來說,知其然不知其所以然。另外,這樣還是會(huì)有問題,只要庫在,那么運(yùn)行模擬器就報(bào)錯(cuò)。
? 2.每次界面變動(dòng)需要同時(shí)比較修改另一份代碼,麻煩
思考
? 有沒有一種方式可以在一個(gè)工程里進(jìn)行修改,真機(jī)狀態(tài)下.a文件參與編譯,在模擬器狀態(tài)下不參與編譯呢?
? 在閱讀以下等博客后,整理出了思路
? 參考鏈接2:iOS添加多個(gè)Target,實(shí)現(xiàn)打包不同版本
? 參考鏈接3:iOS開發(fā):集成的SDK不支持模擬器調(diào)試怎么辦?
改進(jìn)
- 添加Target,并確保新添加的Target名稱與info.plist及配置保持一致(運(yùn)行時(shí)Target名稱沒有改變的,需重新打開項(xiàng)目)
- rename.png
-
添加.a文件時(shí),如果僅支持真機(jī)不支持模擬器,那么Add to targets:只勾選原有的Target即可。
AddFile.png -
在Build Setting中搜索:preprocessor macros,添加設(shè)置一個(gè)預(yù)編譯宏,來處理?xiàng)l件編譯。如SIMULATOR=1。
條件編譯.png - 在真機(jī)使用到而模擬器沒有使用到的地方使用預(yù)編譯指令。
例:
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
#if SIMULATOR == 0
ViewController *vc = [[ViewController alloc]init];
[self.navigationController pushViewController:vc animated:YES];
#endif
}
5.如果是真機(jī)運(yùn)行,執(zhí)行Target為TestTarget的Scheme,如果是模擬器執(zhí)行TestTarget-Simulator即可。通過切換Target的方式來處理真機(jī)與模擬器的調(diào)試切換

- 總結(jié):以上,實(shí)現(xiàn)了不支持模擬器SDK、文件的條件編譯,利用條件編譯,在模擬器環(huán)境下不對(duì)不支持x86的SDK進(jìn)行編譯。
BTW:喜歡伸手測(cè)試的小伙伴可以點(diǎn)擊下載進(jìn)行測(cè)試,喜歡請(qǐng)點(diǎn)贊,謝謝!


