动态库形式:.dylib和.framework
静态库形式:.a和.framework
举例demo:demoStatic
1、动态库情况xib资源存在路径
iOS在组件化过程中,一般来说,会把组件做成动态库的形式,也就是使用use_frameworks!
那么app运行起来之后,当app需要加载xib资源,会从
demoStatic.framework
这个动态库中寻找,如果xib资源放在了Assets文件夹下,那么系统应该从demoStatic.bundle
里面找xib资源;如果xib资源放在了Classes文件夹下,那么系统应该直接从demoStatic.framework
里面找(即demoStatic.bundle
同级目录)。下图为
demoStatic_Example.app
的包内容(静态库和动态库两种情况,此时的xib资源都在Assets文件夹下,所以xib的资源都应该在demoStatic.bundle
里面找,只是不同情况demoStatic.bundle
的位置不同)podspec
文件中声明s.static_framework = true
,如下图demoStatic
组件允许打包成静态库,这样的话,demoStatic_Example.app
包内容的Frameworks路径下就没有demoStatic.framework
,所以这种情况下,必须把xib资源放到Assets文件夹下(参考图3|静态库)[因为静态库的组件中,它的bundle路径在demoStatic_Example.app
下]。为了和图片资源区分清楚,尽量在podSpec文件下指明路径,参考图4的s.source_bundles
下面我写了一个加载Assets文件夹下xib资源的方法
#import "NSBundle+Xib.h"
@implementation NSBundle (Xib)
///这是NSBundle的Category
/// 如果xib文件放到了Assets文件夹下使用这个方法获取xib所在bundle(兼容静态库和动态库)
/// @param bundleName bundle名称
+ (instancetype)yl_xibWithBundle:(NSString *)bundleName {
if ([bundleName containsString:@".bundle"]) {
bundleName = [bundleName componentsSeparatedByString:@".bundle"].firstObject;
}
NSBundle *lastBundle = nil;
//没使用framwork的情况下(静态库)
NSURL *associateBundleURL = [[NSBundle mainBundle] URLForResource:bundleName withExtension:@"bundle"];
//使用framework形式(动态库)
if (!associateBundleURL) {
associateBundleURL = [[NSBundle mainBundle] URLForResource:@"Frameworks" withExtension:nil];
associateBundleURL = [associateBundleURL URLByAppendingPathComponent:bundleName];
associateBundleURL = [associateBundleURL URLByAppendingPathExtension:@"framework"];
associateBundleURL = [associateBundleURL URLByAppendingPathComponent:bundleName];
associateBundleURL = [associateBundleURL URLByAppendingPathExtension:@"bundle"];
}
lastBundle = [NSBundle bundleWithURL:associateBundleURL];
return lastBundle;
}
@end