這些寫在前面⋯⋯
最近剛從 iPhone 6 Plus 晉升到 iPhone X,其中一項硬體差異便是「3D Touch」; 而這也讓我花了一些時間,來加入 3D Touch 的相關功能開發。 這篇文章前半部會寫 3D Touch 在主畫面上的一些差異, 後半部才會補上 Swift 的相關寫法。
iOS 版本:11.1.1(15B150)
首先,先將 App 分成有 Today extension 以及沒有 Today extension 的這兩種:
郵件 – 有 Today extension
鬧鐘 – 沒有 Today extension
從這兩張圖的比較下,我們可以得知在 iOS 11.1.1 之中, 若有 Today extension 的 App,在 3D Touch 的快捷鍵之中, 會顯示 Today extension,而反之則僅會露出原本的 App icon。 另一點是,快捷鍵的順序是依 index 越小則越靠近 App icon; 所以使用者將 App 放置在畫面上半部或下半部會影響由上到下的順序。
鬧鐘 – 放置畫面下半部
所以便不必太在意快捷鍵的排序問題,包含 Today extension 順序也是。
接著來看看程式碼⋯⋯
畫面上的快捷鍵,在 iOS 裡頭是 UIKit 裡頭的 UIApplicationShortcutItem, 它提供了一種建構的方式:
public init(type: String, localizedTitle: String, localizedSubtitle: String?, icon: UIApplicationShortcutIcon?, userInfo: [AnyHashable : Any]? = nil)
其中 icon 的部分要使用 UIApplicationShortcutIcon 來建構, 而它有內建的 UIApplicationShortcutIconType 可以使用; 或者從你自行提供的 templateImageName 去抓取也行, 不過一個重點是它會使用 template 模式呈現,所以你無法在圖片中自行決定色彩。 再來再設定 UIApplication.shared.shortcutItems 即可完成新增 3D Touch 快捷鍵的畫面。 一個小小重點是,只要處理有關 UI 方面的設置,都需要在 Main thread 下完成。
畫面上有了快捷鍵之後⋯⋯
我們需要在 AppDelegate 裡頭攥寫點擊後的動作,
func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void)
透過剛剛建構時,所定義的不同 shortcutItem.type 來決定要做些什麼事情, 這部分就有點像使用者點推播進來後要怎麼做後續一樣, 整體大致上就是這樣!
未完待續⋯⋯
還沒研究在 App 裡頭的 3D Touch 內容,待之後開發有需求會再補在這篇!