Loading [MathJax]/jax/output/CommonHTML/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
3K00
代码可运行
举报
文章被收录于专栏: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
新网站如何做好SEO优化,获得好的收录和排名,99%的人不知道
F首先常见的基本功需要做好,比如全站HTTPS,CDN,缓存提速让网站速度打开很快,百度搜索主动API提交站点URL和站点地图,坚持优质原创内容的定期发布比如每天发布一篇原创文章,不用过度优化或者是作弊堆砌关键词等等。
wordpress建站吧
2021/12/28
7260
新网站如何做好SEO优化,获得好的收录和排名,99%的人不知道
WordPress真的不利于网站的SEO搜索引擎优化吗?
wordpress建站几乎是我们大多数初级站长的首选,wp程序是目前全世界范围被广泛使用的建站程序,可以快速的构建出我们想要的网站来。但很多的站长初期并没有太多的预算所以都是购买的廉价虚拟主机。
wordpress建站吧
2021/10/14
2.4K0
WordPress真的不利于网站的SEO搜索引擎优化吗?
如何选择ECS与VPS服务器?
在当今数字化浪潮中,服务器的选择对于众多企业和个人而言至关重要。其中,ECS(云服务器)与 VPS(虚拟专用服务器)常常成为人们关注和探讨的焦点。那么,它们究竟有什么区别呢?哪个会更好呢?国内又是否存在免备案的服务器呢?让我们一同深入探究这些疑问。
云惑雨问
2025/03/10
1.7K0
WordPress建站服务器推荐选择几核几G?
WordPress建站服务器推荐选择几核几G? 很多人打算用wordpress来构建自己的网站,不管是企业官网,电商网站,外贸网站,个人博客等等都是可以的。
wordpress建站吧
2022/03/15
4.9K0
WordPress建站服务器推荐选择几核几G?
如何挑选一台云服务器
以前,我作为一个个人开发者,倒腾过一些入门级别的云服务器,玩玩技术,不太在意云服务器的性能。
五分钟学算法
2023/01/10
20.8K0
如何挑选一台云服务器
云服务器和虚拟主机有什么区别,该选择哪种类型?
昨天转载了昝辉老师的SEO优化文章,文章曾提到关于主机是否会对SEO有影响,结果影响不大,除非因作弊导致的连带责任,但是在选择主机的时候可能就犯难了。我记得在前些年,虚拟机是最火的因为便宜,对于新手站长来说能免费就不花钱,景安很长时间有免费的主机,我之前也一直再用,还不错,只是去年景安的免费虚拟机全部停运了,挺可惜。今年开始盛行云服务器,价格比虚拟机稍稍贵一些,但是新用户基本都是1折起,这么算下来跟虚拟机售价一样了,至于怎么选择,我们一起探讨一下。
李洋博客
2023/03/03
6.5K0
云服务器和虚拟主机有什么区别,该选择哪种类型?
体验腾讯云的建站主机和云服务器
  建站主机(Light Hosting)是基于单台云服务器提供应用环境的云虚拟主机,预装网站开发所需的应用环境,并且提供域名绑定、部署 SSL 证书等便捷操作,即买即用,一站式完成应用的搭建。   云服务器(Elastic Compute Service, ECS)是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器。   云服务器是通过虚拟化技术,将一台独立服务器虚拟成多个小的服务器,每个云服务器的运行和管理都完全独立可分配独立公网IP地址、操作系统Windows/Linux、超大磁盘、内存、CPU资源等。就相当于高级公寓里面有很多房间并且每个房间都有独立厨卫。虚拟主机是把一台服务器分割成很多的小空间,其流量带宽和IP以及CPU硬盘内存等所有资源均是共享使用的。就相当于集体宿舍里面有很多床铺,厨卫都是共用的。
