摘要
Framework 就是在 APP 應用中的一種封裝功能的表現形式,雖然不能獨立運行,但是也可以在它里面存放和訪問圖片、語音等資源文件,可算是麻雀雖小,五臟俱全。
畢竟不是 APP 工程,所以 Framework 中訪問資源文件的方式就略有不同,下面進入正題 - Framework 中訪問資源文件
本期主要是說明Framework 中訪問資源文件,所以就簡單的提一下 Framework 中放資源文件的兩種方式:(特別指出,這里的 Framework 是動態庫)
- 將資源文件直接放在 Framework 的主目錄文件中
- 創建 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
無法給我們想要的路徑。
題外話
時間倉促,說的東西可能不全面,在你實現過程中遇到什么問題,評論區給我留言,我會盡快回復