前言
在一些日常開發(fā)中,很可能依賴一些三方庫(kù),這些三方庫(kù)因?yàn)橐恍┨厥庠驔](méi)有提供模擬器的版本,導(dǎo)致項(xiàng)目集成后就不能使用模擬器運(yùn)行,這個(gè)很影響使用模擬器開發(fā)調(diào)試,尤其是真機(jī)種類和數(shù)量不足時(shí),需要查看一些特定版本的效果很麻煩
問(wèn)題一、
/xxxx/xxxx.xcodeproj Building for iOS Simulator, but the linked and embedded framework 'xxxx.framework' was built for iOS.
問(wèn)題二:
Building for iOS Simulator, but the linked and embedded framework 'xxx.framework' was built for iOS + iOS Simulator
問(wèn)題二解決方案:設(shè)置Build Settings -> Validate Workspace -> YES,編譯成功后再恢復(fù)設(shè)置成NO就可以
最好的解決方式一:
找到對(duì)應(yīng)的三方提供完整的真機(jī)和模擬器的版本
解決方式二
1、創(chuàng)建一個(gè)專門用于模擬器的target,讓這個(gè)target不引入這個(gè)三方庫(kù)
2、 在使用到該三方庫(kù)的地方,比如#import xxx.h,以及對(duì)應(yīng)調(diào)用的地方區(qū)分模擬器和真機(jī),只對(duì)真機(jī)進(jìn)行引入和調(diào)用
#if !TARGET_IPHONE_SIMULATOR
#import <XXXSDK/XXXSDK.h>
#endif
#if !TARGET_IPHONE_SIMULATOR
XXXController *vc = [XXXSDKController new];
#else
UIViewController *vc = [UIViewController new];
#endif
解決方式三
1、創(chuàng)建一個(gè)同名的假的庫(kù),比如三方提供的庫(kù)叫AAA.framwork,本地也創(chuàng)建一個(gè)AAA的庫(kù)的項(xiàng)目
2、然后導(dǎo)出模擬器版本的framework,只要build一下就會(huì)自動(dòng)生成對(duì)應(yīng)的庫(kù)
3、將三方的AAA.framework復(fù)制到一個(gè)文件夾下例如mix,但是刪除AAA.framework里的AAA
4、將生成的模擬器版本的假庫(kù)與三方庫(kù)進(jìn)行合并,可以使用lipo -create合并生成framework
lipo -create \
"xxx/third/AAA.framework/AAA" \
"xxx/fake/AAA.framwork/AAA" \
-output "xxx/mix/AAA.framework/AAA"
也可以使用-create-xcframework生成xcframework
xcodebuild -create-xcframework \
-framework "xxx/third/AAA.framework" \
-framework "xxx/fake/AAA.framwork" \
-output "xxx/AAA.xcframework"
使用假模擬器SDK而遇到的問(wèn)題
問(wèn)題三:
Undefined symbol: _OBJC_CLASS_$_xxxxxx
在自定義的AAA庫(kù)里創(chuàng)建一個(gè)對(duì)應(yīng)的類,但不做任何實(shí)現(xiàn)就可以解決, 如果要調(diào)用實(shí)現(xiàn),會(huì)報(bào)找不到對(duì)應(yīng)的方法的問(wèn)題(問(wèn)題四)
問(wèn)題3.1
Undefined symbol: _xxxxxx
是由于在.h文件里定義了
extern NSString * xxx
在.m文件里也要對(duì)應(yīng)實(shí)現(xiàn)
NSString * xxx = @"xxx"
跑模擬器問(wèn)題四:
Thread 1: "+[xxx xxx]: unrecognized selector sent to class
解決方法: 理論上有這個(gè)問(wèn)題才是正常的,因?yàn)槭褂昧艘粋€(gè)假的sdk運(yùn)行起來(lái),并未做任何實(shí)際的實(shí)現(xiàn),要處理這個(gè),可以讓模擬器不調(diào)用對(duì)應(yīng)類來(lái)解決
#if !TARGET_IPHONE_SIMULATOR
XXXController *vc = [XXXSDKController new];
#else
UIViewController *vc = [UIViewController new];
#endif
判斷是動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù):
如何辨別.framework是動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)
(1)cd xx.framework
(2)file xx 注釋:xx為.framwork下的二進(jìn)制文件
(3)判斷:靜態(tài)庫(kù)包含“current ar archivecurrent ar archive”字樣。動(dòng)態(tài)庫(kù)包含“dynamically linked shared library”字樣
1、修改配置動(dòng)態(tài)靜態(tài):

2、由于是只需要模擬器的占位版本,將類型設(shè)置為只支持x86_64就可以

3、選中模擬器進(jìn)行編譯

4、獲取生成的模擬器版本地址


具體地址如下:
~/Library/Developer/Xcode/DerivedData/xxxxx/Build/Products/Debug-iphonesimulator/AAA.framework
http://www.itdecent.cn/p/42891fb90304
解決M1芯片報(bào)錯(cuò)問(wèn)題,在Podfile里增加配置
# Uncomment the next line to define a global platform for your project
platform :ios, '10.0'
source 'https://github.com/CocoaPods/Specs.git'
target 'XXXX' do
inhibit_all_warnings!
use_frameworks!
pod 'Alamofire'
pod xxxx
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' # 讓M1晶片的MAC可編譯
config.build_settings['LD_NO_PIE'] = 'NO'
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end