我們永遠(yuǎn)也看不透事物的本質(zhì)华望,看到的只是自己思想的倒影!
開發(fā)背景
? ? ? ?在iOS應(yīng)用開發(fā)中子漩,不免需要引入一些第三方SDK缕棵,方便開發(fā)别厘。比如藍(lán)牙或相機掃描身份證IDCardRecognition
之類的雕蔽。
存在問題
? 這些SDK僅支持真機不支持模擬器嚣艇。即贰谣,真機上可以正常運行秘豹,而模擬器會報錯凄贩,如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)第三方久橙,實現(xiàn)在模擬器上查看界面
不足
? 1.寫腳本繁瑣,對不懂腳本語言的同學(xué)來說佳头,知其然不知其所以然。另外肄梨,這樣還是會有問題,只要庫在辆毡,那么運行模擬器就報錯眨攘。
? 2.每次界面變動需要同時比較修改另一份代碼鲫售,麻煩
思考
? 有沒有一種方式可以在一個工程里進行修改秦效,真機狀態(tài)下.a文件參與編譯苔货,在模擬器狀態(tài)下不參與編譯呢若皱?
? 在閱讀以下等博客后,整理出了思路
? 參考鏈接2:iOS添加多個Target旅敷,實現(xiàn)打包不同版本
? 參考鏈接3:iOS開發(fā):集成的SDK不支持模擬器調(diào)試怎么辦?
改進
- 添加Target颤霎,并確保新添加的Target名稱與info.plist及配置保持一致(運行時Target名稱沒有改變的媳谁,需重新打開項目)
-
添加.a文件時涂滴,如果僅支持真機不支持模擬器,那么Add to targets:只勾選原有的Target即可晴音。
-
在Build Setting中搜索:preprocessor macros柔纵,添加設(shè)置一個預(yù)編譯宏,來處理條件編譯锤躁。如SIMULATOR=1搁料。
- 在真機使用到而模擬器沒有使用到的地方使用預(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.如果是真機運行进苍,執(zhí)行Target為TestTarget的Scheme加缘,如果是模擬器執(zhí)行TestTarget-Simulator即可。通過切換Target的方式來處理真機與模擬器的調(diào)試切換
- 總結(jié):以上觉啊,實現(xiàn)了不支持模擬器SDK拣宏、文件的條件編譯,利用條件編譯杠人,在模擬器環(huán)境下不對不支持x86的SDK進行編譯勋乾。
BTW:喜歡伸手測試的小伙伴可以點擊下載進行測試,喜歡請點贊嗡善,謝謝辑莫!