iOS打包framework-Swift完整项⽬打包Framework,嵌⼊OC项⽬
使⽤
场景说明:
-之前做的App,使⽤Swift框架语⾔,混合编程,内含少部分OC代码。
-需要App整体功能打包成静态库,完整移植到另⼀个App使⽤,该App使⽤OC。
-所以涉及到⼀个语⾔互转的处理,以及⼀些AppDelegate的代码减除变化。
--------------------------------打包篇-------------------------------
实现步骤:
⼀、新建 Project - Framework&Library - Cocoa Touch Framework,Next 语⾔选择Swift
建⽴完成,会看到默认⽣成的⼀个 xxx.h 和 Info.plist ⽂件(只看红框内)。
解释⼀下这两个⽂件:
1 xxx.h ⽂件的作⽤是整个包对外提供的⼊⼝头⽂件,除了正常定义参数属性之外,还有
1、提供 Swift项⽬内引⽤的OC⽂件的import引⽤,注意,这⾥引⽤之前必须在Build Phrases的Headers内暴露到 Public,见步骤六
2、提供第三⽅⽂件的import引⽤,这⾥的第三⽅管理,我们依然选择使⽤Pods管理,下⽂会具体描述。
以上两部完成后,举例效果图:
2 info.plist ⽂件的作⽤就如同正常项⽬的plist⽂件作⽤,⽤来定义或添加⼀些属性。
⼆、添加⽂件,这⾥可以⾃⼰新建,或者从已有项⽬拷贝过来都可以。
这⾥要注意⼀下:由于打包类库⼯程不是⼀个完整项⽬⼯程,所以并没有AppDelegate等⽂件,所以涉及到这些的⽂件要额外处理,或改代码,或适当改变功能。
注意:⼯程如果有桥接⽂件,是不能拷贝过来的,否则编译不通过。
原因见步骤五。
三、如果有第三⽅类库引⽤,添加第三⽅库⽂件,有⼏个注意点:(没有第三⽅可以跳过这步)
a、第三⽅库依然使⽤Pods进⾏管理,添加⽅法同正常项⽬⼀样。
b、引⽤的时候,我们需要添加【use_frameworks!】来告诉pod ⽣成动态库⽂件Framework类型,这样做的好处是在正式项⽬⽤到本类库的时候,如果两者第三⽅库有引⽤冲突,可以根据冲突类库,对本类库引⼊的这些依赖库进⾏移除。
但有时第三⽅类库只有 .a 类型的,怎么办?
解决:如果第三⽅库只有.a类型,就需要⼿动把库⽂件拷贝到项⽬,⽽不能通过pod添加,否则在往步骤1内的头⽂件添加import时会不到⽂件,造成报错。
四、以上三部做完,本类库的雏形基本已经具备了,参考如下:
红框1:⾃⼰的业务代码
红框2:类库原有⽂件
红框3:添加的资源⽂件
红框4:引⼊的第三⽅,pod管理
PS:这⾥涉及到⼀个资源⽂件的问题,⽐如图⽚、视频、⾳频等的处理。
之前正常项⽬的做法可能是这样,
1:直接⽤assets
2:新建resources⽂件夹,存放图⽚学swift语言能干什么
但这⾥,需要注意⼀点:
对于⽅法1,这样做是⽆效的,我们可以新建⼀个bundle⽂件,将图⽚移植过来。
对于⽅法2,我们可以在本地,直接修改添加后缀.bundle实现
然后另⼀个重点就是路径问题:
由于类库的资源⽂件,当我们在正式项⽬使⽤时,查的路径⽂件不是针对项⽬,⽽是针对类库的路径,所以我们这⾥引⽤的资源⽂件路径都要改变⼀下,⽽且类库⾥的其他xib、storyboard⽂件引⽤路径都需要更改⼀下。
修改办法就是:在代码的引⽤处添加前缀。
定义前缀:
如图:
resourceRooturl是xib、storyboard⽂件前缀路径。
resourceImagesRooturl是图⽚⽂件前缀路径。(需要添加⼀层/images.bundle/)
这个路径怎么来的呢?
Frameworks/XXXX.framework/ 其中XXXX就是你建⽴的类库名称。
如何引⽤呢:在代码引⽤的地⽅,这样改动
注意:这⾥我说的只是针对Framework包⾥使⽤图⽚的路径需要修改。如果外部项⽬需要使⽤包内的图⽚资源,暂未测试,理论上不需要修改。
五、⽂件都基本添加完毕,可以尝试build⼀下了
理论上:
只要类库xxx.h⽂件内,对于使⽤的oc头⽂件和第三⽅头⽂件,都添加正常引⽤申明了,就不会有问题。
⽽且⼀般报错,也都是因为这⾥没做好或遗漏的缘故。
此外:如果项⽬都是纯swift⽂件(没有混编使⽤oc⽂件),这⾥xxx.h⽂件只需要导⼊第三⽅头⽂件即可(如果有使⽤第三⽅,没有的话基本什么都不⽤做)。
=======================这⾥解释⼀下,xxx.h⽂件为什么要这样做:=================
因为正常情况下,如果我们swift项⽬引⼊了oc⽂件,我们必须通过⼀个桥接⽂件来处理两者之间的转换,⽽我们在新建类库包的时候,是禁⽌桥接⽂件存在的,即使你添加了,也会永远编译不过,打包不了。
所以这⾥就⽤到这个 xxx.h 头⽂件了。
我们可以通过这个⽂件来实现两者之间的转换,前提就是必须先将oc的.h暴露出来,否则即使你import,也会报错不到.h ⽂件。
(这⾥有个问题,如果oc⽂件过多,这⾥需要暴露的就很多,⽽这⾥太多的话,⼀个是不美观,第⼆是后⾯项⽬引⽤本类库都是能看到这些⽂件的。所以,能不能通过⼀个⽂件,来装载这些所有⽂件,达到只需要⼀个⽂件暴露就⾏的效果,如果有⼈实现了,欢迎指导⼀下,不甚感激。)
六、暴露⽂件给外部使⽤
到这⾥基本就快完成了,那么我们打包的⽬的就是给外部使⽤,怎么暴露⽂件出来呢?
1、将我们要暴露的swift⽂件拖到Public内即可。
2、将需要暴露的swift⽂件的访问权限申明为public属性。
两步缺⼀不可。
七、编译通过,查看这⾥
红框内就是最终我们得到的Framework包。
右击本地查看,会看到本类库以及对应的依赖第三⽅库包,后⾯在其他项⽬引⽤的时候,这些都是需要的(需要⼀起拷贝添加)。PS:如果没有引⽤第三⽅,这⾥只需要本类库包即可。
------------------------------引⽤篇------------------------------
1、我们新建⼀个空的⼯程,由于我的业务需要,这⾥⼯程语⾔选择OC。
2、新建Framework⽂件夹,拷贝之前所有的framework包到⽂件夹内。
3、在⼯程Targets-General-EmbeddedBinaries内添加Frameworks包
4、由于我的类库包是基于swift建⽴的,这⾥oc使⽤的话,必须设置⼀个属性:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论