前语

CocoapodsPod引证资源的方法有多种,不同的方法对资源的运用仍是有区别的,但也有必定的规律,这儿我用一个样例工程来进行说明,样例工程名叫:AssetsDemo,运用pod lib create AssetsDemo命令创立,目录结构如图:

iOS中Pod库资源引用探究
这个pod很简单,Classes目录只有一个cellswiftxib文件,Assets目录有一些图片资源,其间的TestTableViewCell.xib运用了这张test图片。目录结构如下:

├── Assets
│ ├── Images.xcassets
│ │ ├── Contents.json
│ │ └── test.imageset
│ │     ├── Contents.json
│ │     ├── test@2x.png
│ │     └── test@3x.png
│ ├── test1@2x.png
│ └── test1@3x.png
└── Classes
    ├── TestTableViewCell.swift
    └── TestTableViewCell.xib

前期工作现已预备结束,下面说下xib图片资源不同运用方法下的区别:

xib放入source_files,图片放入resource_bundles

podspec的写法如下:

s.source_files = 'AssetsDemo/Classes/**/*'
s.resource_bundles = {
    'AssetsDemo' => ['AssetsDemo/{Assets,Classes}/**/*.{xcassets,png}']
}

运转后会生成这样的framework

iOS中Pod库资源引用探究
咱们能够看到,xib后缀会变成nib,并被放入framework中,而图片资源被放入了AssetsDemo.bundle中。

这样的结构,显然在惯例状况下,xib是无法找到图片并显示的。可是有一种有缺点的用法能够勉强处理这个问题,那就是直接把png图片打包到AssetsDemo.bundle中,然后在xib中将图片名改为AssetsDemo.bundle/图片名。这样做会导致xib修改时无法正确的显示图片,也无法运用xcassets目录来存储图片,并且会导致一些体系优化无法收效。不引荐这样运用

xib图片都放入resources

podspec的写法如下:

s.source_files = 'AssetsDemo/Classes/**/*.swift'
s.resources = 'AssetsDemo/{Assets,Classes}/**/*.{xcassets,png,xib}'

网上有说法运用resources来指定资源,被指定的资源只会简单的被 copy到目标工程中(主工程),资源的运用会简化,可是会与主工程同名资源文件发生抵触。可是在Xcode13pod 1.11.2版本下,实测不是这样的。官方的文档也不是这样说的Podspec Syntax Reference v1.11.2,它是分静态库和动态库场景,静态库才有这类问题。

上述装备运转后会生成这样的framework结构:

iOS中Pod库资源引用探究

从上图能够看到,资源被直接放入了地点的framework,别的检查主工程的包文件,是没有这些资源的。综上所述,能够得出结论,动态库中,resources指定的资源,会被直接copyframework,不会与主工程资源文件抵触。

别的,因为xib文件TestTableViewCell.nibAssets.car在同一个目录下,xib能够直接从Assets.car中找到图片资源并正确展现

  1. 在主工程中打开这个xib文件,假如主工程中有同名资源,那么修改时会优先显示主工程的资源,可是实践运转时仍是这个pod的资源。
  2. 这儿xib能够放入source_filesresources,作用是一样的

xib图片都放入resource_bundles

podspec的写法如下:

s.source_files = 'AssetsDemo/Classes/**/*.swift'
s.resource_bundles = {
    'AssetsDemo' => ['AssetsDemo/{Assets,Classes}/**/*.{xcassets,png,xib}']
}

上述装备运转后会生成这样的framework结构:

iOS中Pod库资源引用探究

从上图能够看到,xib文件TestTableViewCell.nibAssets.car在同一个目录下,xib能够直接从Assets.car中找到图片资源并正确展现。其间,test1图片尽管没有以xcassets格局引进,可是也能直接找到并正确展现。

总结

综上所述,咱们能够得出一个原则:尽量让xibxcassets与图片在同一个目录下,这样xib能够直接找到图片并正常展现。

关于resourcesresource_bundles,在动态库下,他们终究作用差不多,仅仅resource_bundles会把资源封装在bundle中,运用的时分会稍微麻烦一点:

// 运用resources的状况:
let myBundle = Bundle(for: TestTableViewCell.self)
tableView.register(UINib.init(nibName: "TestTableViewCell", bundle: myBundle),
                    forCellReuseIdentifier: "cell")
// 运用resource_bundles的状况:
let myBundle = Bundle(for: TestTableViewCell.self)
let path = myBundle.path(forResource: "AssetsDemo", ofType: "bundle")!
let assetsBundle = Bundle.init(path: path) 
tableView.register(UINib.init(nibName: "TestTableViewCell", bundle: assetsBundle),
                    forCellReuseIdentifier: "cell")

至于静态库,则引荐运用resource_bundles了。综合来看,不管是静态库仍是动态库,都引荐运用resource_bundles来引进一切的资源,因为resources方法在静态库和动态库场景,资源的运用方法差异太大,而resource_bundles各场景是一致的。

至于source_files,它只能引进代码和xib文件,不支持引进图片等其它资源。不主张用source_files方法引进xib,假如必定要运用,要注意防止出现xib中图片无法加载的问题。

参考资料

  • Podspec Syntax Reference v1.11.2
  • 关于 Pod 库的资源引证 resource_bundles or resources

by: 星的天空