iOS 子工程(下沉组件 私有库) 调用文件、图片 等资源 方法

发布时间 2023-08-09 11:06:18作者: ACM_Someone like you

发现问题:在子工程里面 使用 

[[NSBundle mainBundle] pathForResource:ofType:]  不能找到目标资源文件

原因

[[NSBundle mainBundle] pathForResource:ofType:] 是获取主程序包(Main Bundle)中资源文件路径的方法。主程序包是指你的应用程序本身,而不包括子工程或子项目。

那么要在子工程中获取资源文件路径,就要使用相对于子工程 bundle 的路径。这时,我们应该使用子工程 bundle 的路径来进行资源文件的获取。

方法

使用bundleForClass: 方法来获取子工程 bundle,然后使用这个 bundle 来获取资源文件的路径。这样就能够在子工程中获取资源文件的路径了。  

NSBundle *subprojectBundle = [NSBundle bundleForClass:[self class]];//类对象,通过这个参数来获取特定类所在的 bundle,以便在该 bundle 中定位资源文件。
NSString *resourcePath = [subprojectBundle pathForResource:@"ResourceFileName" ofType:@"png"];
//等价 NSString *resourcePath = [[subprojectBundle resourcePath] stringByAppendingPathComponent:@"ResourceFileName.png"];
if (resourcePath) {
    UIImage *image = [UIImage imageWithContentsOfFile:resourcePath];
    // 在这里使用获取到的图片
}

 

 eg:如果你有一个名为 SubprojectViewController 的类,你可以这样使用 bundleForClass: 方法:

NSBundle *subprojectBundle = [NSBundle bundleForClass:[SubprojectViewController class]];

在这个示例中,[SubprojectViewController class] 返回的是 SubprojectViewController 类的类对象,它将被用来确定该类所在的 bundle。

总之,bundleForClass: 方法的参数是一个类对象,通过这个参数来获取特定类所在的 bundle,以便在该 bundle 中定位资源文件。

其他讨论:[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: 是否适合子工程中获取资源文件路径方法?

适用场景:

  1. 适用于主程序包中的资源: 这种方法适用于获取主程序包(Main Bundle)中的资源文件路径。如果你要获取主程序包中的资源,这个方法是一个很方便的选择。

  2. 子文件夹: 如果你想要在主程序包中的特定子文件夹中获取资源文件,可以将子文件夹名称作为参数传递给 stringByAppendingPathComponent: 方法。

  3. 资源文件的位置: 确保资源文件位于主程序包中,并在 Xcode 中设置正确的配置,以便它们被复制到 bundle 中。

  4. 无法用于其他 bundle: 这个方法主要用于获取主程序包中的资源文件,对于其他 bundle,如静态库或动态库中的资源,使用这种方式可能会失败,因为它依赖于主程序包的路径。

小结:

  1.  [NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:是一个适用于获取主程序包中资源文件的简单方法,特别是当你知道资源文件位于主程序包的哪个子文件夹时。但如果你需要获取其他 bundle 中的资源文件,使用其他方法,比如使用 bundleForClass:更为合适。
  2.  有时在某些特定情况下,这个方法可能会在私有库中返回资源文件路径。可能的情况之一是,私有库被添加到主项目中后,其资源文件被复制到主程序包的位置,从而使这种方式能够正常工作。但是,这并不是一个可靠的方法,因为它依赖于特定的项目结构和配置。
  3.  为了保证代码的可移植性和健壮性,建议在处理资源文件时使用更可靠的方法,如使用 bundleForClass: 方法来获取正确的 bundle,并从 bundle 中获取资源文件路径。这种方法更具通用性,适用于不同项目结构和配置的情况。

==========华丽分割线==========

以上bundleForClass:保证了 子工程正确获取了资源图片的路径。

还需注意:

1.图片和资源文件要在子工程的合理位置 : 比如和Classes 文件并列 建立一个 Resource 文件夹 资源都放在里面

 

2.图片和数据库资源要在KFZTechs.podspec 中体现 

3.私有库提交代码时候打tag 需要是最新的tag 和 版本号

 

综上:要正确获取到子工程的图片 文件资源 需要

(1)bundleForClass:获取子工程bundle

(2)图片 文件资源 的Resource 放在与Classes并列位置

(3)图片和数据库资源要在KFZTechs.podspec 中体现

  (4)  私有库提交代码时候打tag 需要是最新的tag 和 版本号