iOS 14 からウィジェットが導入されて、ホーム画面から様々な情報を得ることができるようになりましたね。今回は、自分のアプリで導入にチャレンジしてみて得た Tips を軽くまとめたいと思います。
Tips(ポジティブ編 😀)
ウィジェットのサイズは3タイプあり、指定できる
ウィジェットには、Small、Medium、Large の3タイプがありますが、WidgetConfiguration の supportedFamilies()で任意のタイプのみを指定できます。また、表示する時にそれぞれのタイプごとにコンテンツを切り替えることもできます。
Web 通信した情報に基づいて表示を更新できる
URLSession を用いた通信であれば許されます。https を用いましょう。通信が重い非同期処理の場合はonBackgroundURLSessionEvents()
というのを使えばいい感じになるらしいですが、挑戦例がほぼないので使い方はよくわかりませんでした。
Asset Catalog を使っていくつかの項目の色を指定できる
WidgetKit のターゲットに Asset Catalog を追加すると、AccentColor と WidgetBackground の二つの項目がデフォルトで用意されます。AccentColor はウィジェットを追加する時のボタンの色を指定できます。WidgetBackground は指定しただけだと背景色に変化は起こりませんが、SwiftUI の Color で指定すれば使えます。
Tips(ネガティブ編 😨)
UIKit のコンポーネントを含んだビューは扱えない
SwiftUI の View はUIViewRepresentable
を使えば UIKit の View コンポーネントを組み込むことができますが、WidgetKit は UIViewRepresentable 非対応です。(ソース)
リンクを開く以外のユーザアクションは皆無
ボタンを押して本体アプリのあるページに飛ぶというのはできますが、ウィジェット上でユーザインタラクションをすることはできません。面白くないですね。HIG 的にはただ一瞬情報を確認させるためだけのものというのがウィジェットの立ち位置のようです。
アニメーションはできない
あらゆる手段を使ってみましたが、アニメーションを含んだビューは正しく表示されません。唯一アニメーションを許された時計アプリが羨ましい...
ウィジェット背景の自由度は低め
- 透明/半透明にはできない
-
UIVisualEffectView
みたいな磨りガラス風にはできない - ライトモード/ダークモードで背景色を変更することは可能
所感
ウィジェット系は昔から悪戯し甲斐があるので好きなのですが、こと WidgetKit に関しては悪戯できる余地がほとんどなくて非常につまらないです。サードパーティのウィジェットが活発に流行る気がしません。
宣伝
GitHub のコントリビューション(草)の状態を確認することができるアプリ GitGrass をウィジェットに対応させてみました。タダなので興味のある方はインストールしてみてください。AppStore リンク、リポジトリのリンク