Swift Project制作静态Framework

背景:

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

推荐阅读更多精彩内容