1、Xcode左上角 File -> New -> Project,点击 Cocoa Touch Framework,输入SDK名字,在这里我新建的SDK名字是:VideoSlideFramework,用的是Object-C开发。
2、创建Demo,Xcode左上角 File -> New -> File,因为我需要封装一个View所以选择了Cocoa Touch Class,也可以选择其他的,这里就不一一介绍了,然后创建完成,如下图显示。

3、TARGETS -> Build Settings 中设置相关项
(1).Build Active Architecture Only 设置为NO的意思是当前打包的.framework支持所有的设备.否则打包时只能用当前版本的模拟器或真机运行.
(2). Mach-O Type 选中StaticLibrary (静态库) Xcode默认是动态库.(这个是制作静态Framework和动态Framework的区别),至于静态和动态库的区别,请自己搜索,这里我设置的是静态库
(3). 设置framework最低支持的版本,我这里设置的是iOS9.3
4、TARGETS -> Build Phases 中设置相关项
将需要呈现给来的头文件,直接从Project拖到Public中. 不想呈现出来的.h文件不建议拖到Private中. 放在project中即可
5、在TARGETS -> Build Phases 中设置到Public的头文件需要添加到我们的VideoSlideFramework.h中
6、在进行编译之前应该设置为release模式

7、现在我们选中framework文件,分别真机(没有真机也可以使用Generic iOS Device运行)和模拟器运行一遍(成功运行)
然后Show in Finder 找到对应的 .framework文件(上级目录可以看出是真机还是模拟器文件夹)
真机和模拟器运行成功的文件是在这俩个文件夹内的,内部分为Debug版本和Release版本,同时两者有分为真机版本和模拟器版本framework(iphoneos后缀代表真机版本,iphonesimulator后缀代表模拟器)
8、(如果不需要封装图片或Xib文件可以跳过这一步)制作bundle
(1).新建bundle,选择macOS -> Framework & Library -> Bundle命名bundle

(2).TARGETS -> Build Settings 中设置相关项
1> Base SDK 改为 iOS(因为创建的时候是基于macOS创建的,所以要修改成iOS)
2> Build Active Architecture Only 设置为YES(仅编译当前环境,如果每个环境都编译一遍会使包变大)
3> Skip Install 设置为 NO(不需要安装相关配置)
4> Installation Directiotory 删掉后面的路径(不安装相关配置,也不需要安装路径)
5> COMBINE_HIDPI_IMAGES 设置为 NO(不然图片会是tiff格式)
6> 设置 iOS Deployment Target 最低版本兼容
7> 在进行编译之前应该设置为release模式

(2).TARGETS -> Build Phases 中设置相关项
导入需要封装成bundle的图片

(3).(这个和生成.framework一样)现在我们选中bundle文件,分别真机(没有真机也可以使用Generic iOS Device运行)和模拟器运行一遍(成功运行)
然后Show in Finder 找到对应的 .bundle文件(上级目录可以看出是真机还是模拟器文件夹)
真机和模拟器运行成功的文件是在这俩个文件夹内的,内部分为Debug版本和Release版本,同时两者有分为真机版本和模拟器版本bundle(iphoneos后缀代表真机版本,iphonesimulator后缀代表模拟器)
(4).bundle的使用
因为bundle是静态的,不进行编译的资源文件。所以,要使用bundle中的资源,就需要找到相应的资源路径(现在假设有一个图片名为test.png的图片,bundle包名为ios_test.bundle)。
(第一种方法)
UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 50,50)];
UIImage *image = [UIImage imageNamed:@"ios_test.bundle/test.png"];
[imgView setImage:image];
(第二种方法)
UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 50,50)];
NSString *bundlePath = [[ NSBundle mainBundle] pathForResource:@"ios_test" ofType :@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
NSString *imgPath = [bundle pathForResource:@"test" ofType:@"png"];
UIImage *image=[UIImage imageWithContentsOfFile: imgPath];
[imgView setImage:image];
9、真机版本和模拟器版本合并
(1).新建bundle,选择Cross-platform -> Other -> Aggregate命名Aggregate

(2).TARGETS -> Build Phases 中设置相关项
(3).将如下代码复制到Run Script
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi

(4).在进行编译之前应该设置为release模式

(5).如果需要在.framework文件里面显示.bundle文件需要如下配置(配置以后需重新编译):

(6).现在我们选中framework文件,分别真机(没有真机也可以使用Generic iOS Device运行)和模拟器运行一遍,这样运行的不需要同framework和bundle运行以后通过Show in Finder 找到对应的文件,只需要在项目文件夹里面找到Products就会出现对应的.framework和.bundle文件。
10、将.framework拖动到需要用到的项目就可以了(如果使用报错将需要用到的项目里面的TARGETS -> Build Settings -> Enable Bitcode设置为NO)