Swift完整项目打包Framework,嵌入OC项目使用
场景说明:
-之前做的App,使用Swift框架语言,混合编程,内涵少部分OC代码。
-需要App整体功能打包成静态库,完整移植到另一个App使用,该App使用OC。
-所以涉及到一个语言互转的处理,以及一些appdelegate的代码减除变化。
-----------------------------------------打包篇-----------------------------------------
实现步骤:
一、新建 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。
Xcode8升级之后属性名称有所变化:
参考这篇:http://www.cnblogs.com/yajunLi/p/5979621.html
==================================报错3:==================================
Unknown class in Interface Builder file .... image not found 等
解决办法:
http://www.cnblogs.com/yajunLi/p/5980560.html
==================================报错4:==================================
load storyboard 或xib 崩溃
解决办法:
是因为打包的地方引用文件路径没有改动,需要加上类库前缀路径,详见打包篇-步骤四。
----------------------------打包合并真机和模拟器------------------------------
详细见我另一篇文章:
http://www.cnblogs.com/yajunLi/p/6005077.html
若还有其他问题欢迎留言。
本文结束。
Swift完整项目打包Framework,嵌入OC项目使用的更多相关文章
- iOS打包framework - Swift完整项目打包Framework,嵌入OC项目使用
场景说明: -之前做的App,使用Swift框架语言,混合编程,内含少部分OC代码. -需要App整体功能打包成静态库,完整移植到另一个App使用,该App使用OC. -所以涉及到一个语言互转的处理, ...
- 使用cmd命令创建maven(web)项目+项目转换成IDEA项目+项目打包+Jetty运行Web项目
3条件:配置好环境 配置环境教程:https://www.cnblogs.com/weibanggang/p/9623705.html 第一步:查看版本信息,在cmd输入mvn –version,如果 ...
- 解决项目打包过程检出项目出现 svn:e15500错误
svn:E15500 is already a working copy for a different url 原因:文件夹含有svn信息的隐藏文件未删除 解决办法:把该文件夹删除掉,然后重新建立同 ...
- OC项目加入swift第三方库遇到的坑
https://www.jianshu.com/p/96d868dcd69c 2017.07.07 16:23* 字数 295 阅读 5218评论 2喜欢 4 首先,在OC项目的Podfile文件中添 ...
- 在OC项目工程中混编Swift
1.创建一个OC项目工程,然后在Build Settings中找到如下字段,修改. 2.然后在项目中创建swift文件,如果系统提示是否需要创建桥接文件的时候,点击确定. 然后在Build Setti ...
- 在Swift项目中使用OC,在OC项目中使用Swift
几天前,我开始新的App的开发了.终于有机会把swift用在实战中了,也学到了之前纯学语法时没有机会获得的知识. 这篇博文中,我就如何使用swift.OC混编做一个介绍. OC中使用Swift 首先, ...
- 小型 Web 页项目打包优化方案
背景 目前团队中新的 Web 项目基本都采用了 Vue 或 React ,加上 RN,这些都属于比较重量级的框架,然而对于小型 Web 页面,又显得过大.早期的一些项目则使用了较原始的 HTML ...
- Java项目打包方式分析
[TOC] 概述 在项目实践过程中,有个需求需要做一个引擎能执行指定jar包的指定main方法. 起初我们以一个简单的spring-boot项目进行测试,使用spring-boot-maven-plu ...
- 将项目打包成jar,如何又将jar还原成项目
一.将项目打包成jar 第一步: 选择项目,鼠标右键,选择export ,出现如下 接下来就是点击Next,Next,最后点击Finish 后 会生成jar 二.将jar还原成项目 第一步 用反编译工 ...
随机推荐
- [小北De编程手记] : Lesson 01 玩转 xUnit.Net 之 概述
谈到单元测试,任何一个开发或是测试人员都不会觉得陌生.我想大多数的同学也都是接触过各种单元测试框架.关于单元测试的重要性,应该不会有太多的质疑.这个系列,我向大家介绍一下xUnit.Net的使用.就让 ...
- 正确的前端传后台json方式
DEMO: var data=JSON.stringify({"page": {"pagenow": 1,"pagesize": 20},& ...
- Hibernate框架(未完待续······)
作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...
- GifShot - 创建动态 GIF 的 JavaScript 库
GifShot 是一个可以创建流媒体,视频或图像的 GIF 动画的 JavaScript 库.该库的客户端特性使其非常便携,易于集成到几乎任何网站.利用最先进的浏览器 API ,包括 WebRTC , ...
- CSS3 模块
CSS3 被划分为模块. 其中最重要的 CSS3 模块包括: 选择器 框模型 背景和边框 文本效果 2D/3D 转换 动画 多列布局 用户界面
- 【web前端面试题整理07】我不理解表现与数据分离。。。
拜师传说 今天老夫拜师了,老夫有幸认识一个JS高手,在此推荐其博客,悄悄告诉你,我拜他为师了,他承诺我只收我一个男弟子..... 师尊刚注册的账号,现在博客数量还不多,但是后面点会有干货哦,值得期待. ...
- Spring(3)—— Junit框架单元测试
Junit主要用于单元测试,即白盒测试.它是一个开源的由JAVA开发的一个用于测试的框架. Junit的几个基本概念:TestCase,TestSuite,TestFixtrue TestCase:代 ...
- iOS 代理反向传值
在上篇博客 iOS代理协议 中,侧重解析了委托代理协议的概念等,本文将侧重于它们在开发中的应用. 假如我们有一个需求如下:界面A上面有一个button.一个label.从界面A跳转到界面B,在界面B的 ...
- SharePoint 2010 人员选择器搜索范围的限定
客户AD中用户信息过多,而当前的SharePoint应用中不需要针对所有AD进行筛选,则需要通过STSADM来设置搜索范围: stsadm -o setsiteuseraccountdirectory ...
- RecyclerView局部刷新那点事
1.局部刷新的引入 提到RecyclerView,我们首先想到的是ListView,对于ListView的局部刷新,我们之前已经有解决方案,[android:ListView的局部刷新]当时的解决方案 ...