這一篇主要是要紀錄如何設定 Apple Watch 的 Complication。
Complications 是錶面上可讓使用者選擇的小元件,需要使用 ClockKit 開發 (有些畫面可以用 SwiftUI 開發),它的用途是在特定的時間,顯示相對應的資訊。
Apple Watch 內建數十種錶面,每種錶面支援的 complications 數量 / 位置 / 尺寸都不盡相同,根據不同的尺寸跟風格,定義了多種不同的 families,每個 familiy 支援不同的 templates,我們使用 template 來設定要顯示的文字、圖片、或儀表圖。各種不同 families 的長相可以參考這份文件。
一些限制
設計 complications 時有幾點要注意的:
- 不支援動畫
- 不支援任何互動,只會啟動 app
- 圖片置中顯示且不會自動縮放
- 根據使用者設定,用原色或單色調顯示
取得 Complication Timeline Entries 的順序
Complication 是在特定的時間,顯示相對應的資訊,watchOS 跟 CLKComplicationDataSource 取得需要的資訊,以下是它的順序:
- 呼叫
func getComplicationDescriptors(handler: @escaping ([CLKComplicationDescriptor]) -> Void)
取得所有可提供的 complication 種類,我們可以根據 family 還有自訂的 identifier 來設計 complication。 - 呼叫
func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void)
得知是否能根據不同時間顯示不同 complication 內容。 - 呼叫
func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void)
取得目前時間要顯示的 complication 內容。 - 呼叫
func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void)
取得未來時間要顯示的 complications 內容。
如何建立 Complication Timeline Entry
建立 Timeline Entry 的作法大致如下:
- 根據 Complication 的 family 跟 identifier 屬性,決定要使用哪種 template 跟 data provider
- 建立 data provider,然後建立 template
- 根據日期跟 template 建立 timeline entry
如何更新 Timeline Entries
除了被動等待系統來獲取 complication timeline entries 之外,還有下列幾種方式可以主動更新:
- 透過 PushKit complication notification 更新已建立的 timeline entries。
- iPhone app 傳送 Complication UserInfo 更新
- watchOS app 呼叫
reloadTimeline(for:)
或extendTimeline(for:)
更新 - 使用 background URL session 下載資料更新
- 排程 background tasks 定期更新