iOS静态库之xxx.framework文件

简介: 这篇博客是结合众多作者博客的基础上进行实践和整理出来的。从整体上来看,大部分的博客在整体流程上都没什么问题,但基本在SDK合成细节的描述往往不够详细,容易造成不少的误区,被坑在里面了都不知道。针对这个问题和躺过的坑,在整理做了更细致的描述,避免再犯。

引言


这篇博客是结合众多作者博客的基础上进行实践和整理出来的。从整体上来看,大部分的博客在整体流程上都没什么问题,但基本在SDK合成细节的描述往往不够详细,容易造成不少的误区,被坑在里面了都不知道。针对这个问题和躺过的坑,在整理做了更细致的描述,避免再犯。同时也有一些不明白的地方,有待进一步实践解惑,如有明白的博友欢迎留言。


1、创建一个workspace项目

1、现在桌面创建文件夹【SHTestSDk】文件夹,待用

20190513190342104.png



2、打开Xcode,创建一个工作空间【workspace(流程: Xcode—File—New—Workspace 快捷键 :command +N = 创建项目)】,并把创建好的【workspace】添加到【SHTestSDK】文件中

创建成功效果

20190513190541951.png


20190513190555379.png



20190513190612781.png


2、创建SDK

1、打开【SHTestSDK.xcworkspace】文件,创建project


20190513190746763.png

20190513190800201.png


20190513190811895.png

20190513190818906.png


成功效果图


20190513190830214.png


3、创建Demo

20190513190843340.png

20190513190851315.png


成功效果图

20190513190858641.png


4、SDK工程配置

1、这里创建一个SHView类,继承于UIView,简单的重写了初始化方法,设置了颜色

20190513190927978.png



2、设置Build Setting参数 将Build Active Architecture only设置为NO,

20190513190943354.png


3、设置Build Setting参数 在Architectures下增加armv7s

20190513190956408.png


4、设置Headers,将要公开的头文件拖到Public下,要隐藏的放到Private或Project下,隐藏的头文件不能被引用,效果图:

20190513191005311.png


工程配置集合:


点击目标工程 >> 选择你创建的Framework >> 点击工程设置 >> 做出如下修改
#1、(必)选择库类型:1、StaticLibrary是静态库;2、RelocatableObjectFile是动态库
Build Settings >>  Mach-O Type >> Static Library
#2、(必)设置适配所有模拟器/真机机型架构
Build Settings >> Build Active Architecture Only 设为NO
#3、死代码剥离
Build Settings >> Dead Code Stripping >> 设置为NO
#4、复制过程中删除调试符号
Build Settings >> Strip Debug Symbol During Copy >> 全部设置为NO
#5、
Build Settings >> Strip Style >> 设置为Non-Global Symbols
#6、是否连接到标准库
Build Settings >>  Link With Standard Libraries >> 设置为 NO
#7、(必)设置打包静态库的测试版和发布版(.a和.frameworke)
product -> scheme -> Edit scheme -> Run->选择Debug或Release
#8、(必)
target-Build Phases - Headers -把需要公开的头文件从project拖入Public


5、在SHTestSDK.h(必须是公开的,否则无法引用)中将所有要公开的.h引入。

如下图就是我根据以上步骤创建的以【RTestSDK】为命名空间,含有一个【Demo】项目,一个【TestSDK】(里面有两个文件类),并且进行【command+B】编译。


20190513192838337.png

20190513192704457.jpg

下面是重点,有所差异和注意的就是在SDK打包。


5、SDK合成


SDK合成有两种方式,下面分别阐述两种不同合成方式以及注意细节。

SDK合成分类:终端合成、脚本合成。


5.1、终端合成

1、在文件导入/创建/处理之后,快捷键【command+B】进行编译,选择虚拟机编译(随便选择一个iphone手机机型)和 Generic in device(真机模式编译)两种模式,第一次进行编译时,对应的xxx.framework文件就会由红色变成黑色。说明编译成功。


在这里创建了两个类

20190513200956180.jpg


编译之前


20190513200623324.jpg


编译之后

2019051320064515.jpg


2、右键点击.framework->show in Finder,可以看到对应文件的路径,打开终端查看对应文件支持的设备和机型

