美文网首页
Swift Project制作静态Framework

Swift Project制作静态Framework

作者: 简单Timor | 来源:发表于2024-11-11 14:08 被阅读0次

背景:

  1. 完整正常运行的项目Demo Swift
  2. 包含其他第三方库
  3. 打包制作成静态库

一. 生成静态库包

此处选择Framework生成静态库,具体如下。

1. 生成Framework 库

选择Framework

2. 导入第三方库

Cocopods导入第三方库

3. 创建bundle文件

创建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的图片等资源。


image.png

2. 导入Framework

import Framework

3. 如何处理第三方库

生成Framework结构图

如图中结构所示,除了我们需要的Framework以外,还包含了其他的依赖库。那我们需要导入project中吗?
有两种处理方式:

1. 直接拖拽图中的依赖库到project工程中。

拖拽进入工程
image.png

2. Cocopods Install第三方库

project Install依赖库

问题

1. verifying emitted module interface Famework

verifying emitted module interface Famework

解:-no-verify-emitted-module-interface


-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选项,默认为是,改为否即可


截屏2024-11-12 14.07.18.png

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时,不需要额外增加依赖库


动态库引入
截屏2024-11-13 11.15.30.png

相关文章

网友评论

      本文标题:Swift Project制作静态Framework

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