码迷,mamicode.com
首页 > 编程语言 > 详细

纪录Swift完整项目打包Framework,嵌入OC项目使用

时间:2016-10-22 17:35:37      阅读:417      评论:0      收藏:0      [点我收藏+]

标签:业务   xca   改变   项目   upd   之间   gets   img   选择   

场景说明:

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

-需要App整体功能打包成静态库,完整移植到另一个App使用,该App使用OC语言,基于ReactiveCocoa框架。

 

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

 

实现步骤:

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

技术分享

建立完成,会看到默认生成的一个  xxx.h 和  Info.plist  文件。

xxx.h 文件的作用有如下:

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

技术分享

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

以上两部完成效果,如图:

技术分享

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

 

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

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

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

原因见步骤五。

 

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

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

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

技术分享

 

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

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

 

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

技术分享

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

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

1:直接用Assets.xcassets

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

但这里,需要注意一点:

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

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

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

技术分享

如图:

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

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

这个路径怎么来的呢?

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

引用截图参考:

技术分享

技术分享

 

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

理论上,只要类库默认的xxx.h文件内,oc的头文件和第三方头文件都正常引用了,就不会有问题。

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

如果项目都是纯swift文件,这里xxx.h文件只需要导入第三方头文件即可。

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

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

所以这里就用到这个类库默认生成的 xxx.h头文件了。

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

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

 

六、编译通过,查看这里

技术分享

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

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

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

 

 

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

 

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

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

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

技术分享技术分享 

技术分享

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

技术分享

 

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

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

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

 

 

 

这里引用集成时我遇到的坑如下:

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

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

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

解决办法:

方法1:

技术分享

方法2:

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

 

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

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

解决办法:

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

 

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

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

解决办法:

http://www.cnblogs.com/yajunLi/p/5980560.html

 

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

load  storyboard 或xib  崩溃

解决办法:

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

 

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

本文结束。

纪录Swift完整项目打包Framework,嵌入OC项目使用

标签:业务   xca   改变   项目   upd   之间   gets   img   选择   

原文地址:http://www.cnblogs.com/yajunLi/p/5987687.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!