2019051319351867.jpg

20190513193854456.jpg


检查各自文件适配类型

20190513195252180.jpg


3、在终端输入合并的命令

格式如下:


lipo -create 真机文件包的路径 虚拟机文件包的路径 -output 生成的文件路径(可以自己创建一个文件夹)

示例:

2019051319482634.jpg


最后生成【TestSDK】(名字可以自定义)


注意: 合成的对象分别是真机【Debug-iphoneos】和虚拟机【Debug-iphonesimulator】文件下的【TestSDK】文件。


4、重复第2步骤,进入文件路径,复制一个【xxx.framework】文件到步骤3的生成文件的文件夹中

20190513195905396.jpg



5、将【TestSDK.framework】文件里的【TestSDK】文件替换成外面一个的【TestSDK】,然后查看结果

如上图,说明合并成功,可以直接导入对应的工程项目中使用。

20190513200232704.jpg


5.2、脚本合成

这里同石虎132博客中的流程相同,直接按流程操作即可

1、创建一个Aggregare

图16:

20190513201445844.png


图17:

20190513201500703.png


2、书写脚本工程名完成创建如下图


20190513202920185.jpg



3、选择脚本工程BuBuild Phases 点击+号选择New Run Script Phase 添加(重要)

20190513202947407.jpg


4、打开Run Script 将合成代码拷贝到脚本工程中如下图

20190513203035366.jpg


5、嵌入脚本


脚本代码如下


# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
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}"

20190513202318894.jpg



6、选择脚本工程真机运行【command+B】


20190513203615484.jpg


编译完成之后就会直接跳出文件,如下:

20190513203948781.jpg



看上图,问题来了:

1、为啥什么文件都没有?跟终端合并的样式并不一样啊。

2、虽然【TestSDK.framework】文件什么东西都没有,但是直接导入项目还是可以找到文件,拿来应用。但是没有显示头文件,这一点很别扭。

3、既然没有头文件,那就把头文件导入,这样看起来就跟终端合并生成的结果看起来一样了,而且也能使用。

以上疑问,哪位热心大牛,知道的话希望告知,学习学习!


6、Demo与SDK的关联

1、把打包好的framework拖到demo里面

20190513205504158.jpg


2、使用SDK,运行demo

20190513205527302.jpg


注意: 以上功能就是SDK 和 demo 相关联好了.


7、SDK调试

1、修改下面SDK中的代码,运行Demo就是修改后的效果,这样就可以愉快的在这个工程里面开发调试SDK了。

例如我把【TestView】的颜色设置为redColor,直接去运行Demo,看一下效果

20190513205732716.png


参考链接:

1、iOS开发之SDK开发

2、iOS打包静态库(完整篇)

3、iOS SDK~ 打包framework、开发与调试


相关文章
|
7月前
|
移动开发 前端开发 数据安全/隐私保护
iOS发布证书.p12文件无密码解决办法及导出带密码的新.p12文件方法
iOS发布证书.p12文件无密码解决办法及导出带密码的新.p12文件方法
207 0
|
7月前
|
iOS开发
iOS使用.framework类型的静态库
iOS使用.framework类型的静态库
47 1
|
7月前
|
开发工具 iOS开发
iOS制作.framework静态库
iOS制作.framework静态库
65 1
|
7月前
|
iOS开发 Perl
iOS使用.a类型的静态库
iOS使用.a类型的静态库
55 1
|
7月前
|
开发工具 iOS开发
iOS制作.a类型的静态库
iOS制作.a类型的静态库
42 1
|
7月前
|
开发工具 iOS开发 Perl
iOS使用SDK静态库
iOS使用SDK静态库
57 0
|
7月前
|
iOS开发 开发者
【教程】uni-app iOS 打包解决 profile 文件与私钥证书不匹配问题
【教程】uni-app iOS 打包解决 profile 文件与私钥证书不匹配问题
|
7月前
|
移动开发 监控 小程序
mPaaS常见问题之uniapp ios端云打包的配置config文件如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
190 0
|
监控 开发者 iOS开发
iOS第三方网络诊断库——LDNetDiagnoService
iOS第三方网络诊断库——LDNetDiagnoService
580 0
|
11天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。