永发信息网

怎样生成 包含真机和模拟器的framework

答案:1  悬赏:0  手机版
解决时间 2021-01-21 22:10
怎样生成 包含真机和模拟器的framework
最佳答案
如果写了一个Framework,根据Build时选择的机器类型,会分为模拟器Framework和真机Framework,两者是不能混用的。
此时可以通过配置一个Run Script,在Script中使用lipo命令来合并两个版本的Framework,重新生成一个新的Framework,这个Framework将同时支持在模拟器和真机上运行。
首先,在配置Run Script前,我们可以先检查下,Framework的类型,既查看Framework支持的机器架构:
打开【windows】-【Projects】,左侧选择项目,右侧点击Derived Data,打开目录后进入Build的主目录:

这个两个目录下包含了生成的Framework文件夹,第一个是真机、第二个是模拟器(当前使用的是Debug模式)。
现在我们分别对这两个目录中的Framework进行检测:

Debug-iphoneos(真机)目录下的Framework(Framework其实是个文件夹,命令中要再往下一层,使用以项目名称命名的一个二进制文件)

MiniPC:~ lijl$ lipo -info /Users/lijl/Library/Developer/Xcode/DerivedData/SwiftCommon-dyhotzllcfgqjibahyytumthguvh/Build/Products/Debug-iphoneos/SwiftCommon.framework/SwiftCommon
Architectures in the fat file: /Users/lijl/Library/Developer/Xcode/DerivedData/SwiftCommon-dyhotzllcfgqjibahyytumthguvh/Build/Products/Debug-iphoneos/SwiftCommon.framework/SwiftCommon are: armv7 arm64
MiniPC:~ lijl$

真机Framework的结果是:armv7 arm64。可见,如果把这个Framework运行在模拟器中,肯定会报错,因为模拟器架构是x86_64的(以目前最新的设备)

Debug-iphonesimulator(模拟器)目录下的Framework:

MiniPC:~ lijl$ lipo -info /Users/lijl/Library/Developer/Xcode/DerivedData/SwiftCommon-dyhotzllcfgqjibahyytumthguvh/Build/Products/Debug-iphonesimulator/SwiftCommon.framework/SwiftCommon
Non-fat file: /Users/lijl/Library/Developer/Xcode/DerivedData/SwiftCommon-dyhotzllcfgqjibahyytumthguvh/Build/Products/Debug-iphonesimulator/SwiftCommon.framework/SwiftCommon is architecture: x86_64
MiniPC:~ lijl$

模拟器Framework的结果是x86_64。可见这个库只能运行在模拟器中,真机设备是无法运行的。

接下来,我们要对这2个库(其实是Framework目录下2个可执行文件)进行合并。
在项目的Build Phases中,新建一个Run Script,输入下面内容:
(我测试了很久,下面这个修改后的Run Script会更加通用,不会出错)

if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework

DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework

SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework

if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"

lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi

这段shell代码其实很简单,前面一大部分是申明一些目录路径,最后使用lipo命令进行合并操作。

在修改这个代码过程中,也许要学习下Xcode的全局变量,代码中那些${}值,都是Xcode自带的变量,详情请参考:Xcode环境变量。

现在,当项目再次Build时,就会在项目目录下面出现Products目录,里面包含了合并后的Framework文件夹。
使用lipo -info来检测下:

MiniPC:~ lijl$ lipo -info /Users/lijl/Documents/Self\ Project/Cocoa\ Touch\ Framework/SwiftCommon/Products/SwiftCommon.framework/SwiftCommon
Architectures in the fat file: /Users/lijl/Documents/Self Project/Cocoa Touch Framework/SwiftCommon/Products/SwiftCommon.framework/SwiftCommon are: x86_64 armv7 arm64
MiniPC:~ lijl$

成功的集成了X86_64和arm,这样真机与模拟器都可以用啦
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
红楼梦里 为何贾家全都被抓入狱 宝玉的丫环袭
拍日食对照相机有没有影响
新安县初三的空中课堂在哪能看啊
汆羊肉汤面怎么做
500吨压力机用多大油缸多大油压
478x9.9 47.8怎样简算
跪妇人和田玉大约在哪个朝代
刘志辉的人物经历
非可以组什么成语?
假如上帝遇到宙斯
美国安道生命科技公司在中国有直销牌照没有
毫无无违和感是什么意思?
雄迈3518e-s型网络模组装完.尾线指示灯不亮怎
0.85平方米等于多少平方分米
宝马750li故障码118002混合气过浓
推荐资讯
老婆跟同事聚会,男同事居多,总是被起哄闹着
kaka的资料谁有啊?
VIVOX20链接WIFI时候待机怎么会有电流声?
我有4个姐姐 你有能力和我4个姐姐交流沟通
如何用计算器求矩阵特征值用的是一般的科学计
2017种植八月瓜前景如何
木质桌子被磕掉一块板怎么办,露出木头了
联通专项款是什么
我的手腕儿很疼???
将黑色蛙的受精卵A的细胞核去掉,再将一只灰
他跟别的女人聊天记录为什么不敢给我看?
FF14 36级主线任务 在哪个地图接
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?