能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

Complications更新をめぐる冒険 - watchOSアプリ開発

端的に云うと

現状動いていることを確認できるのはApple提供のサンプル。AppleのドキュメントはComplications更新の手引きにある4つの手段は2020年の状態で全て有効なのかは確認できない。

Creating and Updating Complications | Apple Developer Documentation

経緯

iPhone の画面を常に確認できるとは限らない、職務中にiPhoneに手を出せない、野外ランニング中はiPhoneは持っていかない、iPhoneから受け取る情報の洪水からは逃れたいが必要な情報は手元で確認したいとか理由は様々だが時計だけじゃない時計に価値を見出した人が見出すのがApple Watchである。

現にこの文章を書いているのもAppleWatchとAirPods Proで音楽を流しながら記述していたりもする。

Apple Watchの利便性を感じるのは人によってそれぞれだが、Watchらしい機能はアプリのextension(拡張機能)であるComplicationsではないだろうか。

Complications、要は文字盤に機能を埋め込むことができるショートカットor情報の小窓で盤面のレイアウトによるが複数組み合わせて使用できる。

もし自分が作ったComplicationsが文字盤の中にあったら?

思わずにやけてしまうだろう。

と、いうことを実際にやってみたのがバッテリーモニターアプリ充電報告さんのComplications機能で実現までの経緯を記述する。

前提となるwatchOSアプリ開発

Complications機能の実現には前提条件としてiOSアプリの拡張機能としてwatchOSアプリ、もしくは独立したwatchOSアプリを作る必要がある。

watchOSアプリを作るだけでも敷居が高い(2019年のSwiftUI登場でUI周りの敷居は下がったが)のだが、watchOSアプリの拡張機能であるComplicationsの開発の話になるとさらに話題にならない。

watchOSアプリを実装し、Complicationsの実装に取り組む段階に入ってもComplicationsの情報がそれほど共有されていない中で開発を進めなくてはならないという問題が出てくる。

小規模なwatchOSアプリ開発者コミュニティ

Complications開発の重要トピックには更新タイミングの制御は入るとおもうのだが、とにかく情報が少ない、あったとしても正解に辿りついていないまま放置されているといった状態であまり参考にならない。2017年にComplicationsが発表された際の盛り上がりで開発者コミュニティに質問が投稿されたきり答えがないままとなっているなど散々な状況となっている。

Complications開発者コミュニティがあまり頼りにならない中ではAppleの公式ドキュメントが第一級資料だと思う。

Updating Your Complication | Apple Developer Documentation

サンプルコードもある。

Creating and Updating Complications | Apple Developer Documentation

Appleの資料が怪しい

Apple のComplication更新に関するドキュメントは怪しい箇所がある。

Updating Your Complication | Apple Developer Documentationの資料では4つのComplicationsを更新する手筈が示されている。

  1. watchOSアプリがフォアグランド状態での更新API呼び出し
  2. バックグラウンド通信後の更新
  3. (通信を伴わない)バックグラウンド処理
  4. WSSessionを使ったiPhoneアプリからの更新リクエスト呼び出し

手軽な4番を使ってみたのだが実装した限りでは上手く機能していない。確認のために呼び出しログまで用意してみたが、iPhone側の更新リクエストにComplications

一通りためした結果1と3の組み合わせでComplicationの更新に成功している。1に関しては2つのメソッドが説明に上がっているが実際に動作するのは一方のみである。

サンプルコードだけが正しい

結果だけいうとComplicationの更新が実現されているのはサンプルコードだった。

Creating and Updating Complications | Apple Developer Documentation

Coffee Tracker という馴染みのあるサンプル名がサイト上から確認できないので、Coffee Trackerというキーワードだけで本サンプルを覚えておくとWeb検索で見つからないという事象に陥るので注意。

またiOS14 SDKを要求されるがビルドエラーになる箇所をコメントアウトすればXcode11でも動作する。

サンプルコードでは、

  • UIでの変更を反映するためCLKComplicationServer.reloadTimeline(for: ) を呼び出して更新
  • WKExtension.scheduleBackgroundRefresh() を呼び出してバックグラウンド処理をスケジュール。バックグラウンド処理の完了後にWKApplicationRefreshBackgroundTask.setTaskCompletedWithSnapshot() を呼び出し

で処理を実現していた。

Coffee Trackerでの実装

充電報告さんでは、

  • アプリからのメッセージ送信時にCLKComplicationServer.reloadTimeline(for: ) を呼び出し
  • WKExtension.scheduleBackgroundRefresh() を呼び出してバックグラウンド処理をスケジュール。バックグラウンド処理の完了後にWKApplicationRefreshBackgroundTask.setTaskCompletedWithSnapshot() を呼び出し

でcomplicationsが実用的な更新頻度となった。

充電報告さんでの実装

サンプルコードもキャッチーなプロジェクト名(Coffee Tracker)が付けられているがダウンロードするまでWeb検索にも引っかからないなどWebへの露出度の低さもあってWebでの調べ物でなんとかするのも難しい。

まとめ

現状はApple提供のサンプルのみComplications更新を確認できた。

watchOSに関してはAppleのドキュメントは混乱しているように思える。Complications更新についてはまとめられているものの実際には動作の確認が取れない場合があった。

Complications更新問題はApple側ではなく実装側、watchOSアプリとComplicationsの情報の受け渡し処理で問題が発生している可能性もあるが原因を特定できるだけの開発コミュニティがないので孤軍奮闘せざるを得ない。

雑感

Complicationsを実装してみてわかったのはComplications更新の方法という実装上重要な項目にもかかわらずWebで検索できる情報源の少なさ、公式のAppleで提示している手段も実際に使えるかは実装して試行錯誤が必要というのもwatchOSアプリ開発者の総数を減らしているかもしれない。

watchOSアプリは個人をサポートする強力なツールとしての側面が強くiPhoneアプリ黎明期の個人ツールとしてアプリが受け入れられた頃に近い自分だけの需要が他のユーザーにも受け入れられる可能性はある面白い分野だと思うし、開発者を増やす助力にこのブログが役立てば良いと思う(開発者が増えれば調べ物の労力が軽減されると云うもの)。