背景:
- 完整正常运行的项目Demo Swift
- 包含其他第三方库
- 打包制作成静态库
一. 生成静态库包
此处选择Framework生成静态库,具体如下。
1. 生成Framework 库
2. 导入第三方库
3. 创建bundle文件
- Bundle 的名字不能与Framework工程名相同
- 把项目中用到的图片或者其他非代码资源都拖拽进去, 如图片、视频、Xib、storyboard等。
- 读取的时候需要带上读取路径,示例:
[_searchButton setImage:[UIImage imageNamed:@"Resources.bundle/search.png"] forState:UIControlStateNormal];
4. 导入原有工程文件
- 需要去掉APPdelegate 等
-
如果有界面呈现内容,需要主动导入UIKit,否则不显示控件
导入Framework
5. 工程配置
-
修改支持设备、版本和架构
修改支持设备、版本和架构
修改支持设备、版本和架构
修改支持设备、版本和架构
注意:.Build Setting搜索linking设置Dead Code Stripping为NO是编译选项优化,可以使包瘦身,可以根据具体要求选择是否修改。
6. 头文件配置
- OC需要去导入.h .m 文件, Swift不需要
7. 工程编译
-
编译之前需要进行Edit Scheme,把Debug修改成Release。
Edit Scheme -
选择真机(或者Generic iOS Device)和模拟器都编译一次,编译通过后,选择Products文件夹,对应生成的framework文件Show in Finder,会发现有对应生成的真机和模拟器的framework。
Products 里面既是库
8. 合成库
- 如果即需要支持真机有需要支持模拟器的朋友,可以生成二者后进行合并。
sudo lipo -create 空格 (此处请填写真机testNewFramework文件路径) 空格 (此处填写模拟器testNewFramework文件路径) 空格 -output 空格 自定义合成文件存储路径(合成文件的名字testNewFramework)
二. 使用Framework
1、拖入主程序
直接将生成的framework拖入要使用的工程中去,使用文件复制类型加载。
引入framework,否则会娶不到framework的图片等资源。
2. 导入Framework
3. 如何处理第三方库
如图中结构所示,除了我们需要的Framework以外,还包含了其他的依赖库。那我们需要导入project中吗?
有两种处理方式:
1. 直接拖拽图中的依赖库到project工程中。
2. Cocopods Install第三方库
问题
1. verifying emitted module interface Famework
解:-no-verify-emitted-module-interface
2. Sandbox: rsync.samba deny(1) file-write-create
工程project pod 导入第三方的时候出现,打开Xcode项目-点击左上角顶部项目并展开右侧配置文件,找到Build Settings – TARGETS – TestTask – Build Options – User Script Sandboxing选项,默认为是,改为否即可
3. iOS Xcode13.3 创建framework,没有Products目录
解决:
1、选择 NKFramework.xcodeproj, 右键显示包内容
2、打开project.pbxproj
3、按照下面方式修改文件并保存
搜索productRefGroup,将productRefGroup上面一行的mainGroup的值,复制给productRefGroup,再保存一下,Xcode就自动刷新出来了。
Tips: 虽然 mainGroup 和 productRefGroup 对应的value值是一样的,但是这样操作之后确实会出现Products文件夹,应该是不是XCode编译器的问题。
参考:
https://blog.csdn.net/shifang07/article/details/102549906
https://fangjunyu.com/2024/05/15/%E8%A7%A3%E5%86%B3xcode%E9%97%AE%E9%A2%98%EF%BC%9Asandbox-rsync-samba13378-deny1/
https://blog.csdn.net/qingpingguo12/article/details/125487214
https://juejin.cn/post/7092743777952989215
遗留问题:
以上Framework制作,最后依赖的第三方库均会暴露出来, 是否有办法不暴露第三方库给project,期待有缘人解惑,谢谢。
解:
在解上面问题之前,首先要明确动态库和静态库的区别。
Embed方式编译的依赖第三方Framework的 静态SDK,主工程在使用时也需要添加第三方Framework依赖,可以从输出的SDK下Framework目录直接添加第三方Framework依赖。
Embed方式编译的依赖第三方Framework的动态SDK,主工程在使用时不需要添加第三方Framework依赖,系统会自动添加引用链接。
动态库和动态库的区别
- 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝,存在形式:.a和.framework
- 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。存在形式:.dylib和.framework
所以如果想不被Project引用依赖的第三方SDK,你需要制作动态库
只需要在如上流程中,修改
TARGETS -> Build Settings,Mach-O Type设置为Dynamic Library
则打出的就是动态库了,当引用入Project时,不需要额外增加依赖库