类库封装

类库封装

通常,我们会将一些自定义的通用类封装为一个 .a.framework 类库,这样有利于代码的复用和维护。并且,还可以将不同的业务拆分为多个类库,以便将维护任务分配给多个项目组。这样有利于业务的快速更新,而且不同业务之间可以通过公开接口快速相互嵌入。

在创建类库时,可以直接创建一个单独的类库工程,也可以在已存在的工程中以添加 Target 的形式创建类库工程。两者没有什么太大的区别,只是后者可以在已有工程中方便的进行测试。

资源封装

无论创建的是 Cocoa Touch Static Library 还是 Cocoa Touch Framework ,都需要注意,类库中用到的资源如图片、nib 文件或视频等其他资源,都应封装在一个或多个 bundle 资源包中。当创建的是静态类库时,需要将 bundle 资源同 .a 文件一起导出,以供其他工程引用。而对于 .framework 框架,bundle 资源应封装在框架中。

虽然是两种情况,但需要明确的是,在框架中的代码加载资源时,都需要明确指出加载的资源来自哪个 bundle 资源包。所以,bundle 资源的地址确认尤为重要。而我们需要知道的是,对于工程直接拷贝的资源而言,其是直接属于 mainBundle 下的,而工程引用的 framework 资源,则是在 mainBundle 下的 Frameworks 文件夹下的。

所以,针对两种情况,我们可以使用下面的宏来访问 bundle 中的资源。

#define FrameworkBundle(name) [NSBundle bundleWithPath:FrameworkBundlePath(name)]

#define FrameworkBundlePath(name) [[NSBundle mainBundle]pathForResource:name ofType:@"framework" inDirectory:@"Frameworks"]

///获取资源包中指定的图片资源
#define ResourceImage(imageName,bundle) [UIImage imageWithContentsOfFile:ResourcesImagePath(imageName,bundle)]

///获取资源包中指定的图片资源路径
#define ResourcesImagePath(imageName,bundle) [ResourcesBundle(bundle) pathForResource:imageName ofType:@"png" inDirectory:@"pictures"]

///获取资源包
#define ResourcesBundle(bundle) [NSBundle bundleWithPath:[bundle pathForResource:@"Resources" ofType:@"bundle"]]

#define MainResourcesBundle ResourcesBundle([NSBundle mainBundle])

#define BundleInMainBundle(name,type) [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:name ofType:type]]

当然,在实际开发过程中,资源包可能有多个,名称也未必是 Resources ,所以可以根据实际情况修改上面的宏。

引用类库

创建的类库总是需要提供给其他工程进行使用的,而我们总是希望第三方工程所引用的类库,总是最新的。那么可以添加一个脚本,在每一次对类库进行修改编译后,都自动更新其他工程对该类库的引用。

lib=$1

basePath=${SRCROOT}

libOutputDir=${basePath}/${lib}

if [ ! -d "${libOutputDir}" ]; then
mkdir "${libOutputDir}"
fi

libOutputFilePath=${libOutputDir}/${TARGET_NAME}.framework/${TARGET_NAME}

echo "对外输出目录文件路径 : ${libOutputFilePath}"

#arm64 架构路径
framework_arm64=${BUILD_DIR}/${CONFIGURATION}-${PLATFORM_NAME}/${TARGET_NAME}.framework
lib_arm64=${framework_arm64}/${TARGET_NAME}

echo "arm64 架构路径 : ${framework_arm64}"

#x86_64 架构路径
framework_x86_64=${BUILD_DIR}/Debug-iphonesimulator/${TARGET_NAME}.framework
lib_x86_64=${framework_x86_64}/${TARGET_NAME}

echo "x86_64 架构路径 : ${framework_x86_64}"

#清除缓存
rm -rf "${libOutputFilePath}"

#拷贝
cp -R "${framework_arm64}" "${libOutputDir}/"

if [ ${CONFIGURATION} == "Debug" ]; then

#合并架构并输出
lipo -create ${lib_arm64} ${lib_x86_64} -output ${libOutputFilePath}

fi

创建一个自动更新 .framework 框架的脚本文件,内容如上,如果是 Release 模式,将编译得到的框架拷贝到指定的位置,如果是 Debug 模式,则需要将 x86_64 架构的内容合并到编译结果中。

对于 Xcode 中相关的宏定义,请参考Xcode 4 的环境变量

在类库工程中的 Build Phases 设置项中添加 Run Script 模块,并添加如下执行脚本文件的代码:

"${SRCROOT}/script/updateFramework.sh" "Framework"

exit 0

为脚本指定一个参数 Framework,如此,每次框架编译后,都会将得到的结果拷贝到工程目录下的 Framework 文件夹下。同理,如果是静态类库的话,需要添加另一个脚本拷贝类库头文件以及可能存在的资源包。

要在其他工程中引用得到的类库,需要在工程文件中的 Build Settings 中的 Search Paths 下的 Framework Search PathsHeader Search Paths 中,添加类库的地址,并且在 General 下的 Embedded Binaries 中添加具体的框架或静态库。这里会发现,其下面的 Linked Frameworks and Libraries 中同样会出现该框架或静态库选项。但是需要明白的是,该项目中的类库只会被引用,而不会被编译到具体的执行代码中,因为在应用运行时,其所引用的框架都由 iOS 系统提供,但是对于自己所提供框架,系统是没有的,所以需要在 Embedded Binaries 中指明,在编译过程中将该项中的框架会编译到应用中,在应用执行时,这些框架会自动加载以备调用。

除了这种添加类库地址进行引用的方式,还可以通过创建工作空间来包含多个工程,这些工程可以是普通工程,也可以是类库工程。如此,便可以运行对类库存在引用的普通工程,这种方式的好处是,可以直接对类库工程进行调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值