一、前言
有些时候,我们开发的SDK并不需要对外隐藏,那么就可以将源码都打包给对方,也可以集成cocopods仓库,供外部使用。但有些时候,出于版权等原因,我们提供的代码只希望对方能够正常使用,却不希望对方看到内部的实现细节,就像苹果官方一样,给我们开发者提供的API只能看到.h文件以及相关的文档,这就是我们今天要实现的,也是苹果官方提供给我们的.framework。如果对SDK开发比较少的同学,可能对framework的了解相对少一点,这里给同学们推荐几篇framework的文章供大家参考学习。1、iOS | 自制framework详细图文流程介绍 2、包含 Bundle 资源的 framework 的正确打包方式 。这篇文章并不介绍framework的制作以及怎样集成到项目中,有需要的同学可以参考前面推荐的文章进行学习,这篇文章主要介绍framework四种集成方式的注意点以及相应的bundle文件资源的获取方式(因为我在开发中遇到了不少这样的问题)。
二、framework集成的相关注意点
1、本地集成静态framework
解释:直接将静态.framework文件直接拖到项目根目录中使用的形式
这里bundle资源是包含在framework中的,所以需要两个步骤
1)在TARGETS -> General -> Frameworks, Libraries, and Embedded Content 中找到并添加framework,修改Embed嵌入方式为Do Not Embed
2)为了保证项目的mainBundle能够获取到framework里面的bundle资源,在TARGETS -> Build Phases -> Copy Bundle Resources 中找到并添加framework里面的bundle
在framework的获取图片资源方法:
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"bundleName" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
NSString *imagePath = [bundle pathForResource:@"ImageName" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
2、本地集成动态framework
解释:直接将动态.framework文件直接拖到项目根目录中使用的形式
这里bundle资源是包含在framework中的,由于是动态framework,可以采用动态加载bundle方法
1)在TARGETS -> General -> Frameworks, Libraries, and Embedded Content 中找到并添加framework,修改Embed嵌入方式为Embed & Sign
在framework的获取图片资源方法:
NSURL *url = [bundle URLForResource:@"bundleName" withExtension:@"bundle"];
NSBundle *imageBundle = [NSBundle bundleWithURL:url];
NSString *imagePath = [bundle pathForResource:@"ImageName" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
3、cocopods集成静态framework
解释: pod仓库中的是静态.framework文件
1)创建pod仓库,直接将做好的静态.framework文件拖到class文件夹下面,在podspec文件中配置 如:
s.vendored_frameworks = 'PodFrameWork/Classes/FrameWorks/CustomFrameWork.framework'
2)bundle这次交给cocopods去自动实现,并自动拷贝到mainBundle下,我们只需要在podspec文件中配置 如:
s.resource_bundles = {
'CustomBundle' =>['PodFrameWork/Assets/*']
}
3)bundle获取方法同1、本地集成静态framework
4、cocopods集成动态framework
解释: pod仓库中的是动态.framework文件
1)创建pod仓库,直接将做好的静态.framework文件拖到class文件夹下面,在podspec文件中配置 如:s.vendored_frameworks = 'PodFrameWork/Classes/FrameWorks/CustomFrameWork.framework'
2)这次不需要cocopods帮我们实现bundle文件,bundle文件是我们制作好放入到.framework文件中
3)bundle获取方法同2、本地集成动态framework
作者水平有限,文章仅供参考,有不当之处欢迎大家在评论区补充交流。