1.制作framework

通常项目中使用第三方封装的功能时难免会接触到framework相关。通过framework我们可以把项目中可以复用的代码进行封装,方便其他项目直接引用,并且可以选择是否开源内部实现,提高了安全性。

动态库与静态库的区别

静态库:连接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝;
动态库:连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
系统的.framework是动态库,我们自己建立的.framework是静态库
备注:通常上架App store的项目中不能使用自己的动态库,否则审核会被拒绝

.a与.framework的区别

a. .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件
b. .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用
c. .a + .h + sourceFile = .framework

A.首先创建一个Framework项目

image.png
在项目中新建文件,并添加对应的方法
image.png
将需要暴露的文件放入public中
image.png

B.编译工程

接下来就是开始编译工程了,选中运行按钮右边的编译目标,选择Generic iOS Device,然后command+b编译一下,这个时候我们工程中的products文件夹下面的framework文件会由原来的红色(表示文件丢失)变成黑色(表示文件存在)。如果我们选择的是Generic iOS Device那么编译出来的framework只能在真机中使用,如果选中的是普通的模拟器,那么编译出来framewo只能在模拟器中使用。
tips:这里需要注意一下,如果一开始选择的是模拟器,那么即使build成功,framework也不会变成黑色,可能是因为这里的framework指向的是真机中对应的framework,但是在相对应的目录下的模拟器对应的framework是存在的
分别于image.pngimage.png下编译项目,的到debug模式的编译结果,然后切换至release模式再进行一次相同操作
image.png
之后找到Products下对应的编译结果
image.png
通过Show in Finder到达下面的文件夹,找到真机和模拟器编译下的
image.png

C.合并framework

这个时候我们可以考虑合并所有版本的包,一般来说可以使用脚本进行合并,但是每次使用脚本比较麻烦,我们可以在xcode中添加一个共同体aggregate,然后添加编译脚本来实现。
在工程中点击上方工具栏File->New->Target,在选项中选择Other中的Aggregate,命名最好和工程名有关,我这里就写成LLLocalLibAggregate。
image.png
新建好以后,选择targets列表下的LLLocalLibAggregate,点击build phases,点击+新建一个New Run Script Phase,把下面的脚本复制到shell下的选项中(脚本来源自网络,感谢这段脚本的原作者)。有能力的可以根据自己的需要修改下面的脚本。

!/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}”

image.png选中Aggregate,进行编译,然后会弹出编译完成后的framework,之后将打包好的framework放入项目中,引用后直接运行即可

原文引用:https://www.jianshu.com/p/04a7e28f11b9

2.cocopods制作远程库及本地库

本地库制作引用:https://blog.csdn.net/u012198553/article/details/103561762
远程库制作引用:https://www.jianshu.com/p/d4f39bdab6f9