在我们开发动态库或者静态库的时候,如果其中用到一些资源图片,此时这些图片我们应该如何放置呢?
一般有两种方式,这里总结一下:
- 通过.bundle文件存储(
.bundle可存储xib等其他文件
),此时如果在项目中使用到我们的framework时,需要把这里的.bundle文件添加到项目中,这时我们可以用以下代码去加载:
NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"Robot" ofType:@"bundle"]];
UIImage *iconImage= [UIImage imageWithContentsOfFile:[bundle pathForResource:imgName ofType:@"png"]];
当然,如果我们不想把.bundle拖入项目中也是可以的,但是此时我们确认打包的framework中含有.bundle,然后用以下方式去查找:
NSString *path = [[NSBundle mainBundle] pathForResource:@"RobotSDK" ofType:@"framework" inDirectory:@"Frameworks"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
bundle = [NSBundle bundleWithPath:[bundle pathForResource:@"Robot" ofType:@"bundle"]];
UIImage *iconImage= [UIImage imageWithContentsOfFile:[bundle pathForResource:@"up" ofType:@"png"]];
- 通过.xcassets图片管理工具来存储(
只能用来存储图片
),.xcassets在打包后会变成Assets.car,然而直接使用imageNamed:由于默认位置无法找到framework的图片资源,所以返回为nil,此时我们需要使用以下方式:
NSString *path = [[NSBundle mainBundle] pathForResource:@"RobotSDK" ofType:@"framework" inDirectory:@"Frameworks"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
UIImage *iconImage = [UIImage imageNamed:imgName inBundle:bundle compatibleWithTraitCollection:nil];
另外补充:项目中如果引入多个动态库
,并且这多个动态库中都同时引入了一个或者多个同样的动态库,此时我们只需要在项目中的动态库
后面添加"Embed & Sign",其他动态库后为"Do Not Embed"(这样设置后,sdk打包后不会把framework打入其中)如下:
参考文献: