22時に寝ようと思って2時に寝る。

備忘録や日記を書いてます。きょうは早く寝よう。

iOS - AppExtensions Today の概要

前提としてToday ウィジェットは以下のように動作することを期待しています。

  • 常に最新の情報が表示される
  • ユーザーの操作に的確に応答する
  • 効率よく動作する(特に iOS 向けウィジェットはメモリを浪費すると強制終了させられる)

簡潔に、きびきびと動作することを期待される上、成約も多いので合理的なUI設計が求められますし、対話的に操作する要素は最小限に留める必要があります。特に iOS の場合は、キーボード入力はできないという特徴があります。

また、Today のウィジェット内でスクロール要素をもたせるのは困難です。なぜなら Today ウィジェット自体がスクロールする仕様のため、個別のウィジェット内でスクロールするのはユーザーフレンドリーではないためです。

UI を設計する

ビューのレイアウトには AutoLayout を使用しましょう。Today ビューが占める面積は限られており、着目する情報を迅速に表示する必要があるので、必要以上に大きなウィジェットは避けましょう。 ビューの幅に合わせる必要がありますが、高さは表示内容に応じて調整できます。

内容を更新する

Today の拡張ポイントには、ウィジェットの状態を管理して、内容を更新するためのAPIが用意されています。

ウィジェットが常に最新の状態であることが期待されているので、システムは随時、ビューのスナップショットを取得しようとします。ウィジェットが一旦消えて、再び可視化状態になると、直近のスナップショットを一旦表示した上で、最新のビューに置き換わるように動作します。

スナップショットの取得前にウィジェットの内容を確認するにはNCWidgetProvidingプロトコルに従い、処理します。ウィジェットwidgetPerformUpdateWithComletionHandler:が呼び出されたら、ビューを最新の内容に更新して、完了ハンドラを呼び出すことで、状態を管理します。

完了ハンドラ、次のいずれかの定数を渡します。

  • NCUpdateResultNewData: 内容が入れ替わったのでビューの再描画の必要がある
  • NCUpdateResultNoData: 内容が同じなので更新は不要
  • NCUpdateResultFailed: 更新処理中にエラーが起きた

参考

developer.apple.com