×

Xcode7封装自定义动态库

发表于2年前(Oct 21, 2015 12:05:46 PM)  阅读 5059  评论 1

分类: 移动应用开发 ios

标签: 动态库 framework framework search paths copy items if needed

封装重用是软件编程人员经常做的事,在使用一门语言时,我们经常会用到其他软件开发人员提供的工具,像github以及code4app网站上就提供了很多基于ios应用封装的工具,这些工具能减少我们很多工作。当熟悉了一门语言后,有想法的程序员都会想到封装自己的工具,阅读完本文,您将了解如何使用Xcode7,swift语言来封装一个动态库。

1、首先我们建立一个Cocoa Touch Framework工程,这里我命名为myframework:

2、在myframework添加我们的一个自定义Person类

注意,class以及init构造方法前面都必须使用public修饰,或者其他工程不能引用到。

3、先选择IOS Device版本进行编译

此时可以看到Products目录下的myframework.framwork文件由原来的红色变成了黑色(红色表示该文件不存在),说明我们成功生成了.framework文件。

然后再任意选择一个模拟器版本进行编译,这样我们就生成了DEVICE以及SIMULATOR两个版本的.framework文件,这两个版本的文件一个只能在真机上使用,一个只能在模拟器上使用,稍微我们会讲如何将两个版本合并。我们可以右键,show in finder,找到生成的文件。

注意,如果先选择模拟器版本,将不能生成.framework文件。

4、现在再新建一个Single View Application,命名为testmyframework,用来测试。

我们先测试模拟器版本,将上面生成的.framework文件拖入到新建的工程:

这里,我们看下Copy items if needed选项,如果勾选了的话,将会把对应的文件copy到我们工程目录,copy有一个好处,查找文件就都在工程下面,不会涉及到别的目录,到时工程迁移,copy给其他人使用也不会存在找不到文件的情况,一般如果我们使用其他人开发的framework,可以选中该项。但这里我不选中,不选中的原因时,我将会随时修改myframework工程的代码,这样,我每次编译完,testmyframework工程因为是引用我编译生成的文件,不需要重新copy,便于开发调试。

然后将myframework加入到Embedded Binaried以及Linked Frameworks and Libraries,注意不要有重复的

5、现在我们再ViewController里面来使用myframework里面的类,添加import myframework来导入模块,编译报错,提示No such module 'myframework':

注意,如果您开始添加.framework进行来选中了copy items if needed,将不会有这个错误。

这里我们来修改工程的Framework Search Paths配置,以便工程能够顺利的找到我们需要的framework文件:

这里我们将模拟器版本的.framework文件父目录的路径添加进去,注意,是父目录的路径,而不是文件本身的路径:

再次编译则可通过,这时我们可以在ViewController里面使用Person这个类了

6、上面我们使用的是模拟器版本测试,当使用真机时,我们又得换成真机的文件,很麻烦,所以我们需要制作通用的.framework文件。

回到myframework工程,我们在工程的Build Phases里面增加一段脚本

脚本源码:

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}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
fi
这段脚本,将在myframework工程Product目录下面生成一个framework文件,这个文件是由编译出来的模拟器版本以及真机版本合并而来,是一个通用版本,使用它来替换我们之前的版本,注意修改对应的Framework Search Paths,以后就不用模拟器真机两边切换了。

网上关于这段脚本也有不少版本,那些版本要不是只cp了真机,要不就只cp了模拟器,我测试时,发现必须两个都cp才可以。
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"

 

发表评论