macOS Mojave 的動態桌面,可不只是「定時換桌布」這麼簡單
前不久推出正式版的 macOS 10.14 (Mojave),應該可以稱為四年前的 Yosemite 以來,macOS 在使用者介面上變化最大的一次更新。千呼萬喚始出來的原生「黑暗模式」讓人耳目一新,也引發了第三方應用的適配熱潮。
相比之下,另一項使用者介面的新功能——動態桌面(dynamic desktop)受到的關注則少得多。這是一項預設關閉的功能,啟用方法是開啟「系統偏好設定 - 桌面與螢幕保護程式」,從「動態桌面」中選擇系統自帶的兩套桌布之一。

顯然,如此低調的功能很難引起使用者的注意,大多數評測文章都選擇將其一筆帶過。蘋果自己的態度似乎也是一樣:在六月的 WWDC Keynote 演示中,Craig Federighi 留給動態桌面的臺詞只有 ofollow,noindex" target="_blank">一句話 :
Your desktop actually subtly changes throughout the day from morning, to afternoon, to evening.
你的桌面[背景]將隨著一天從早上、到下午、再到晚上的推移而微妙地改變。乍聽起來,這確實並不稀奇,也沒有任何技術門檻。隨時間變化切換桌布是很多桌面美化軟體的基礎功能,更別提十多年前的 Windows Vista 就已經原生支援 視訊桌布 了。
但問題實際上並不只是 「按時間切換圖片」 這麼簡單。因為,晨昏變化的節奏並非一成不變,而是隨著四季變換各有不同。除非生活在赤道或者極地,從夏到冬一定是晝漸短、夜漸長的。如果全年都按照一個節拍切換桌布,其效果在絕大多數日子裡都將跟真實景象不同步。
隨著季節推移變化的不只是晝夜長度,還有 太陽高度 。顯然,夏天的太陽比冬天的同一時間要「高」。太陽高度還與緯度有關。假如你生活在北京,而系統在中午時分給你換上了一張「陽光從頭頂直射」的桌布,你其實應該有一種違和感才對,因為北京根本不會有 90 度的日照。地處北緯 40 度的北京,太陽最高也只能達到 73.5 度,並且一年只有一次,時間是在夏至那天的(地方時)正午。

可見,要真正讓桌面和窗外的光照 同步 變化,機械地踩著時間點換圖片是遠遠不夠的。理想情況下,同一組圖片的切換節奏應當呼應太陽運動、在四季各不相同,並且根據使用者的地理位置和日期,有選擇地「跳過」一些不符合實際情況的照片。
動態桌面的實現機制
macOS Mojave 的動態桌面充分考慮了上述問題。在蘋果的實現方案中,桌布的切換不是以時間為標準,而是以 太陽方位 為標準。具體而言:
- 每套桌布包含 16 張靜態圖片(實驗表明似乎可以更少,但不能更多)。
- 每張靜態圖片都被標記了對應的太陽方位。定位的方式是所謂的 「地平座標系」 ,即用高度角(Altitude,定義為太陽和地平線的夾角)和方位角(Azimuth,定義為太陽按順時針方向偏離正北的角度)兩個值確定太陽在天球中的位置。
- 啟用後,系統將會根據使用者的位置和時間計算太陽的實時方位,並與每張桌布所記載的資訊進行比對,將其中與此時此地太陽位置最近似的那一張作為桌面背景。

