一.库的介绍
强调几点:
第一 (.dylib库文件) == (.tdb库文件)
第二. 自己建立的.framework是静态库,而系统的.framework是动态库
第三. .a文件和.framework文件的区别:
区别一: .a是一个纯二进制文件,.framework中除了有二进制文件之外还有很多资源文件
区别二: .a不能直接使用,至少要有.h文件配合,.framework文件可以直接使用
区别三: .framework == .a + .h + sourceFile
二. 生成.framework
1、先创建Cocoa Touch Framework工程
2、然后cd到工程目录,pod init,pod install,关闭工程,打开xcworkspace文件
3、添加Single View APP 类型的target,作为一个测试联调的demo
4、编写好demo,编译成功后,把Framework关联到Single View APP 类型的target中
5、demo中调入头文件,假如出现找不到头文件警告,就在setting配置中,添加$SRCROOT (recursive递归遍历选项)
创建framework
1、在Xcode中创建一个framework工程,如下图所示
创建Framework类型
成功后截图:
2、使用Pod工具,创建并依赖第三方库,如下图所示
pod 命令操作后
2.1、pod install ,关闭原来工程,打开xcworkspace后。
CocoaPods引入第三方库,import提示file not found
选择工程Target --> BuildSettings --> search Paths 下的 User Header Search Paths --> 双击空白,点击“+”号添加一项:并且输入:“$(PODS_ROOT)”(没有引号),选择:recursive。
2.2、添加第三方依赖,实际情况会经常遇到
2.3、添加自定义类
另外,头文件需要这样方式<xxx/xxx.h>加载
SDK内部的依赖头,"xxx.h"导入就行了
3、代码编写好之后,接下来,就需要配置Framework
1、设置静态库类型和其他的一些设置
dead code stripping 去除被定义但未被调用的代码
2、暴露头文件
3、假如没有armv7s,就添加,另外设置Build Active Architecture Only 为NO
4、Framework关联Demo,联调开发
1、在工程中添加一个 Single View APP类型的TARGETS,我工程中命名为demoSample,如下图所示
操作步骤:选择TARGETS选项,点击底部+按钮,弹出选择TARGETS类型界面后,选择 Single View APP类型,创建就行.
成功后:
2、现在把demo工程创建好了,接下里就需要Framework关联Demo了
先编译Framework,然后得到Framework文件
切换target回到DemoSample工程中
注意⚠️:假如出现了自定义Framework找不到头文件的话,
就在setting配置中,添加$SRCROOT (recursive递归遍历选项)
提示:然后,有事没事就记得clean一下工程,特别有时候弄Cocoapod制作时,不clean一下,一直出找不到头文件啥的
接下来,就看看怎么打包合并模拟器和真机设备的包了(重要)
5、合并模拟器Framework包与真机Framework包
⚠️⚠️注意事项:一点要先在模拟器编译成功,另外也需要在设备编译成功,确保得到两个包才可以操作合并,不然合并的出来的Framework包为空包,Header里面什么都没有
5.1、生成一个类型为Aggregate类型的TARGETS
点击左上角+号,添加一个脚本,利用脚本合并Framework包
###############
###################
#######################
#!/bin/sh
#要build的target名
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}_Products/"
#创建输出目录,并删除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"
#分别编译模拟器和真机的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_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}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"
#合并framework,输出最终的framework到build目录
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"
#删除编译之后生成的无关的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done
#判断build文件夹是否存在,存在则删除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
#打开合并后的文件夹
open "${UNIVERSAL_OUTPUT_FOLDER}"
########################
###################
###############
##########
5.2、选择上面创建的Aggregate类型的Target进行编译,成功后,就弹出一个Framework了
注意:确保真机的包和模拟器的包都存在,不然得到的是空包。
=======打包.a=======
1.新建工程
2.配置参数
3.创建bundle文件,名字一般与工程名相同(如果静态库有资源文件要使用,必须放入.bundle文件)
4.准备工作已经完成,准备写代码
5.打包.a文件
选中模拟器, command + b
选中真机,command + b
合成:(如下只给合成的界面,具体不懂得可以看.framework中合成的步骤)
6. 使用.a的SDK