接上一篇iOS组件化(一)
我们已经初步制作了一个简单的SDK
,并且加入了资源图片,公开了管理类。
如果有去实践的朋友,你应该会发现Build
这个SDK
是一件相当麻烦的事情。不仅仅要手动选择bundle、framework
进行真机和模拟器的打包。更加重要的是,如果这个包提供给别人用,你要提供两份?一份真机一份模拟器?这也太费劲了吧!
那么有没有合二为一的办法呢?
这个办法很多人都能找到,我随便翻个博客。
你是说每次都让我这样去命令行合并?我觉得还是费劲!
好的吧~有个省事的办法,做个脚本吧!
拿出你创建好的SDK
的工程。再添加一个Target
![](https://img.haomeiwen.com/i2920524/de7f7f1cca7e5ba2.png)
选择这个
![](https://img.haomeiwen.com/i2920524/010bd1df5aa94b93.png)
这样添加一个脚本框
![](https://img.haomeiwen.com/i2920524/ec8c7dda5d294e03.png)
脚本中填写代码
![](https://img.haomeiwen.com/i2920524/920c7598b2d485fe.png)
# define output folder environment variable
CONFIGURATION=Release
UNIVERSAL_OUTPUTFOLDER=${SRCROOT}/${CONFIGURATION}-universal/${PROJECT_NAME}.framework
cd "${SRCROOT}/.."
#build support native API
# Step 1. Build Device and Simulator versions
xcodebuild -target MYResource ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild build -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild build -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME} -configuration ${CONFIGURATION} -sdk iphonesimulator VALID_ARCHS="i386 x86_64" BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
# make sure the output directory exists
rm -rf "${SRCROOT}/${CONFIGURATION}-universal"
mkdir -p "${SRCROOT}/${CONFIGURATION}-universal"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/" "${UNIVERSAL_OUTPUTFOLDER}/"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/MYResource.bundle" "${SRCROOT}/${CONFIGURATION}-universal/"
rm -rf "${SRCROOT}/${CONFIGURATION}-universal/MYResource.bundle/MYResource"
rm -rf "${SRCROOT}/${CONFIGURATION}-universal/MYResource.bundle/Info.plist"
# Step 2. Create universal binary file using lipo
lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}"
open ${UNIVERSAL_OUTPUTFOLDER}
# Last touch. copy the header files. Just for convenience
- 注意:修改代码中的
MYResource.bundle
这个名称。换成你的资源包的名字。
如果你使用的是Xcode10
以后版本。需要做以下设置。
![](https://img.haomeiwen.com/i2920524/7e7116c27e0780a3.png)
更改这个两个选项
![](https://img.haomeiwen.com/i2920524/6ae1d96b91e466a0.png)
选择脚本,build
一次
![](https://img.haomeiwen.com/i2920524/687a2b6565f2851a.png)
有可能build
失败了
![](https://img.haomeiwen.com/i2920524/cc167f1311a1af92.png)
导致这种情况的原因就是我们没有build
一个release
的SDK
和Resource
,如果你之前已经build
了这release
版本,自然不会报错。
- 如何处理?
我们有两个报错,直接修改两个包Scheme
image.png
![](https://img.haomeiwen.com/i2920524/0724d8a8cfd72588.png)
修改完,选择选择这个Target
编译一次
![](https://img.haomeiwen.com/i2920524/8981d98b9f4976f7.png)
一个修改完成。第二个重复上面的操作,改过一定要编译一次!而且必须是成功的。
全部完成,如下图选择脚本,编译。
![](https://img.haomeiwen.com/i2920524/0bce1f265be38b9d.png)
-
看看成果:成功了,自动打开了一个文件夹
image.png
![](https://img.haomeiwen.com/i2920524/83511d503edb6aca.png)
干了这么多事,还不是麻烦?
虽然我们现在很费事,但是以后我们修改了内容直接编译这个脚本就可以了。有错的话安装上面截图解决。是否一劳永逸了?
怎么知道你真的合包了?
我们来查下这个Framework
的信息
![](https://img.haomeiwen.com/i2920524/6c9dbae9de64b703.png)
- 额~~脸被打的啪地一声....
别慌~如果你细心,你会发现,我们一直选择的这个Generic iOS Device
编译的,从来没有使用模拟器编译过。
![](https://img.haomeiwen.com/i2920524/3ea00706f7c414c2.png)
那么来一次吧!两个Target
选个模拟器Build
一次。
![](https://img.haomeiwen.com/i2920524/93bc6d2b1d2ba379.png)
![](https://img.haomeiwen.com/i2920524/15554911ec6e66ff.png)
我保证,这次肯定稳了!不信你看~
![](https://img.haomeiwen.com/i2920524/315bc7aa1959b20d.png)
网友评论