美文网首页iOS SDK 开发
用Run Script脚本为Framework打交叉包

用Run Script脚本为Framework打交叉包

作者: 火星抄手 | 来源:发表于2016-12-26 13:44 被阅读202次

最近开发SDK时在项目中使用静态库的时候都会有两个版本,一个用于模拟器,一个用于真机,这样就比较麻烦。为了模拟器与真机之间切换调试的方便,需要制作通用版的Framework交叉包。

根据Build时选择的机器类型,会分为模拟器Framework和真机Framework,两者是不能混用的。此时可以通过配置一个Run Script,在Script中使用lipo命令来合并两个版本的Framework,重新生成一个新的Framework,这个Framework将同时支持在模拟器和真机上运行。

1、检查Framework包信息

截图.png

这个两个目录下包含了生成的Framework文件夹,第一个是真机、第二个是模拟器(当前使用的是Debug模式,也可以使用Release模式)。按照预期:真机的包是显示armv7 arm64 架构的,模拟器的包是显示x86_64架构的。

现在我们分别对这两个目录中的Framework进行检测:
1)、Debug-iphoneos(真机)目录下的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是文件夹,命令再往下一层,使用SDK的二进制文件

真机Framework的结果是:armv7 arm64。可见,如果把这个Framework运行在模拟器中,肯定会报错,因为模拟器架构是x86_64的。
2)、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、创建脚本打交叉包

接下来,我们要对这2个库(其实是Framework目录下2个可执行文件)进行合并。
在项目的Build Phases中,新建一个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

经过很多测试,下面这个修改后的Run Script会更加通用,不会出错,唯一报错的原因是对应目录下的包没有生成,这段shell代码其实很简单,前面一大部分是申明一些目录路径,最后使用lipo命令进行合并操作。

3、验证脚本生成的交叉包

现在,当项目再次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 armv7 arm64 ,这样就生成了真机与模拟器通用的交叉包

相关文章

网友评论

    本文标题:用Run Script脚本为Framework打交叉包

    本文链接:https://www.haomeiwen.com/subject/jiejvttx.html