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 無法給我們想要的路徑。

題外話

時間倉促,說的東西可能不全面,在你實現過程中遇到什麼問題,評論區給我留言,我會盡快回復

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章