iOS开发:Framework的创建
转载自:http://jonzzs.cn/2017/06/01/iOS%20开发笔记/【iOS%20开发】将自己的框架打包成%20Framework%20的方法/
环境:Xcode 8
创建 Framework 工程
1. 创建打包工程
- 打开
Xcode
新建一个工程,选择Framework & Libray
选项中的Cocoa Touch Framework
,这里说一下我的Xcode
版本是8.3.2
。
- 因为要打包所需的文件,所以这里我自己创建了一个测试类,在实际的打包过程中,直接把需要打包的所有文件拖到该工程中即可。
2. 添加公开头文件
- 选中
Target
,选择Build Phases
-Headers
,可以看出有三个选项,分别是Public 、Private 、Project
,把需要公开给别人的.h
文件拖到Public
中,把不想公开的,即为隐藏的.h
文件拖到Project
中。
- 完成上述步骤之后,在默认生成的
.h
文件中,我的是TestFramework.h
,把所有需要暴露的.h
文件都用#import <TestFramework/PublicHeader.h>
引入,记住一定要将所有需要暴露的.h
文件都引入,也就是上面Headers
-Public
中加的所有.h
文件,不然编译后生成的.framework
在引用的时候会有警告。
3. 更改设置参数
- 选中
Target
,选择Build Settings
,在Architectures
下增加armv7s
。
- 选中
Target
,选择Build Settings
,在搜索栏搜索Mach-O Type
,将Mach-O Type
修改为Static Library
。
工程打包成 Framework
1. 创建 Aggregate
- 新建一个
Target
,选择Cross-platform
-Aggregate
,名字随便起一个。
- 选中新建的
Target
,点击Build Pharas
中的+
,选择New Run Script Phase
。
- 点开
Run Script
,添加以下的脚本代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"
|
2. 编译所有文件
- 按照下图将编译的
Target
选择为刚才创建的Aggregate
,Device
选择为Generic iOS Device
,然后按下Command + B
开始编译。
- 编译完成后会自动弹出已经创建完成的
Framework
包内容,最终打包完的.framework
会在项目下的Products
文件夹下。
测试打包完的 Framework
- 新建一个测试工程
TestDemo
,将打包完的TestFramework.framework
拖到工程中,测试一下刚才创建的TestClass
类,可以看到信息打印出来了,测试成功。
- 如果使用打包完的
Framework
有出现崩溃的情况,可以考虑在项目Other linker flags
中加入一些参数,下面介绍三个常用参数:
1
2
3
4
5
|
-ObjC:加了这个参数后,链接器就会把静态库中所有的 Objective-C 类和分类都加载到最后的可执行文件中。
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到 ld: duplicate symbol 错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到 -ObjC 失效的情况下使用 -force_load 参数。
-force_load:所做的事情跟 -all_load 其实是一样的,但是 -force_load 需要指定要进行全部加载的库文件的
|