创建存放共享资源的 Framework

本文最后更新于 2021年4月4日 晚上

在一个比较大的工程中, 通常会将某些独立的组件都抽取出来构造成可重用的 Framework 来使用, 如何在这些 Framework 中共享一些设计资源就成了一个突出的问题, 这里介绍一种比较常规的办法来实现不同的 Framework 中使用同一个资源 Framework 中的资源.

需求描述

在 APP 施工过程中, 有个组件 A 需要抽取出来进行复用, 组件 A 可能在以后的 APP Extension 中用到, 故需要将组件 A 封装到一个 Framework 以供不同的 Target 使用.

不过有个问题, 在组件 A 中使用到的一些图片资源在某些不使用组件 A 的 Target 中也会用到, 如果将这些资源分别放到 A 中以及另外的 Target 中, 必然造成资源的重复, 结果就是 APP 包体积变大.

这个时候就需要一种办法将资源在不同的 Target 间共享, 而解决方式就是创建一个”资源 Framework”来实现资源共享.

实现方式

新建一个 Framework, 命名为 ResourcesPackage, 如下图所示:

在这个 Framework 中新建一个类, 并提供获取 Bundle 的方法, 以便外部使用:

1
2
3
4
5
6
7
public class RPResources {
/// 返回该资源 Framework 对应的 Bundle
public static func getBundle() -> Bundle {
let bundle = Bundle(for: self)
return bundle
}
}

比如有一些需要共享的图片, 则新建一个 Asset catalog 存储图片, Asset catalog 的命名随意:

在新建的 Asset Catalog 中添加图片资源, 这里添加的一个通用的导航栏后退按钮图片, 名为 v2_home_search_back, 如下图所示:

则其他 Target 使用时, 只需要链接我们新建的 ResourcesPackage 库:

在代码中访问对应的图片资源即可:

1
2
3
4
5
6
7
// ...

let image = UIImage(named: "v2_home_search_back",
in: RPResources.getBundle(),
compatibleWith: nil)

imageView.image = image

如果想要共享颜色以及 string 资源, 同样也可以添加在这个 Framework 里面.

这种办法可以很好地替代之前的 Resource Bundle, 并且支持一些代码化的资源.


创建存放共享资源的 Framework
https://blog.rayy.top/2018/10/17/2019-14-ResourcesBundle/
作者
貘鸣
发布于
2018年10月17日
许可协议