實際例子可能更有助於理解動態桌面的機制。我目前的所在地處於北緯 40 度,與北京基本相同。10 月 5 日的早上 6:30 尚未日出,此時的太陽高度為 -6.75 度,方位為 90.6 度。啟用「沙丘」動態桌布後,桌面顯示為該系列中的第三張。根據桌布的元資訊(後文將說明方法),這張照片是在太陽高度 -4.25 度,方位 86.34 度的場景下拍攝的,與現實環境非常接近。如果將系統日期撥回三個月前的 7 月 5 日,會發現桌布變成了系列中的第五張(太陽高度為 7 度)。的確,夏天的這一時刻,太陽應該已經升起了。
再將日期調回 10 月 5 日。這一天,太陽在下午 12:48 時達到最高位置。但如果試著慢慢將時鐘調過這一時刻,會發現桌布並沒有切換為系列中最明亮的第八張,而是直接從第七張跳到了第九張。原因在於,秋天的太陽即使在正午也只能達到 45 度左右,而第八張桌布是在太陽處於 53 度時拍攝的,因此不會被顯示。相反,在 Mojave 剛剛開始公測的七月時,這張桌布會從上午 10:40 左右開始持續顯示約五個小時。

更有趣的是,在另一套動態桌布 Solar Gradients 中,一張圖片對應的太陽高度為 88.4 度。如上所述,由於北緯 40 度的太陽全年最高也只能達到 73.5 度,我將始終不會看到這張最亮的桌布被用作桌面——它實際上成了熱帶地區使用者的「會員特權」。
Craig Federighi 的那句 「subtly(微妙)」 畢竟並不是隨口說說而已。
桌布資源、技術細節與自制方法
遺憾的是,即使 Mojave 的動態桌面在設計上如此講究,蘋果卻並沒有給予這個功能太多關注。系統自帶的動態桌布只有兩張,並且沒有提供讓使用者自行製作的選項。
但這並不意味著自己動手的大門就被關閉了。自從 Mojave 測試版釋出以來,動態桌面引起了不少開發者的興趣和關注。在他們的努力下,這一功能的實現細節已經十分清晰了,自己製作起來也並不麻煩。
下面列出的是一些現有的動態桌布資源,可以直接下載並 設定 為桌面。有興趣的讀者可以繼續閱讀後文的技術細節與自制方法。
- 開發者 Marcin Czachurski 製作的地球衛星主題桌布( Dropbox )
- Jetson Creative 製作的四組實拍動態桌布( 網站 )
- 筆者製作的漸變主題桌布( 連結 )
與以往的普通桌布相同,新的動態桌布也都儲存在 /Library/Desktop Pictures
路徑下,檔名分別是 Mojave.heic
和 Solar Gradients.heic
。
.heic
是什麼格式?喜歡用 iPhone 拍照的使用者實際上不會對它感到陌生。自 iOS+11/">iOS 11 以降,大多數 iPhone 都已經預設改用 HEIF (High Efficiency Image File Format,高效率影象檔案格式)儲存照片。這裡的 .heic
,就是 HEIF 格式的可選副檔名之一。與傳統的 JPEG 相比,這種新格式在縮減空間佔用和減少畫質損耗上有著更好的表現。
不僅如此,HEIF 還是一種「容器」(container)格式——它不僅能儲存單張靜態照片,而且能儲存 一組 連續照片、以至視訊;這就為將動態桌布打包在一個檔案裡提供了可能。實際上,這兩個檔案可以直接用系統內建的預覽 app 開啟,並從側邊欄中看出兩套桌布的構成——都包括 16 張構圖相同而光線各異的靜態圖片。
但這並沒有回答我們最關心的問題:桌布的自動切換是靠什麼控制的?試著用 16 進位制編輯器開啟一張動態桌布,從頭略微往下翻閱,就能在第一張圖片的 EXIF 資訊中看到玄機:一個自定義的 apple_desktop
名稱空間和其項下的 solar
屬性。

下面的「破譯」過程需要一點淺顯的 macOS 經驗。 solar
屬性值末尾的等號是 base64 編碼的明顯 特徵 。用 base64 -D
命令解碼,發現輸出以 bplist
開頭,這是二進位制 屬性表 檔案的魔數。為此,再用 plutil
命令將其轉換為可讀的 XML 格式。