程序员云帆哥
2022/05/12
18.3K0
体验腾讯云的建站主机和云服务器
新手问题 虚拟主机和VPS的区别
我们以做外贸网站来说,在国外IDC处购买网站空间,最常见的分类就是:SHARED WEB HOSTING(共享虚拟主机)、DEDICATED WEB HOSTING(独享虚拟主机)VIRTUAL PRIVATE SERVER(VPS)、MANAGED WORDPRESS HOSTING(管理型WORDPRESS主机)
会长君
2023/04/24
9.3K0
新手问题 虚拟主机和VPS的区别
如何快速SEO优化自己的新网站,获得好的收录和排名
新站长们的SEO感觉是一条艰难的道理,seo没有捷径,我们只能按图索骥的跟随着官方的seo建议去做好自己的网站,关于seo优化网站其实是一个很大很宽泛的话题,需要做的工作其实非常的多,所以几乎所有的文章谈论seo都是比较片面的,真要写感觉已经够写一本书了,所以今天这篇文章也比较片面的来谈论下我对seo的一些认识和日常中常用的一些经验总结;
wordpress建站吧
2020/11/20
1.1K0
如何快速SEO优化自己的新网站,获得好的收录和排名
业内人士揭秘,云服务器采购,那些你不可能知道的陷阱
不入行不知水深。我们整理出了一些你不知道的云服务器行业内幕,希望能帮助中小企业规避陷阱,找到最适合自己的云服务器。
AiTechYun
2018/12/26
2.6K0
虚拟主机、VPS、云服务器三者的区别
虚拟主机相对于其他两种云主机的主要区别就是,虚拟主机无需用户部署网站环境,通常默认支持多种建站环境,用户直接上传建站程序安装就可以使用。由于虚拟机空间不支持连接到桌面进行其他操作,所以一般服务器租用商都会提供一个控制面板,可以进行域名绑定、文件解压缩等简单操作。
兮动人
2021/06/11
14.2K0
VPS、物理服务器、虚拟主机、云服务器的含义与区别
很多初学者不知道vps,物理服务器,虚拟主机,云服务器的含义和区别,今天与大家一起说说它们之间的含义和区别: VPS: VPS(Virtual Private Server 虚拟专用服务器)技术,由于有很多的物理服务器其实使用率很低,平均cpu的使用率在20%以下。于是就将一台物理服务器分割成多个虚拟专享服务器的优质服务。实现VPS的技术分为容器技术和虚拟化技术。在容器或虚拟机中,每个VPS都可分配独立公网IP地址、独立操作系统、实现不同VPS间磁盘空间、内存、CPU资源、进程和系统配置的隔离,为用户和应用程序模拟出“独占”使用计算资源的体验。VPS可以像独立服务器一样,重装操作系统,安装程序,单独重启服务器。 简单的说,就是在物理服务器内通过虚拟化技术,在一套操作系统的技术上,虚拟出很多套的独立运行的操作系统出来,从用户角度来看,就像是有很多台服务器可以使用(其实是运行在同一套物理设备里面)。这一套套虚拟出来的独立的操作系统就是VPS。如果您还未找到一款合适的动态拨号vps,我可推荐青果云动态拨号vps,专业技术,自建机房,节点丰富,秒拨数百万ip,高可靠人性化设计,精心打造从节点到系统给您不一样的感觉,力助您的业务遍布全国的每一个角落。  物理服务器: 一台实实在在物理机,服务器性能和稳定性比普通PC强,但是价格昂贵,一般有钱的大佬才会使用独立的物理服务器(就是需要自己实实在在买一台设备放在那里)。性能强,但是无论用还是不用,机器和网络等成本都在那里。 虚拟主机: VPS主机可以像独立服务器一样分割出许多虚拟主机空间,每个空间都可以放许多网站,非常适合为中小企业、小型门户网站、个人工作室、SOHO一族提供网站空间,较大独享资源,安全可靠的隔离保证了用户对于资源的使用和数据的安全。 云服务器: 云服务器就是一些实际的硬件设备(很多个物理服务器),通过虚拟化技术,可以大规模统一调度,并当成“一台”机器的技术。你根本看不到它在哪里,看不到它的CPU、内存、硬盘,但是你可以轻松把它当成“一台”现实中的主机来操作,无论是配置软件、测试性能、还是上传文件都和传统服务器没什么区别。由是数量庞大的服务器阵列,在均衡负载之后诞生很多虚拟主机,无论是数据安全还是性能都有基本的保证。 可以说云服务器是一种类似VPS服务器的虚拟化技术,VPS是采用虚拟软件,VZ或VM在一台服务器上虚拟出多个类似独立服务器的部分,每个部分都可以做单独的操作系统,管理方法同服务器一样。 云服务器是在一组集群服务器上虚拟出多个类似独立服务器的部分,集群中每个服务器上都有云服务器的一个镜像,从而大大提高了虚拟服务器的安全稳定性,除非所有的集群内服务器全部出现问题,云服务器才会无法访问。
青果网络
2020/05/23
21.3K0
将 Hexo 部署在云服务器
将 Hexo 部署在云服务器 前言 众所周知,使用 GitHub Page 的访问速度令人发指,当然也有很多人选择部署到 Vercel,这便是我之前的选择,免费,同时还有着更快的速度。但说到底,云服务器往往是更好的选择,只要钱到位 😑。 使用宝塔面板可以比较方便快速的进行部署,不过我更想自己实际动手操作,也一边学习 Linux,就不使用了。 准备工作 本文假设你拥有 Hexo 建站相关的知识,相关的问题不再赘述,你也可以点击这里查看 Hexo 建站相关的知识。 在阅读本文之前,你需要做好以下准备:
EmoryHuang
2022/10/31
5.4K0
云服务器和虚拟主机有什么区别?区别大吗?
大家好,又见面了,我是你们的朋友全栈君。 云服务器和虚拟主机有什么区别?区别大吗? 如今云服务器和虚拟主机已经成为众多企业和个人建站的必选之一,两者其实各有各的优点,云服务器是一种简单高效、安全
全栈程序员站长
2022/09/12
17.2K0
云服务器怎么配置cpu与内存搭配「建议收藏」
很多朋友在购买云服务器之前都会搜服务器一般用几核才够用,因为服务器现在配置很多。低到1核2G、2核4G。高到16核32G、32核64G。甚至某些云服务器可以做到256核5120G这种神奇配置。那么购买云服务器时如何选择cpu与内存搭配?出现资源不足时应如何排查原因呢?
全栈程序员站长
2022/08/31
12.9K0
各平台云服务器选择和对比
相信大多数学习计算机相关专业的小伙伴都应该知道什么是云服务器;简单来说云服务器就是,别人配置好放到远端给你使用的一台电脑,你通过ssh或者其他方式来登录这台电脑,并使用这台电脑完成你想要做的事情;并且大多数云服务器提供商都会顺带提供静态的公网IP给你使用,这样你部署的应用就可以被别人访问了;
Kami米雅
2021/11/26
20.7K2
各平台云服务器选择和对比
服务器基础知识
服务器是计算机的一种,它比普通计算机运行更快、负载更高、价格更贵。服务器在网络中为其他客户机提供计算或应用服务。服务器具有高速的 CPU 运算能力、长时间的可靠运行、强大的 IO 外部数据吞吐能力以及更好的扩展性。根据服务器所提供的服务,一般来说服务器都具备承担响应服务请求、承担服务、保障服务的能力。服务器作为电子设备,其内部结构十分复杂,但与普通计算机内部结构相差不大。
全栈程序员站长
2021/04/07
1.3K0
腾讯云CVM购买及评测分析
随着国内主流商家也开始从事网站主机业务之后,很多原本单一业务的企业、个人或者在未来几年后肯定需要转型,因为像阿里、腾讯、百度等大商家进入主机市场之后,无论是从价格、性能稳定、以及售后服务等肯定优势还是比较明显的,笔者也看到很多个人商家很多原本的主机业务都开始转型至特定服务的项目。比如提供海外、香港、抗D等特定需求和性能能产品赢得细分市场的需求。
用户2416682
2019/09/27
7.7K0
腾讯云CVM购买及评测分析
基于服务器的个人博客网站搭建
服务器与本地xshell连接,就像连接Linux系统一样,只是ip写成服务器的公网ip。
CoreDao
2021/04/13
4.1K0
基于服务器的个人博客网站搭建
腾讯云轻量应用服务器和CVM云服务器有什么区别?
腾讯云轻量服务器和云服务器有什么区别?为什么轻量应用服务器价格便宜?是因为轻量服务器CPU内存性能比云服务器CVM性能差吗?轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境,云服务器CVM适合更复杂如高并发网站、大数据计算、机器学习等复杂应用场景。轻量服务器网从性能测试、网络带宽、计费价格、应用搭建及适合用户等方面来详细说明腾讯云轻量应用服务器和云服务器CVM区别:
上云小秘书
2023/04/10
9.7K0
腾讯云轻量应用服务器和CVM云服务器有什么区别?
推荐阅读
相关推荐
新网站如何做好SEO优化,获得好的收录和排名,99%的人不知道
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验