Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS打包framework - Swift完整项目打包Framework,嵌入OC项目使用

iOS打包framework - Swift完整项目打包Framework,嵌入OC项目使用

作者头像
iOSDevLog
发布于 2018-12-14 08:36:17
发布于 2018-12-14 08:36:17
3K20
代码可运行
举报
文章被收录于专栏:iOSDevLogiOSDevLog
运行总次数:0
代码可运行

场景说明:

-之前做的App,使用Swift框架语言,混合编程,内含少部分OC代码。

-需要App整体功能打包成静态库,完整移植到另一个App使用,该App使用OC。

-所以涉及到一个语言互转的处理,以及一些AppDelegate的代码减除变化。

--------------------------------打包篇-------------------------------****

实现步骤:

一、新建 Project - Framework&Library - Cocoa Touch Framework,Next 语言选择Swift

image

建立完成,会看到默认生成的一个 xxx.h 和 Info.plist 文件(只看红框内)。

image

解释一下这两个文件:

1⃣️xxx.h 文件的作用是整个包对外提供的入口头文件,除了正常定义参数属性之外,还有

1、提供 Swift项目内引用的OC文件的import引用,注意,这里引用之前必须在Build Phrases的Headers内暴露到 Public,见步骤六

2、提供 第三方文件的import引用,这里的第三方管理,我们依然选择使用Pods管理,下文会具体描述。

以上两部完成后,举例效果图:

image

2⃣️info.plist ****文件的作用就如同正常项目的plist文件作用,用来定义或添加一些属性。

二、添加文件,这里可以自己新建,或者从已有项目拷贝过来都可以。

这里要注意一下:由于打包类库工程不是一个完整项目工程,所以并没有AppDelegate等文件,所以涉及到这些的文件要额外处理,或改代码,或适当改变功能。

注意:工程如果有桥接文件,是不能拷贝过来的,否则编译不通过。

原因见步骤五。

三、如果有第三方类库引用,添加第三方库文件,有几个注意点:(没有第三方可以跳过这步)

a、第三方库依然使用Pods进行管理,添加方法同正常项目一样。

b、引用的时候,我们需要添加 【use_frameworks!】来告诉pod 生成动态库文件Framework类型,这样做的好处是在正式项目用到本类库的时候,如果两者第三方库有引用冲突,可以根据冲突类库,对本类库引入的这些依赖库进行移除。

image

但有时第三方类库只有 .a 类型的,怎么办?

解决:如果第三方库只有.a类型,就需要手动把库文件拷贝到项目,而不能通过pod添加,否则在往步骤1内的头文件添加import时会找不到文件,造成报错。

四、以上三部做完,本类库的雏形基本已经具备了,参考如下:

image

红框1:自己的业务代码 红框2:类库原有文件 红框3:添加的资源文件 红框4:引入的第三方,pod管理

PS:这里涉及到一个资源文件的问题,比如图片、视频、音频等的处理。

之前正常项目的做法可能是这样,

1:直接用Assets.xcassets

2:新建resources文件夹,存放图片

但这里,需要注意一点:

对于方法1,这样做是无效的,我们可以新建一个bundle文件,将图片移植过来。

对于方法2,我们可以在本地,直接修改添加后缀.bundle实现

然后另一个重点就是路径问题:

由于类库的资源文件,当我们在正式项目使用时,查找的路径文件不是针对项目,而是针对类库的路径,所以我们这里引用的资源文件路径都要改变一下,而且类库里的其他xib、storyboard文件引用路径都需要更改一下。

修改办法就是:在代码的引用处添加前缀。

定义前缀:

image

如图:

resourceRooturl是xib、storyboard文件前缀路径。

resourceImagesRooturl是图片文件前缀路径。(需要添加一层/images.bundle/)

这个路径怎么来的呢?

Frameworks/XXXX.framework/ 其中XXXX就是你建立的类库名称。

如何引用呢:在代码引用的地方,这样改动

image

image

注意:这里我说的只是针对Framework包里使用图片的路径需要修改。如果外部项目需要使用包内的图片资源,暂未测试,理论上不需要修改。

五、文件都基本添加完毕,可以尝试build一下了

理论上:

只要类库xxx.h文件内,对于使用的oc头文件和第三方头文件,都添加正常引用申明了,就不会有问题。

而且一般报错,也都是因为这里没做好或遗漏的缘故。

此外:如果项目都是纯swift文件(没有混编使用oc文件),这里xxx.h文件只需要导入第三方头文件即可(如果有使用第三方,没有的话基本什么都不用做)。

