- Swift + framework 的制作(基于project):
http://www.jianshu.com/p/de006feae864 - Swift + framework 的制作(基于pod管理的workspace):
http://www.jianshu.com/p/c6eb6e4ebc35
前面这两篇文章着重介绍了framework的创建, 但实践才是硬道理, 此篇文章主要讲述他的使用, 分为三种管理方式,四种导入方式, 分别适用于不用的情景,如下:
各个使用方式的详情以及优缺点会按照上图所示结构 在下面进行详细介绍(本文只介绍1.直接导入工程使用
以及 2.使用workspace管理
, cocoapods管理本地库会在新的一篇文章中介绍
):
一. 使用
1. 直接导入工程使用
1.1 拷贝到工程
目前创建的 Framework分为 独立的framework 基于project的framework
以及 依赖于其他第三方的framework 基于pod管理的workspace的framework
,导入方式如下:
1.1 .1 基于project的framework
拷贝打包好的framework到工程下, 需要选中copy items if needed
加入工程中的framework:
1.1.2 基于pod管理的workspace的framework
基于pod管理的workspace的framework, 在framework创建时提到,会生成多个framework(如下图)
使用时不仅需要引入使用的EKWBaseNetWorkRequest.framework
,还需要引入它依赖的第三方库Alamofire.framework
, 如下:
1.2 添加关联
如果只是引入,运行工程,会发现如下错误:image not found
解决这个问题, 只需要一个增加一个配置, 在Embedded Binaries
添加引入的framework, 如下:
1.3 使用
在工程中需要使用的文件 引入.
如:import EKWBaseUIKit
以上管理方法适用于Framework比较完善,但如果当前使用的Framework还不完善, 需要经常修改, 频繁而来的编库以及导入,建立关联就会显得繁琐而闹心,使用workspace管理会更方便
2. 使用 workspace 管理, 可快速修改, 重新编译
根据是否需要在Framework中调试Bug分为以下两种(前两步操作2.1和2.2是一样的,区别在于第三步2.3和第四步2.4,会分为2.3.1 和2.4.1 以及2.3.2和2.4.2进行区分介绍):
- 通过workspace的已有的管理,在link中进行简单关联配置
优:该方式可在Framework中断点定位bug
劣:工程移植到其他电脑 不能直接运行,需要重新配置下关联
- 引入workspace中各个project实际创建的Framework
优:工程移植到其他电脑 也能直接运行
劣:该方式不能在Framework中断点定位bug
2.1 创建workspace
选择File -> new ->Workspace
创建workspace 文件"FrameworkTest"(已经使用pod管理自动创建workspace的忽略)
2.2 引入工程以及库工程
点击左侧空白区域 -> Add Files To "FrameworkTest"...
, 选择需要使用workspace管理的工程project 以及库工程
添加之后工程结构如下:
进行到当前步骤可在模拟器运行
1)若在相应的Framework工程如:EKWBaseUIKit
中添加断点,在相应断点会暂停;
2)修改了Framework工程如:EKWBaseUIKit
的内容,需要重新编译(Com+ B)Framework如:EKWBaseUIKit
工程, 再运行主工程EKWStudent
, 新的修改才能在主工程中有所体现。
如果还需要在真机运行,需要继续以下步骤(以下步骤同时适用于真机和模拟器):
2.3 引入framework的关联
2.3.1通过workspace的已有的管理,在link中进行简单关联配置
- 分别编译(Com+ B)引入的Framework工程
如:EKWBaseUIKit
,EKWBaseLogic
- 在 主工程
target -> Build Phases -> Link Binary With Libraries
中点击+
, 添加Framework,如下图:
c. 在主工程
target -> General -> Embedded Binaries
中点击+
, 添加Framework,如下:此时,该使用方式所有的配置已经完成,可以愉快地使用Framework了。
2.3.2引入workspace中各个project实际创建的Framework
-
将编译好的framework引入使用, 但是此处
copy items if needed
不选中, 只是引用关系, 而不是直接拷贝进工程, 此时更改EKWBaseUIKit中内容, 不需要重新导入新编EKWBaseUIKit.framework
库,否则需要重新替换库,会很麻烦。
在 主工程
target -> Build Phases -> Link Binary With Libraries
中点击+
, 添加Framework (同上 2.3.1 ->b )
2.4 framework的修改以及重新编译
2.4.1通过workspace的已有的管理,在link中进行简单关联配置
1.修改需要的代码或者增加需要的文件。如:直接通过workspace中包含的工程EKWBaseUIKit 进行代码修改
2.需要重新编译(Com+ B)Framework如:EKWBaseUIKit
工程, 再运行主工程EKWStudent
, 新的修改才能在主工程中有所体现
2.4.2引入workspace中各个project实际创建的Framework
1.修改需要的代码或者增加需要的文件。如:直接通过workspace中包含的工程EKWBaseUIKit 进行代码修改
2.选中为EKWBaseUIKit库添加的target BaseUIKitAggregate
,重新编译,工程中的库也会进行更新
二. 打包
使用以上编译运行的framework 进行archive(操作1)并上传App Store(操作2)两个操作中, 可能会出现两个问题,如下:
1. framework中包含有i386, 以及x86_64相关的包, 不能通过archive打包
解决方案:archive 时,需要把合并的Framework替换为release模式下的 真机Framework(合并的.a 可以直接archive, 但是合并的Framework不能archive, 此处原因不解,欢迎知晓者解答~_~)
2. The main bundle Mach-0 contains armv7(bitcode) and arm64(bitcode), while the nested bundle Mach-0 contains armv7(machine code) and arm64(machine code). Vertify that all of targets for a platform have a consistent value for the ENABLW_BITCODE build setting.
1) 此处涉及到enable bitcode
和 bitcode, machine code
苹果API Distribution Guide–App Thinning 中,有如下描述:
Bitcode is an intermediate representationof a compiled program. Apps you upload to iTunes Connect that contain bitcodewill be compiled and linked on the App Store. Including bitcode will allowApple to re-optimize your app binary in the future without the need to submit anew version of your app to the store.
bitcode 是编译程序的一种中间码, 被上传到 AppleStore 之后,苹果会根据用户的手机生成不同的二进制,进行下发,精简安装包的大小,达到瘦身的效果
2)解决办法
xcode7创建APP, Enable Bitcode
默认为Yes, 但对使用的第三方也要求 Enable Bitcode = YES
, 若不能保证,需要将工程中 buildSetting -> Enable Bitcode
设置为NO
参考链接:
http://www.jianshu.com/p/b6c59d8ed2c9
以上仅是个人使用总结,欢迎批评指正补充~~~~~~~