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

   2023-02-09 学习力0
核心提示:场景说明:-之前做的App,使用Swift框架语言,混合编程,内含少部分OC代码。-需要App整体功能打包成静态库,完整移植到另一个App使用,该App使用OC。-所以涉及到一个语言互转的处理,以及一些AppDelegate的代码减除变化。 --------------------------------

场景说明:

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

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

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

 

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

 

实现步骤:

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

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

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

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

 

解释一下这两个文件:

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

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

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

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

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

 

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

 

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

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

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

原因见步骤五。

 

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

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

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

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

 

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

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

 

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

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

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

 

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

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

1:直接用Assets.xcassets

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

但这里,需要注意一点:

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

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

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

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

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

 

定义前缀:

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

如图:

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

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

这个路径怎么来的呢?

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

 

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

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

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

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

 

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

理论上:

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

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

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

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

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

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

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

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

 

六、暴露文件给外部使用

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

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

 

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

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

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

 

两步缺一不可。

 

七、编译通过,查看这里

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

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

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

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

 

 

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

 

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

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

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

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

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

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

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

 

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

    a:如果pod引用内,没有标注  use_frameworks!    我们先加上这句话,并pod update,目地是保持两边引用的第三方类库都是Framework类型。

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

 

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

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

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

举例如图:

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

 

 

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

 

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

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

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

 

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

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

 

 

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

引用集成时遇到的坑:

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

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

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

解决办法:

方法1:

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

方法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~~

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • swift 命令行工具初探
    亲爱的同学们好,今天我们要介绍这么一个东西。相信有过解释型语言(PHP,Ruby,等)使用经验的同学会更加熟悉,就是 Swift 也为我们提供了命令行运行工具,俗称 REPL。好了,我们进入正题,在安装好 Swift 开发环境的机器上,打开命令行,输入 swift 命令,就进
    03-16
  • [Swift]冒泡排序 | Bubble sort
    [Swift]冒泡排序 | Bubble sort
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文
    03-08
  • [Swift] 自定义在 SwiftUI 中实现的可搜索的外观
    [Swift] 自定义在 SwiftUI 中实现的可搜索的外
    首先我找遍了,似乎找不到任何信息......(我遇到了许多根本不起作用的事情......)终于在详细的英文文献中找到了,我会保留下来,希望以后有机会。关于 SwiftUI 中的可搜索searchable是iOS15新增的易于实现的搜索字段。关于这种情况有一个参数placement,您
    03-08
  • [Swift] 检测 SwiftUI ScrollView 中的偏移量
    [Swift] 检测 SwiftUI ScrollView 中的偏移量
    首先你可以用ScrollViewReader做一些可以从iOS14使用的事情。但是,我不能做我想做的事情,所以我想我还能做些什么。再次,可重复使用我尝试过了。执行我将首先发布实现的图像。 (Swift Playgrounds 演示)您可以像这样根据滚动获取坐标。让我们看看实现。1.
    03-08
  • Swift3.0 UICollectionView 删除,拖动
    Swift3.0 UICollectionView 删除,拖动
    UICollectionView实现了一下常见的新闻分类.  附有效果图 近期一直在深入学习swift,实现了CollectionView item的头东与删除,用的都是系统的一些函数方法,看起来比较直观. 第一步:class HotViewController: UIViewController,UICollectionViewDelegate,UICo
    02-09
  • swift -懒加载创建view
     // 只有外界访问到headerView的时候才会去执行闭包, 然后将闭包的返回值赋值给headerView    // 注意: 一定要记住闭包后面需要写上(), 代表执行闭包    //懒加载创建UIView    lazy var headerView: UIView = {        let view = UIView()
    02-09
  • Swift--非常好用的适合局部的代码约束
    // 哪个控件的哪个属性等于(大于、小于)另外一个控件的哪个属性乘以多少再加上多少 eg:let widthContraint = NSLayoutConstraint(item: messageLabel, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLa
    02-09
  • Swift -- 官方文档Swift-Guides的学习笔记
    在经历的一段时间的郁闷之后,我发现感情都是虚伪的,只有代码是真实的(呸)因为看了swift语法之后依然不会用swift,然后我非常作死的跑去看官方文档,就是xcode里自带的help》documentation and API reference其中的swift里的guide这里主要总结一下里面每一
    02-09
  • Swift - 进度条(UIProgressView)的用法
     1,创建进度条1234var progressView=UIProgressView(progressViewStyle:UIProgressViewStyle.Default)progressView.center=self.view.centerprogressView.progress=0.5 //默认进度50%self.view.addSubview(progressView); 2,设置进度,同时有动画效果1p
    02-09
  • [Swift]LeetCode358. 按距离为k隔离重排字符串
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文
    02-09
点击排行