=======================这里解释一下,xxx.h文件为什么要这样做:=================

因为正常情况下,如果我们swift项目引入了oc文件,我们必须通过一个桥接文件来处理两者之间的转换,而我们在新建类库包的时候,是禁止桥接文件存在的,即使你添加了,也会永远编译不过,打包不了。

所以这里就用到这个 xxx.h 头文件了。

我们可以通过这个文件来实现两者之间的转换,前提就是必须先将oc的.h暴露出来,否则即使你import,也会报错找不到.h 文件。

(这里有个问题,如果oc文件过多,这里需要暴露的就很多,而这里太多的话,一个是不美观,第二是后面项目引用本类库都是能看到这些文件的。所以,能不能通过一个文件,来装载这些所有文件,达到只需要一个文件暴露就行的效果,如果有人实现了,欢迎指导一下,不甚感激。)

六、暴露文件给外部使用

到这里基本就快完成了,那么我们打包的目的就是给外部使用,怎么暴露文件出来呢?

image

1、将我们要暴露的swift文件拖到Public内即可。

2、将需要暴露的swift文件的访问权限申明为public属性。

image

两步缺一不可。

七、编译通过,查看这里

image

红框内就是最终我们得到的Framework包。

右击本地查看,会看到本类库以及对应的依赖第三方库包,后面在其他项目引用的时候,这些都是需要的(需要一起拷贝添加)。

PS:如果没有引用第三方,这里只需要本类库包即可。

** ------------------------------引用篇------------------------------**

1、我们新建一个空的工程,由于我的业务需要,这里工程语言选择OC。

2、新建Framework文件夹,拷贝之前所有的framework包到文件夹内。

3、在工程Targets-General-EmbeddedBinaries内添加Frameworks包

image

image

image

4、由于我的类库包是基于swift建立的,这里oc使用的话,必须设置一个属性:

image

5、由于我们自己的工程都有自己的第三方库引用,这里如果发现两者之间有冲突或重复引用,解决如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a:如果pod引用内,没有标注  use_frameworks!    我们先加上这句话,并pod update,目地是保持两边引用的第三方类库都是Framework类型。

b:移除刚才添加过来中的重复类库,比如AFN

6、添加完,我们就可以在新项目使用类库集成的功能了

这边引用的时候有点特殊:

我们只需要把一个文件import即可,而不需要把每一个需要使用的swift文件import。

举例如图:

image

这个文件是系统帮我们自动生成的一个转换文件,我们要暴露的文件,系统都已经帮我们自动转换后储存在这个文件内,很强大,有么有!!!

比如:我的登录页面 login.swift文件暴露给外部,需要提供入口,我们使用的时候,是不需要import login.swift的,即使你想import,也会发现找不到!!

如果你点进去红框文件,会发现类似这样的内容:

image

所以我们使用的时候,头部只需要import一个文件,下面使用的时候,该使用哪个类就使用哪个类。

前提就是:在打包的时候,你已经把这个文件 添加到Public里了,并且申明了public属性,否则是找不到该文件的。

最后,把我过程中遇到的一些问题纪录一下

引用集成时遇到的坑:

==================================报错1:==================================

dyld: Library not loaded: @rpath/AFNetworking.framework/AFNetworking

这里是因为只引用了之前的类库本身,没有将类库自身的依赖库一并引用过来,

解决办法:

方法1:

image

方法2:

按照我的引用篇-步骤3去做,在general处,全部添加,就不会报这个问题。

==================================报错2:==================================

dyld: Library not loaded: @rpath/libswiftCore.dylib

解决办法:

按照我的引用篇-步骤4去做 ,设置属性为Yes。

Xcode8升级之后属性名称有所变化:

参考我这篇博文

==================================报错3:==================================

Unknown class in Interface Builder file .... image not found 等

解决办法:

参考我这篇博文

==================================报错4:==================================

load storyboard 或xib 崩溃

解决办法:

是因为打包的地方引用文件路径没有改动,需要加上类库前缀路径,详见打包篇-步骤四。

** -----------------------打包合并真机和模拟器------------------------**

详细内容有点多:

参考我这篇博文

若还有其他问题欢迎留言。

