在上一章节中,我们完成MySDK工程创建,并且能够利用我们的测试工程MySDKTests对SDK随时进行调试。本文中我们将一步一步来完善SDK工程配置,从而为我们后续的开发提供更加便利的条件。开始之前,确保你已经打开了我们之前创建好的Workspace。
Universal Target
选中MySDK工程,然后File->New->Target,当然你也可以直接点击TARGETS底下的“+”来创建
找到iOS/Other/Aggregate,点击Next,命名为MySDK-Universal。为什么需要有这样一个集合类型的Target?因为我们在编译SDK后生成的Framework文件是分模拟器和真机两个版本,这取决于你选择的编译目标。那么为了让SDK能够同时适用于模拟器和真机,我们需要对两个版本的Framework进行合并。这里我们通过脚本来实现。在我们的scripts目录下创建脚本文件build-universal-framework.sh,并添加如下内容
#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=../build/
# 创建输出目录,并删除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
rm -rf "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework"
# 分别编译模拟器和真机的Framework
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO - configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
# 拷贝framework到univer目录
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
# 合并framework,输出最终的framework到build目录
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
然后在MySDK工程中选中MySDK-Universal,添加MySDK依赖
为MySDK-Universal添加脚本
来测试一下,选中MySDK-Universal,然后Build
这时在你的SDK目录下会多出一个Build文件夹,里面就是最终我们需要的Framework文件
Configurations
之前在我们的目录中创建了Configurations文件夹,是时候把它加入到项目中来了
然后在该Group下新建我们需要用到的几个config文件
好,到这里我们完成了配置文件的创建,当然根据需要,你可以对其进行一些扩充。现在我们将这些文件配置到MySDK的Configurations中,看起来是大概如下:
这样做的好处是你可以直接通过这些文件去管理Project和Target的Build Settings。
我来测试一下,选择MySDK-Library.xcconfig,输入如下内容:
MACH_O_TYPE = staticlib
这时候你可以到你的Build Settings中查看
对应的选项修改已经生效,细心的朋友可以看到我们在config文件中输入的名称
MACH_O_TYPE
和Build Settings中的“Mach-O Type”不一样,那么怎样才能知道我们需要修改项的内部定义名称呢?这里有两种方法,你可以去到Build Settings里面选择某一项复制,然后粘贴到配置文件中即可。另外我们也可以通过如下方式直接查看,以上是对Target的修改,之前我们同样也为Project设置了MySDK-Project-Debug.xcconfig和MySDK-Project-Release.xcconfig,为什么需要这么做,有一点需要记住,Target的配置会覆盖Project,也就是说Target的优先级更高,Project相当于Target的默认值。下面做个测试
MySDK-Project.xcconfig
MACH_O_TYPE = bundle
MySDK-Project-Debug.xcconfig
#include "MySDK-Project.xcconfig"
MySDK-Project-Release.xcconfig
#include "MySDK-Project.xcconfig"
结果如下
到此,我们顺利完成了一些基本配置。下一章节将探讨Bundle的配置以及三方库的使用。