Framework打包

iOS app须要在许多不一样的CPU架构下运行:xcode

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

  • arm7s: 在iPhone5和5C上使用app

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

  • i386: 32位模拟器上使用spa

  • x86_64: 64为模拟器上使用调试

 

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

因此先用动态库进行打包。试坑吧:对象

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.能够在分类中添加类的声明以及实现

 

未完待续!!!

相关文章
相关标签/搜索