Framework打包

Stella981
• 阅读 662

iOS app需要在许多不同的CPU架构下运行:

  • arm7: 在最老的支持iOS7的设备上使用

  • arm7s: 在iPhone5和5C上使用

  • arm64: 运行于iPhone5S的64位 ARM 处理器 上

  • i386: 32位模拟器上使用

  • x86_64: 64为模拟器上使用

由于需要打包的代码部分大多数由Swift编写。然后了解背景知识,Swift只支持动态库(Dynamic)打包。

所以先用动态库进行打包。试坑吧:

1.打开Xcode(图为楼主更新到Xcode8之后采用样式),创建项目

选择如图下所示1创建Framework(2的话就是创建静态库,也就是.a)

Framework打包

2.创建bundle,在上面Framework的基础上面Add Target选择macOS中的Bundle(由于创建的是默认的OS X,但是需要被实用的是在iOS上面使用的bundle 是点击Build Settings栏,搜索Base SDK这一行 将OS X的SDK替换成iOS)

Framework打包

3.关于Framework和Bundle。framework里面只能存放代码和头文件。bundle里面则存放资源文件,类似于图片,xib,plist等文件。

4.创建一个新的工程,然后将上面创建的Framework工程的xcodeproj拖拽进入工程。编译一下确保能够正常工作。(创建了联编工程就可以非常方便的进行调试,弄出好的Framework)

5.关于使用的第三方库问题:首先肯定不能将所有的第三方库打包进入Framework中,因为这样会增大包体积,而且如果其他的framework里面也使用的话,同时如果你打进包里面,那么外面就无法使用了。

6.关于存放在bundle里面的图片资源的调用 全部需要加上 bundle名字+图片名字

iOS开发中难免会用到xib。所以关于xib获取ViewController以及View都需要在bundle那一栏填入下面方法获取的bundle

Framework打包

由于楼主在项目中使用的图片可能会被外面代码使用,所以楼主直接将图片资源放在外面,代码可以正常调用不需要加上bundle的名字。但是在Xib中如果使用了图片那么就会报错,并且加载不出来,这个时候就需要在代码重新调用一遍(有关在Framework的Xib中使用工程外面的图片有方法显示出来的可以留言)。

7.有关Stroyboard的使用。也是可以在封装在bundle中,在Swift里面直接指定Storyboard的module(前提是有这个framework而且指定Class和Storyboard ID)

Framework打包 楼主天真的认为在OC中也可以这样使用。但是事实上并不可以,由于OC创建不并不是Dynamic库,所以无法动态链接,所以视图控制器会被加载出来,但是无法链接到所对应的类(因而苦逼的楼主将Storyboard部分的视图全部切换成了xib。如果有方法跪求告知)

创建ViewController的Static写法(重写initwithNibname方法)(通过Xib)

Framework打包

创建ViewController的Dynamic写法(通过Stroyboard)

Framework打包

由于楼主刚刚使用Swift开发,所以不清楚framework里面有这么多坑。

于是乎付出了惨痛的代价,将相关的Swift代码全部替换成了OC代码。一切的缘由是动静态库的问题

使用OC后只需要将下图所示不勾选,然后在你的工程中添加该文件即可。但是在Swift打包的Dynamic库中,不勾选就会报错:没有所谓的文件(楼主关于Swift打包Dynamic库问题由于项目以及时间原因没有来得及细细研究。暂时挖个坑在这,以便以后东山再起。(如果有同学看到这篇文章并且可以帮忙答疑解惑,那将万分感激))

Framework打包

静态库需要注意的点) 如果主项目中采用了Category的话 需要在引用framework的工程中设置 Build Pharse -> Other Linker Flags中加上 -all_load 就OK了,再次运行工程,可以完成所有的编译过程.

-Objc这个标志选项会让链接器加载静态库所有的Objective-C的类和Category, 这样就能把Category中实现的方法整合起来. 但是由于这样做会使可执行文件变大, 也会整合一些用不到的对象, 所以才没有默认使用-ObjC标志, 而是需要我们手动添加.

-all_load

加载所有静态库中的文件. 相比-ObjC, 不同点就是-all_load会将所有的(包括非Objective-C)文件都整合到静态库中.
*注意 : 假如你使用了不止一个静态库,然后又使用了这个参数,那么你很有可能会遇到duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件.

-force_load (path_to_archive)

加载指定路径的静态库. 相比-all_load, 不同点就是-force_load只是完全加载了一个库文件,不影响其余库文件的按需加载.

使用-all_load或者-force_load大部分原因是因为Xcode4.2之前的版本的链接器的bug, 在64位iOS应用环境下当静态库中只有分类而没有类的时候, -ObjC参数就会失效了. 所以为了兼容Xcode4.2之前的版本, 有两种解决方法:

1.使用-all_load或者-force_load来替代

2.可以在分类中添加类的声明以及实现

未完待续!!!

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4天前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
5个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这