CocoaPods 模块化开发中的 Asset Catalog 优化

iOS 中模块化开发能够很好的解耦体系中的各个子模块,从而使体系的结构层次清晰明了,并提升了开发功率。本文重点聊聊运用 CocoaPods 进行模块化开发中的资源办理。

运用 Asset catalogs 的必要性

在一般情况下,App Store 和操作体系会优化应用程序的装置。苹果会依据用户的设备和操作体系对装置的 app 进行必定程度的定制。这种优化能够使 App 在该设备上的运用内存达到最小。这种优化定制叫做 App Thinning.

App Thinning 的原理便是苹果会依据方针设备和操作体系对 app 内的资源进行切开(slicing)。切开后的 Bundle 资源包称之为 App Bundle 的一个变体(variant)。

App Thinning 中的一个重要的进程便是对 App Bundle 内图片的优化。谈到对图片的优化就有必要提到 Asset catalogs。

Asset catalogs 是苹果引荐的一种图片办理方法。在 Asset catalogs 内能够创建多个 image set。每个 image set 代表一张或多张图片,例如咱们熟知的 name@1xname@2xname@3x。运用 Asset catalogs 办理图片的应用在编译时图片会被压缩。App 在装置时,苹果后台在 App Thinning 进程中会依据方针设备屏幕份额(scale)来挑选图片。比如在 @3x 的设备上不需要加载装置 @1x@2x 的图片,从而达到减小包巨细的意图。

只有经过 Asset catalogs 方法办理的图片才能够做到这样的优化,其他零星分布在 Bundle 内的图片则不会享受到苹果的优化。所以经过 Asset catalogs 来办理图片是必要的。

CocoaPods 模块化开发中的 Asset Catalog 优化

resources 和 resource_bundles

CocoaPods 供给了两种资源办理方法,别离是 resourcesresource_bundles。下面别离来讲讲这两种资源办理方法。

resources

若用 resources 方法办理资源文件,咱们一般会在 .podspec 文件中这样写:

spec.resources = ['Images/*.png', 'Sounds/*']

经过这种这种方法办理的资源文件(不论是图片、音频文件仍是 xib 文件),Cocoapods 会将它们直接拷贝至 App 的 target bundle (Bundle.main),而此时一切资源文件零星分布在包内,苹果无法对它们做任何优化。

CocoaPods 模块化开发中的 Asset Catalog 优化

虽然这种方法简单明了,但是经过这种方法办理的资源容易导致重名问题。CocoaPods 强烈引荐运用第二种 resource_bundles 方法办理资源。

resource_bundles

为了将 Pod 构建为静态库,CocoaPods 强烈建议运用这种方法办理资源,由于它能够削减运用 resources 带来的资源文件重名问题。以下是 CocoaPods 官方的原话:

For building the Pod as a static library, we strongly recommend library developers to adopt resource bundles as there can be name collisions using the resources attribute. Moreover, resources specified with this attribute are copied directly to the client target and therefore they are not optimised by Xcode.

咱们一般会这样写:

spec.resource_bundle = {
    'ImageModule' => ['ImageModule/Assets/**/*']
}

若经过这种方法办理,CocoaPods 会为子模块创建一个 ImageModule.bundle。一切的资源文件都在 Bundle 内被办理。每个子模块内的文件 Pod 选用哈希的方法进行匹配。keyBundle 的姓名,值为后边包括的文件。所以该属性能够最大的避免资源重名问题。

CocoaPods 模块化开发中的 Asset Catalog 优化

CocoaPods 模块化开发中的 Asset Catalog 优化

留意:不行一起运用 resourcesresource_bundles。若一起运用将在 Bundle.mainSubmodule.bundle 下各自创建一份资源文件。

resource_bundles + Asset catalogs

经过 resource_bundles + Asset catalogs 的方法咱们能够最大程度的优化包巨细。

CocoaPods 模块化开发中的 Asset Catalog 优化

CocoaPods 模块化开发中的 Asset Catalog 优化

CocoaPods 模块化开发中的 Asset Catalog 优化

图片的加载方法

上文说过,若选用 resources 方法办理资源,资源零星分布在 Bundle.main 中,苹果不对其做任何优化,所以咱们直接能够选用以下方法加载图片。

imageView.image = UIImage(named: "arrow_down")!

若选用 resource_bundle 来办理资源,若要加载指定资源咱们有必要指定 Bundle

imageView.image = UIImage(named: "arrow_down", in: #SubBundle#, compatibleWith: nil)

由于苹果会自动依据设备屏幕份额为咱们下载对应尺度的图片,所以在 resource_bundle 下咱们不必显式指定图片尺度。

本文参考

  1. guides.cocoapods.org/syntax/pods…
  2. help.apple.com/xcode/mac/c…
  3. /post/684490…