在做项目的时候遇到过一个需求:把当前项目打包成一个静态库,暴露出相应的接口给别人调用。这里记录一下具体实现步骤。
创建framework工程
因为我们是iOS应用,这里选择iOS--Framework&Library--Cocoa Touch Framework,创建成功后,会自动生成一个projectName.h的文件,我们可以在这个文件中import需要暴露的头文件。
暴露公开文件
在build Phases中,将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,当然,隐藏的头文件就无法再被引用。
打包资源文件
一个完整的项目中会有很多图片,音频文件,在正常的项目中我们一般放在assets.xcassets文件夹或者自定义的资源文件夹下。在framework中我们需要统一把资源文件打包成bundle文件,便于用户使用。
创建bundle工程
选择macOS--Framework & Library--Bundle。创建成功后,修改bundle属性:
1:将Base SDK 修改为 iOS
2:将"Build Active Architecture Only" 设置为 "YES"
3:修改IOS Deployment Target
###导入资源文件
将图片,xib等资源文件导入bundle项目。
打包bundle文件
bundle工程的一切就绪后,我们就可以生成.bundle的文件了,直接command+B buildSucceeded之后在项目的products文件夹下就生成了我们所需要的.bundle文件了。
合并打包
合并打包有好几种方式,有用写好的脚本打包的,有手动拿终端合并模拟器和真机环境的,说到底原理都是一样的,这里介绍用终端合并打包。
准备好的framework工程分别在模拟器环境和真机环境下build一下,在products文件夹下生产对应环境的framework文件,showInFolder找到对应文件夹,然后使用lipo命令合并,代码如下:
lipo -create 真机文件路径 模拟器文件路径 -output 合成后文件的输出路径
命令执行后,会生成合并后的文件,将这个文件替换掉真机环境中Framework中的文件;此时就可以把当前.framework文件拿出来了,他就是最后生成的framework文件。
注意:
在项目中使用图片时我们一般是用:imageNamed:@"图片名称",在framework中由于图片放在bundle中,需要改为 imageNamed:@"bundle名.bundle/图片名称"
使用其他xib资源时,项目中用的是[NSBundle mainBundle],framework中我定义了一个宏:
#define UABundle [NSBundle bundleWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"UABundle.bundle"]]。