解決三方framework只提供arm64,沒(méi)有x86_64,模擬器不能運(yùn)行的問(wèn)題

前言
在一些日常開發(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):


image.png

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


image.png

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


image.png

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


image.png
image.png

具體地址如下:
~/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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容