ITMS-90429: Invalid Swift Support - The files libswiftDarwin.dylib, libswiftMetal.dylib, libswiftCoreAudio.dylib, libswiftsimd.dylib, libswiftQuartzCore.dylib, libswift_Concurrency.dylib, libswiftos.dylib, libswiftMapKit.dylib, libswiftObjectiveC.dylib, libswiftDispatch.dylib, libswiftCoreLocation.dylib, libswiftAccelerate.dylib, libswiftCoreGraphics.dylib, libswiftCoreData.dylib, libswiftCoreFoundation.dylib, libswiftUIKit.dylib, libswiftCoreMedia.dylib, libswiftAVFoundation.dylib, libswiftCore.dylib, libswiftFoundation.dylib, libswiftPhotos.dylib, libswiftMediaPlayer.dylib, libswiftCoreImage.dylib aren’t at the expected location
碰到一個上架問題,查找資料后

得知是在app包的最外層存在一個直接暴露dylib,按照官方要求,必須打包成Framework的形式才行。

那么問題轉(zhuǎn)換成把dylib打包成framework,打包現(xiàn)成的dylib成framework需要以下幾個步驟
方式一:
直接使用CMake 生成 iOS Framework CMake Framework
該方式需要庫的源碼
方式二:
- 先用Xcode生成一個framework工程,build出一個release包
- 把dylib變成一個沒有.dylib后綴的二進(jìn)制文件,用這個二進(jìn)制文件替換第一步framework中生成的二進(jìn)制產(chǎn)物
- 修改這個二進(jìn)制文件的rpath.
我們首先來詳細(xì)講解
- 生成framework,這一步的目的是為了得到一個framework的目錄結(jié)構(gòu),注意3個點(diǎn)
- 記得把要暴露的頭文件拽進(jìn)來,改成public
- 把庫的適配版本改成比你的應(yīng)用的適配版本要小或者相等的版本
-
不需要簽名
我們這一步得到的產(chǎn)物如圖
image.png
- 現(xiàn)在我們把我們的libeslog.dylib生成eslog的二進(jìn)制產(chǎn)物,替換framework的產(chǎn)物,因?yàn)檎嬲拇a段數(shù)據(jù)段符號等數(shù)據(jù)都在我們的dylib中,framework的eslog里面是空的
? lipo -create libeslog.dylib -output eslog
? chmod a+rx eslog
然后我們把新生成的eslog替換原來framwork的eslog
注意:
這一步生成的產(chǎn)物的名字一定要和framework的產(chǎn)物名字對得上,framework中有一個info.plist文件,里面有一個字段記錄了執(zhí)行文件名稱,這個取名無所謂,但是一定要保證名稱都對上
- 現(xiàn)在修改rpath,如果不做這一步,原來的rpath還是指向以前的libeslog.dylib,導(dǎo)入進(jìn)工程是會dyld not found的
? install_name_tool -id @rpath/eslog.framework/eslog eslog
我們重新驗(yàn)證rpath變化

注:
這里有個小坑是修改可執(zhí)行文件本身的加載路徑而非它的依賴庫路徑是沒有辦法用
istall_name_tool -change去修改的。
image.png
現(xiàn)在就是一個正常的未簽名的framework了,可以給自己用也可以給第三方用了,只需要把它拽進(jìn)工程,記得embed & singin

重新運(yùn)行即可正常加載。

