文档章节

Framework打包

樗同学
 樗同学
发布于 2016/09/27 20:06
字数 1408
阅读 173
收藏 0

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)

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

静态库需要注意的点) 如果主项目中采用了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.可以在分类中添加类的声明以及实现

 

未完待续!!!

© 著作权归作者所有

樗同学
粉丝 0
博文 33
码字总数 16046
作品 0
朝阳
私信 提问
ijkPlayer编译、打包、多格式及Https支持

编译环境 macOS + Xcode,文末有我打包好的文件,需要请自行下载 准备工作 获取 ijkPlayer 源码 桌面新建一个文件夹 ijkplayer,位置自行决定,我这里文件放到桌面了 打开终端、依次输入以下...

草帽小子的九喇嘛
2018/05/10
0
0
xcode 编译插件--xcode-configure

有时候,我们希望通过命令行来编译xcode工程,我们可以直接用xcodebuild来编译,之后再到编译路径下拷贝打包成ipa或者是要包含各种cpu架构的静态库或framework,就显得非常非常麻烦,有没有一...

smallmuou
2016/01/19
577
0
Xcode 7 Framework制作流程详情整理

一、打包Framework 1、新建iOS->Framework & Library->Cocoa Touch Framework 2、选择next进入下一步 3、在PROJECT->Deployment Target->iOS Deployment Target选择你需要支持的最低系统。 ......

田广ly
2015/12/29
708
0
利用 Framework 进行动态更新

前言 目前 iOS 上的动态更新方案主要有以下 4 种: HTML 5 lua(wax)hotpatch react native framework 前面三种都是通过在应用内搭建一个运行环境来实现动态更新(HTML 5 是原生支持),在用...

_柳大官人
2016/08/04
155
0
使用DCloud+Framework7制作移动APP应用

现在使用Html+Css+Js制作移动应用是越来越火,所以在此记录下我个人使用DCloud+Framework7进行移动APP开发过程,方便以后查阅。 一、准备: 环境:Win7 64位 开发工具:HBuilder(下载地址:...

卖小女孩的小火柴
2015/10/13
13.3K
50

没有更多内容

加载失败,请刷新页面

加载更多

thinkcmf 渗透测试漏洞修复解决方案

近段时间发现很多APP程序用的是thinkcmf,此程序源码存在getshell漏洞,我们Sine安全紧急对此高危漏洞进行了分析和漏洞修复,攻击者可以通过构造特定的请求包get请求即可在远程服务器上执行任意...

网站安全
30分钟前
6
0
MySQL的IP地址与数字互转原理

一、inet_aton与inet_ntoa inet_aton是把ip地址转为数字的函数,记忆小技巧,inet表示网络相关,在c语言中a习惯性代表字符串,to就是转换的,n代表数字,aton就是字符串转数字,同理inet_nt...

trayvon
42分钟前
6
0
【翻译】全新16英寸MacBook Pro评测:开发人员的梦想成真

要问现在适合开发者用的笔记本,市面上还是有很多选择的,比如Dell的XPS系列,外星人系列(游戏也是杠杠滴),联想拯救者系列,还有形形色色的高配机型,价格也从几千到几万不等。 但是,笔吧...

Dimple91
43分钟前
8
0
IT兄弟连 HTML5教程 CSS3属性特效 CSS3分栏布局

CSS3中新出现的多列布局(multi-column)是传统HTML网页中块状布局模式的有力扩充。这种新语法能够让WEB开发人员轻松的让文本呈现多列显示。我们知道,当一行文字太长时,读者读起来就比较费劲...

老码农的一亩三分地
59分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部