iOS 中 Pod 库资源引用探究

前言

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

图片

这个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

图片

我们可以看到,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[1],它是分静态库和动态库场景,静态库才有这类问题。

上述配置运行后会生成这样的framework结构:

图片

从上图可以看到,资源被直接放入了所在的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结构:

图片

从上图可以看到,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中图片无法加载的问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • 在进行组件化或者打静态库时,不可避免的会进行资源文件的处理,一般有以下几种情况: 1、pod 库中的代码读取自身 ...
    yue_kyy阅读 4,577评论 0 2
  • 1、资源文件引用的方式 CocoaPods 两种资源文件引用的方式——resource_bundles & res...
    moonCoder阅读 1,114评论 5 7
  • 给 Pod 添加资源文件 注:本文假定读者对 CocoaPods 的使用已经相当熟练,创建过 Pod 或有此打算。...
    枫叶1234阅读 810评论 0 0
  • 主流的依赖管理有三大开源库:最老牌的 CocoaPods, 新秀 Carthage, 官方的 Swift Pack...
    seedante阅读 4,033评论 0 10
  • 在组件化前期的工作中,我们会面临如何管理图片、音视频等资源的问题。我们需要关注的问题是如何将相应的资源和组件一起打...
    ty_Chen阅读 1,890评论 0 2