美文网首页
iOS 生成自己的Framework

iOS 生成自己的Framework

作者: RedRose丶 | 来源:发表于2019-03-21 17:31 被阅读0次

仅做个人学习记录

1.新建项目


20180919161013905.png

2.然后将需要的代码拖入工程
3.设置以下选项

首先是Dead Code Stripping设置为NO,网上对此项的解释如下,大致意思是如果开启此项就会对代码中的”dead”、”unreachable”的代码过滤,不过这个开关是否关闭,似乎没有多大影响,不过为了完整还原framework中的代码,将此项关闭也未曾不可。The resulting executable will not include any “dead” or unreachable code然后将Link With Standard Libraries关闭,我想可能是为了避免重复链接最后将Mach-O Type设为Static Library,framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库。 6169007-d9946b82c4272fd4.png
然后将需要公开的头文件从Project中拖入Public,至于是否需要将私有的头文件拖入Private,我觉得直接放在Project中即可,若是Private中有头文件,打包以后的framework中会多出一个Private的文件夹包含着放入Private的头文件,不过我觉得如果是私有最好还是不要让别人看到。 6169007-fbe02b53e2e09a17.png
Build Settings ->Build Active Architecture Only设置为NO. (图中的选项如果设为YES,会导致其编译时只生成当前机器的框架;将其设置为NO后,发现用模拟器编译后生成的framework同时包含x86_64和i386架构。) 6169007-dbd989af2d5531cf.png
选中Xcode,创建一个Target,增加一个Run Script 并写入以下脚本
屏幕快照 2019-03-21 下午5.25.31.png
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ];then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"

4.配置完之后,先选真机 CMD + B 编译,然后再选一个模拟器进行编译,制作好的Framework会自动弹出来

5.调用该framework的app需要在 Build Settings ->Other Linker Flags 设置为-Objc(当framework中有使用了分类文件,就必须设置,否则无法加载;未使用可以不设置)在开发中,导入一些静态库的时候经常会要求我们在Build Settings->Other Linker Flags设置-ObjC。
主要是因为OC语言中类别(分类),Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:OC没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。
另外还有两个方法,分别是用来全部导入和部分导入。使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件。

6.如果framework内部使用了图片,则需要建一个资源包文件夹,并将改文件夹后缀名改为.bundle,然后将图片放到这个文件夹中同framework一同提供给APP使用。当然在我们的framework里面加载本地图片方法也有所变化,示例代码:NSString *allPath = [[NSBundle mainBundle]pathForResource:name ofType:@"png" inDirectory:@"DFBankSDKResource.bundle"];UIImage *image = [UIImage imageWithContentsOfFile:allPath];

参考 https://www.jianshu.com/p/be31100f7a19

相关文章

网友评论

      本文标题:iOS 生成自己的Framework

      本文链接:https://www.haomeiwen.com/subject/rzycvqtx.html