這樣,蘋果在 Mojave 的動態桌布中設定的機關就展現出全貌了。可以看到,在 si
根鍵下,每張靜態圖片被都標記了 i
、 a
、 z
三個鍵值,分別對應照片的序號、拍攝時的太陽高度角和方位角。
此外,沙丘桌布還有一個 ap
根鍵,其下的 l
和 d
兩個值分別指定了在設定中啟用亮暗兩種「靜態」選項時,要顯示的圖片序號。(太陽漸變桌布沒有 ap
根鍵,因此在設定中沒有「靜態」選項。)
至此,原理上的鋪墊就全部完成了,最後要解決的就是如何據此自行製作動態桌布。顯然,這涉及到格式轉換、資訊編碼等操作,全部手工完成會非常繁瑣。好在,已經有開發者製作出了 命令列工具 ,可以使用 Homebrew 安裝:
$ brew tap mczachurski/wallpapper && brew install wallpapper
這裡簡單介紹一下該工具的使用方法。首先,將想要製作成動態桌布的圖片檔案按序號依次命名。然後在 同一目錄 下建立一個 JSON 檔案(如 config.json
),在其中逐行指定照片的引數:
[ {"fileName":"1.png","isPrimary":false,"isForLight":false,"isForDark":false,"altitude":-0.34275283875350282,"azimuth":270.9334057827345}, … {"fileName":"16.png","isPrimary":false,"isForLight":false,"isForDark":false,"altitude":-38.04743388682423,"azimuth":53.509085812513092} ]
其中, fileName
為檔名, isPrimary
表示是否將圖片用作記錄整套桌布元資訊的「首要圖片」, isForLight
和 isForDark
分別指是否用作開啟亮/暗兩種「靜態」選項時使用的圖片, altitude
和 azimuth
則是照片對應的高度角和方位角。
準備完畢後,在終端執行 wallpapper -i config.json
即可獲得打包好的 HEIC 格式動態桌布。
如果你想要查詢照片拍攝時的太陽位置,或者瞭解所在地的太陽軌跡,可以使用 SunCalc 等線上工具,iOS 上的 Sky Guide 等天文類 app 也可以提供幫助。想要省事的讀者也可以使用我製作的 模板配置檔案 ,其內容原樣複製了系統自帶的沙丘桌布中圖片的引數,只需找 16 張光線情況與該套桌布類似的圖片,依次命名為 1.png
到 16.png
,並用上述工具製作即可。

結語
動態桌面是一個很有蘋果做派的設計。就像 OS X 視窗最小化時的 「果凍」特效 、iOS 6 中隨螢幕傾斜變換光澤的 音量滑塊 一樣,你可以完全不意識到它的存在,也可以刨根問底,然後驚異於其考慮之深。
當然,對於這類設計,歷來不乏「不務正業」的批評。特別是在 macOS 軟體質量整體不如以往的大背景下,將本就有限的開發資源,分散給這樣一些對效能和穩定沒有實質幫助的功能,似乎顯得有些奢侈。
儘管如此,我仍然歡迎這樣的設計。畢竟,軟體設計並不只是關乎功能。設計中的人文色彩及其對使用者感受的間接影響,也是細微卻重要的方面,說它是一種特殊的「功能」也不為過。每天傍晚,當我看到桌布隨著窗外的日落準時切換成另一種色澤時,很難不產生一點「虛擬與現實無縫銜接」的愉悅。
幾個月前,英文蘋果社群中曾經有過一次小規模討論:一些核心使用者遺憾地 表示 ,已經很久沒有看到像早期 iMac 那樣頗有些異想天開(whimsical)的設計了。 糖果配色 、 螢幕轉軸 這些「無用」但有趣的設計,在近年來讓位於實用主義的、引數導向的考量。這結論或許對硬體產品線是成立的;但蘋果用動態桌面、Animoji,和 Siri 的 玩笑 告訴我們,它的 whimsy 畢竟還在軟體的很多角落裡閃現。
> 下載 少數派客戶端、關注 少數派公眾號,瞭解更多有趣的系統小技巧 :computer: