App Icon 對 App 來說,算是比較特別的 Asset,不能用一般的方式取得。
SwiftUI 用來顯示圖片的 Image
在 SwiftUI 中要顯示圖片,會用 Image,比如我們在 Assets.xcassets 中有一張名字是「XcodeProject」的圖片,就可以這樣寫:
Image("XcodeProject")
.resizable()
.scaledToFit()
.frame(width: 100, height: 100)
但如果今天這張圖就是我們的 App Icon,我們是沒辦法在程式裡用一般 SwiftUI 顯示圖片的方式,以檔名來顯示圖片。
Image("AppIcon")
.resizable()
.scaledToFit()
.frame(width: 100, height: 100)
這樣寫什麼也不會顯示出來。
SwiftUI 在 macOS App 中抓取 App Icon
SwiftUI 要在 macOS App 中顯示 App Icon 的話,並不能直接用檔名來抓取,要從 Bundle 裡去抓,並以 NSImage 轉成 SwiftUI 的 Image View。
Image(nsImage: NSWorkspace.shared.icon(forFile: Bundle.main.bundlePath))
.resizable()
.scaledToFit()
.frame(width: 100, height: 100)
SwiftUI 在 macOS App 中,使用 AppKit 的 NSWorkspace
每個 macOS App 都有一個 shared 單例(Singleton)的 NSWorkspace,它可以用來操作檔案、讀取裝置訊息、開啟別的 App ⋯⋯ 等等,而它就有一個 icon(forFile:)
的 Func 可以透過完整路徑來取得圖片。
App 專案的 Bundle.main.bundlePath
知道了有這個取照片的方法之後,接下來就是要知道我們的 App Icon 會放在哪個路徑。我們可以透過 Bundle 這個物件來取得 bundlePath,而自身 App 的相關檔案資料都會放在 Bundle.main 裡,bundlePath 其實就是我們的 App 在 Mac 上的完整路徑,結尾會是「.app」,如:「/Applications/XcodeProject.app」。
然而神奇的是,這個路徑怎麼看都是一個 App 應用程式,不是什麼「.jpg」或是「.png」的圖片副檔名,但我們卻能從這個路徑藉由 NSWorkspace 的 icon(forFile:)
來取的 App 的 Icon!
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。