阅读 70

Swift-Framework(一)访问资源文件

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

摘要

Framework 就是在 APP 应用中的一种封装功能的表现形式,虽然不能独立运行,但是也可以在它里面存放和访问图片、语音等资源文件,可算是麻雀虽小,五脏俱全。

毕竟不是 APP 工程,所以 Framework 中访问资源文件的方式就略有不同,下面进入正题 - Framework 中访问资源文件

本期主要是说明Framework 中访问资源文件,所以就简单的提一下 Framework 中放资源文件的两种方式:(特别指出,这里的 Framework 是动态库

  1. 将资源文件直接放在 Framework 的主目录文件中
  2. 创建 Bundle 文件,将资源文件放在 Bundle 文件中

以上两种方式都可,如果对以上两种方式感兴趣,给我留言,我专门讲一下这两种方式的实现,和它们的差异。

APP 工程中访问资源文件

先来看下在 APP 工程中访问一个图片资源是如何处理的:

/** 图片放在主目录中 */
// 获取图片
let image = UIImage(name: "picture")
// 获取图片,同上等价
let image = UIImage.init(named: "picture", in: Bundle.main, with: nil)
复制代码

再来看下,在 APP 工程中访问一个 .mp3 文件,是如何处理的:

// path 为这个 mp3 文件的路径
let path = Bundle.main.path(forResource: "mp3FileName", ofType: "mp3")
复制代码

通过上面两个例子,可以总结出 APP 工程就相当于一个 bundle 文件,并且可以通过 Bundle.main 的方式去访问这里的资源文件。

那么 Framework 是放在 APP 工程中使用的,Framework 中的资源文件是不是也可以通过 Bundle.main 来访问呢?

Framework 中访问资源文件

接上面问题,肯定的回答是 NO。先说明下,在 Framework 中如何访问它自身的资源文件,看例子:

// path 为这个 mp3 文件的路径
let path = Bundle.init(for: GeneralExtension.self).path(forResource: "mp3FileName", ofType: "mp3")
复制代码

GeneralExtension 是 Framework 中的一个 class,可以用 Framework 中的任何一个 class 替代。

这里要特别注意,在 Framework 中使用 Bundle.main 去访问其中的任何文件资源是无效的,这又是为什么呢?

为什么 Framework 中使用 Bundle.main 无效?

这里打印一下 Bundle.main 分别在 APP 工程中和 Framework 中返回的路径信息:

/** xxx 为 APP 项目名称 **/
// 在 APP 项目中,任何一个控制器中就好
print(Bundle.main) // Print: </private/var/containers/Bundle/Application/F5113D7B-766E-4FC5-A43D-042D6FAE12D8/xxx.app>
​
// 在 Framework 中
print(Bundle.main) // Print: </private/var/containers/Bundle/Application/6B6A2ED6-C616-4B38-A3CD-B8FA7373266E/xxx.app>
复制代码

结果可以看出,不管在 APP 项目中的任何位置使用 Bundle.main 返回的都是相同的一个路径,APP 项目的路径。

但是我们要访问的是 Framework 中的资源文件,当然要先知道 Framework 的路径,才能往下去找,明显,Framework 中的 Bundle.main 无法给我们想要的路径。

题外话

时间仓促,说的的东西可能不全面,在你实现过程中遇到什么问题,评论区给我留言,我会尽快回复

文章分类
iOS
文章标签