Framework打包

原创
2016/09/27 20:06
阅读数 689

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
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部