enjoy~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.11.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
始终找不到是哪里的问题,楼主方便解答一下吗?
始终找不到是哪里的问题,楼主方便解答一下吗?
回复回复点赞举报
我在引入的时候报了这样的错:/Users/xxx/Desktop/project/CktVideoClip/Pods/Target Support Files/Pods-CktVideoClip/Pods-CktVideoClip-frameworks.sh: line 42: source: unbound variable
我在引入的时候报了这样的错:/Users/xxx/Desktop/project/CktVideoClip/Pods/Target Support Files/Pods-CktVideoClip/Pods-CktVideoClip-frameworks.sh: line 42: source: unbound variable
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Module compiled with Swift 5.x cannot be imported by the Swift 5.3 compiler
Module compiled with Swift 5.2.4 cannot be imported by the Swift 5.3 compiler
韦弦zhy
2020/04/16
14.6K0
oc工程中oc、swift混编代码打包成静态framework踩坑笔记
两天时间探索,期间不知道遇到了多少问题,各种google和Stack Overflow,甚至都求助了群友的力量。期间也想过放弃,还好有一颗不甘的心。终于成功了!
woopDast1
2020/09/04
1.8K0
oc工程中oc、swift混编代码打包成静态framework踩坑笔记
iOS 封装.framework 以及使用
.framework是什么? ----       .framework是什么?       这个问题相信做iOS的都知道答案。 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝、微信SDK等等中的库,这些库可以给我们的开发带来很大的便利。有的时候,由于工作的需要,我们需要对自己的项目进行封装,生成库,方便别人的使用。在这里就边参考好点的博客,边总结一下我们经常看到的.framework。       那什么是“库”呢?       “库”是共享程序代码的一种方式!同行总结的这句话很简单也很好的
Mr.RisingSun
2018/04/18
1.6K0
iOS 封装.framework 以及使用
正经分析iOS包大小优化
包大小优化是项目开发中不可避免会遇到的,网上关于包大小优化的文章很多,每篇文章说的都不尽相同,笔者曾经根据网上的文章做过包大小优化,但效果不尽人意;因此笔者想根据已有的文章、知识结合自己的理解、实践,做一份总结梳理,整理自己的包大小优化逻辑,不光要知道怎么做可以让包大小变化,还要知道为什么这么做能产生效果,所以就有了这篇文章。
莫空9081
2021/05/28
6.2K0
【iOS开发】Swift、OC 混编用到的 Bridging-Header.h
现在 Github 上绝大多数的库都是用 Objective-C 语言写的,当我们使用 Swift 进行开发的时候呢,无论是用 CocoaPods 还是手动把库集成到自己的项目中,一开始都是不能直接使用的。
KyXu
2019/04/11
4.2K0
【iOS开发】Swift、OC 混编用到的 Bridging-Header.h
Android开发快速入门iOS开发(概览)
笔者总结了自己在拥有Android开发的相关基础后入门iOS开发时遇到的点点滴滴给其他想入门iOS 开发的Android开发的一些参考,少走一些弯路,快速上手iOS开发;文章会以iOS 和 Android的开发工具,语言,工程文件和启动类的对比为主线。两者的主要对比概览
stringwu
2022/08/12
1.1K1
ios入门之项目结构介绍
对于刚入门的ios程序猿来说,掌握Xcode开发工具及程序项目是非常必要的,掌握这些基本的内容对于我们后期开发,调试也是很有帮助的。 首先,创建一个 Xcode 工程。 应用配置 点击项目的.xcod
xiangzhihong
2018/02/06
2.3K0
ios入门之项目结构介绍
The 'Pods-App' target has transitive dependencies that include static binaries报错
最近遇到了两次次这个问题,都是Swift项目Pod添加库开启了use_frameworks!,安装某些OC库时报错;花了好久时间解决,突然想起来之前OC项目安装Swift库也遇到了这个问题,但是之前没有记录,所以这次遇到时没有印象;这次记录下来,分享给大家:
莫空9081
2022/06/13
9520
基于CocoaPods的组件化原理及私有库实践
智人能在残酷的进化大战中存活下来,原因之一就是智人懂得将知识沉淀成外物,辅助彼此之间的合作,从而使得整个群体产生了规模效应,即1+1>2的效果。 从一个角度上说,石器时代是基于石器的组件化的时代,因为老张家的石矛(或其它石头利器)借给了老王,一样可以拿去狩猎。要想实现这个目的,一定要保证:
nimomeng
2019/03/04
5.1K0
Xcode14编译的APP低版本崩溃
测试说iOS 12的手机上安装Xcode14.0.2导出的新包后,打开就崩溃,但是在系统版本高的手机上就没有问题。
莫空9081
2022/10/11
3.5K1
Swift开发React Native组件
前面说过,React Native作为一个全新的跨平台开发框架,好多东西还不是很成熟,很多原生的控件还不是很完善,于是好多爱好者便自己封装相关的组件,可以使用oc来封装,也可以使用Swift来封装。关于封装的原理,大家可以访问我的书的《React Native移动开发实战》。 基础 学习本章知识,需要读者具备一定的OC和Swift语言基础,读者可以从下面的链接中获取学习资料。 Apple 官方引导 Xcode入门 Swift英文文档 UIKit UIKit框架是iPhone应用程序开发中最基本的框架
xiangzhihong
2018/02/06
3K1
Swift开发React Native组件
OC framework 与 Swift 混编
在模块化,组件化的热潮下,不管是真的因为业务复杂或者是对于未来业务的提前规划还是只是被这股热潮裹挟着,我们手上不少项目都已经完成了组件化或者正在实现。当历史模块需要修改时,直接使用OC进行是一个很正确的选择,但是某些时候,引入 Swift 也是其中一个选择。
韦弦zhy
2023/10/16
2K0
OC framework 与 Swift 混编
iOS里的动态库和静态库
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(图1所示)
且行且珍惜_iOS
2022/05/13
3K0
iOS里的动态库和静态库
CocoaPods对三方库的管理探究
CocoaPods是iOS开发中经常被用到的第三方库管理工具,我们有必要深入了解一下它对项目产生了什么影响,以及它是如何管理这些库的。
网罗开发
2021/01/29
3K0
CocoaPods对三方库的管理探究
swift将framework提交到Carthage管理
swift将framework提交到Carthage管理 提交到Carthage管理 创建好自己的framework工程 然后共享你的schemes image
用户6094182
2019/08/23
5410
swift将framework提交到Carthage管理
CocoaPods 2017最新、最快安装和使用说明
2017 - 11 - 29 更新       记录: 今天把系统升级到了最新的10.13 也就是high sierra,导入snapKit的时候Cocoapods的时候出现了下面的问题: -bash
Mr.RisingSun
2018/01/09
8730
CocoaPods  2017最新、最快安装和使用说明
iOS开发 使用Pods管理调试个人Framework写在前面准备工作编写Podfile测试后记
我这边就主要讲一讲Framework的调试,包含第三方库的集成,目前使用的还是pod, carthage就暂时不说了,理论上比pod要更方便使用
gwk_iOS
2018/08/23
1.7K0
iOS开发 使用Pods管理调试个人Framework写在前面准备工作编写Podfile测试后记
Swift和Objective-C混编在有赞移动的实践
随着 Xcode 11、Swift 5.1 的正式发布,Swift 目前已经实现了 ABI 稳定及模块稳定,语法及实现也比以往更加成熟稳定,所以我们在微商城和零售等业务线中尝试使用 Swift 开发部分业务,并在二方库中进行混编开发,在此我们将一些混编经验分享出来。
有赞coder
2020/08/24
2.4K0
Swift和Objective-C混编在有赞移动的实践
cocoapods从安装到使用
CocoaPods是一个用来帮助我们管理第三方依赖库的工具。它可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我们的工程连接起来,供我们开发使用。这么说可能还不是很理解,当我们开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,A依赖B,B又依赖C......。总之笔者的意思,手动一个个去下载所需类库十分麻烦。另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本依赖库,然后一个个重新加入到项目中,费时费力,操作繁琐且容易出错。如果能有什么工具能代替我们手工去解决这些依赖和更新问题,那我们开发效率将如有神助。这就是CocoaPods的作用。 总而言之,使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。
VV木公子
2018/06/05
15.8K0
移动端小白,30天掌握Flutter双端插件开发-下(iOS篇)
距离上篇文章过去了一个半月了,主要双端都开发完毕,不能继续带薪学习了,需要干点正事,让这么久的辛勤成果发挥它应有的价值-上架。Android的需要上架各个应用商店,iOS的上架App Store,第一次干这活可比攻坚技术还让人心力交瘁,一把心酸泪在心里流淌,光吐槽都能再水2000个字。这么长时间也不能光忙活个上架的事,协助同事完善了一下公司的后台管理系统,还还开发了另一款相机插件,那是后话了。
用户6256742
2024/06/12
4320
移动端小白,30天掌握Flutter双端插件开发-下(iOS篇)
相关推荐
Module compiled with Swift 5.x cannot be imported by the Swift 5.3 compiler
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验