iOS SDK开发之framework库

公司有个需求需要把自己的项目打包成库,以供合作方使用,查找了些资料,花了些时间研究了下,晚上整理一下笔记。

1 . 创建一个 workspace 项目

a) 在桌面创建一文件夹 ChangeViewColorSDK
b) 打开 Xcode 创建一个 workspace ,放在 ChangeViewColorSDK 文件夹下
image.png
image.png

2. 创建SDK项目

a) 打开刚才创建的 workspace 文件,创建 project (或者使用快捷键 command + shift + n)。
image.png
选择第一个是framework库.png
image.png
image.png

3. 创建 Demo

a) 创建 project (或者使用快捷键 command + shift + n)。
image.png
image.png
当SDK工程和Demo工程创建完成之后的项目目录.png

4. 静态库封装和打包。

a) 新建一个 View 继承 UIView,重写init方法改变View的背景色。
image.png
b) 设置 Build Setting ,将 Build Active Architecture only 设置为 NO
image.png
image.png
c) 关于在 Build Setting 下设置 Architectures 增加 armv7s 的问题。
模拟器32位处理器测试需要i386架构,
模拟器64位处理器测试需要x86_64架构,
真机32位处理器需要armv7,或者armv7s架构,
真机64位处理器需要 arm64架构。

iOS 10.3公测版发布:封杀32位应用;
所以这里说的是大家可以根据自己的应用需要,和兼容iOS的最低版本根据需要添加 armv7s 。
image.png
d) 设置 Headers ,将要公开的头文件拖到 Public下,要隐藏的放到 PrivateProject 下,隐藏的头文件不能被引用。
image.png
e) 在 ChangeViewColorSDK.h 中引入刚才创建的View的 .h 文件。
image.png
f) 创建一个 Aggregare
image.png
image.png
g) 嵌入脚本,选中刚刚创建的 Aggregare ,然后选中 Build Phases ,点击左边的 + 号,选择 New Run Script Phases
image.png
h) 下面把这段脚本复制进去(这段脚本是用于模拟器framework和真机framework合并并导出,格式不要错,格式错编译不通过)
if [ "${ACTION}" = "build" ]
then

#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"


#build之后的文件夹路径
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"


#真机build生成的.framework文件路径
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/${PROJECT_NAME}.framework
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"
#模拟器build生成的.framework文件路径
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/${PROJECT_NAME}.framework
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"


#目标文件夹路径
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"
#目标.framework路径
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/${PROJECT_NAME}.framework
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"


#判断build文件夹是否存在,存在则删除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi
#判断目标文件夹是否存在,存在则删除该文件夹
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

#创建目标文件夹  -p会创建中间目录
mkdir -p "${INSTALL_DIR}"


#build之前clean一下
xcodebuild -target ${target_Name} clean
#模拟器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator
#真机build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos


cp -R "${DEVICE_DIR_A}" "${INSTALL_DIR_A}"

#由于xcode12之后模拟器编译的SDK也有Arm64,不删除就合并的话会报”have the same architectures (arm64) and can't be in the same fat output file“的错误
#xcode12,模拟器删除Arm64架构
lipo "${SIMULATOR_DIR_A}/${PROJECT_NAME}" -remove arm64 -output "${SIMULATOR_DIR_A}/${PROJECT_NAME}"

#合成模拟器和真机.framework包
lipo -create "${DEVICE_DIR_A}/${PROJECT_NAME}" "${SIMULATOR_DIR_A}/${PROJECT_NAME}" -output "${INSTALL_DIR_A}/${PROJECT_NAME}"

#打开目标文件夹
open "${INSTALL_DIR}"

fi
image.png
i) 最后编译,command + B,编译成功之后在 products 下右键 Show in finder 找到 framework,这就是打包好的库,可以拷贝出来使用。
  • 这里要说的是当选择模拟器进行编译的时候,当前 framework 库只能使用与模拟器,当选择 Generic iOS Deveice 进行编译的时候则当前framework 仅适用于真机运行。
关于开发模式设置.png
Debug模式是用于程序调试,Release则用于发布包正式包使用.png
image.png
image.png
image.png
j) 打包好的SDK的使用(导入项目中相应的 framework ,模拟器打包的 framework 则仅适用于模拟器运行)
image.png
k) 关于刚刚加入的脚本是自动打包合并 frameworkscheme 选择刚刚创建的脚本。运行,如果成功会弹出打包好的库文件。
运行成功之后的库文件可以使用下边的命令验证是否为合并之后的库文件.png
i) 注意:
  • 如果 SDK 有用到 Category,注意项目设置 Other Linker Flags 添加 -ObjC 。
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中

-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。

-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。

5. SDK 调试。

a) 修改下面 SDK 中的代码,运行 demo 就是修改后的效果,然后就可以在这个工程里面开发调试 SDK 了,例如修改库中 View 的背景色。
image.png

6. 关于合并模拟器和真机的 framework。

  • 也许很多人感觉模拟器的库文件和真机的库文件有点麻烦,怎么才能把两个合并成一个文件?也是可以的,这里只做参考,可以根据自己实际需要选择是否要合并SDK。

    a) 找到刚才打包好的真机和模拟器的 framework ,以真机包为例。
//   输入命令查看 framework 信息
$  lipo -info 真机 framework 文件路径
image.png
b) 合并真机和模拟器的 framework
//   输入命令合并真机和模拟器 framework 
$  lipo -create  真机framework文件路径  模拟器framework路径 -output  真机framework文件路径
image.png
  • 为了验证是否合并成功,输入 a 中的命令查看 framework 的信息。
可以看到输出的信息是包含真机和模拟器的.png

一般我们打包的静态库中常常会使用一些图片等资源文件,那么就会有这么一种情况就是我们的库中的图片文件和项目中的文件名称一样导致冲突。这时候就可以使用.bundle文件来解决这个问题,关于打包. bundle资源包

以上就是关于 framework 库的打包,真机库和模拟器库的合并。
特此笔记。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容