4 : 6メソッド(コーヒードリップ)用のwatchOSアプリを作った
はじめに
コーヒー抽出の方法の1つに4 : 6メソッドという手法があり、この4 : 6メソッドを支援するiOSアプリBrewCoffee46を作成[1]し、この1年間で30回ほどの更新を行って少しずつ機能強化を行ってきた。
iOSDC Japan 2024 0日目のセッションwatchOS 最前線 〜現代のApple Watch向けアプリの作り方〜でBrewCoffee46のApple Watch対応を着想し、2024/9/3に配信開始したバージョン2.0.0にてwatchOSアプリをリリースした[2]。
この記事では、まず作成したアプリについてデモ動画などで解説し、次にiOS・watchOS両方のアプリを作るうえで行ったパッケージ構成をまとめておく。なお、iOSアプリとwatchOSアプリの両方を含めたBrewCoffee46全体のソースコードは下記のGitHubリポジトリーから入手できる。
watchOSアプリ版のBrewCoffee46
作成したwatchOSアプリは上記リンクのiOS版アプリにバンドルされて配布されている。
watchOSアプリのトップ
全体的な動作
次の動画のように、iOSアプリのコントローラーというよりはこのwatchOSアプリがスタンドアローンで動作する。
上記のデモ動画であるように、watchOSアプリにも4 : 6メソッドの計算ロジックが実装されている[6]ため、watchOSアプリでコーヒー豆の重さを変更してそれに基づく設定を計算できる。
また、動画では説明できないが注水タイミングでApple Watchが振動する(Haptic Feedback)ようにしてあり、画面を注視しなくても注水タイミングを把握できるようになっている。これは作ったあとになって気づいたことだが、筆者はApple Watchを利き手である右手に付けており、ドリップ中は右手でお湯を注いだりする必要があるため画面を注視できない。よってHaptic Feedbackで画面を細かく見ることなく注水タイミングが把握できるようにした。
iOSアプリとの設定共有
現状はwatchOSアプリで変更できるのはコーヒー豆の重量のみとしてあり、他の設定は下記の動画にあるようにiOSアプリから送信することにした。
モジュール構成の変化
これまではwatchOSアプリが存在しなかったっため、iOSアプリとそのテストという下記のような2ターゲットの構成であった。
一方でwatchOSアプリが加わったため、下記のようなやや複雑な構成となった。
この図に登場するモジュールを表で整理すると次のようになる。
モジュール | 管理 | 目的 |
---|---|---|
BrewCoffee46 |
XcodeGen | iOSアプリ |
BrewCoffee46Tests |
XcodeGen | iOSアプリ部分のテスト |
BrewCoffee46WatchKitApp |
XcodeGen | watchOSアプリ |
BrewCoffee46Core |
SwiftPM | iOS・watchOSの両方で共有するコアパッケージ |
BrewCoffee46CoreTests |
SwiftPM | コアパッケージのテスト |
BrewCoffee46TestsShared |
SwiftPM | コアパッケージのテストとiOSアプリのテストで共有するパッケージ |
このようなiOS・watchOSアプリで共有するパッケージ管理のためにSwiftPMを新規に導入した。これまではXcodeGenを使っていたが、XcodeGenのみをつかってiOS・watchOSから参照されるフレームワークを作成することが最終的にできなかった[7]。
共有パッケージであるBrewCoffee46Core
の設定をPackage.swift
で与えて、それをXcodeGenからローカルパッケージとして読み込むという方法であればiOS・watchOSアプリから依存できるフレームワークを簡単に作ることができた。
まとめ
SwiftPMを使えばXcodeGenでxcodeproj
ファイルを直接バージョン管理せずにiOS・watchOSの両方に対応したアプリを作成できる。実はこのwatchOSアプリの開発で一番苦労したのはiOSとの共有フレームワークをどうやって設定するかというコーディングとはまるで関係ないところであり、このようなXcodeのご機嫌をとる(?)作業の比重がプログラミングと比べて多めになってしまうのがApple系の開発で大変なところだと思う。
また、iOSDC 2024 Tokyoにはじめて参加したが、最終的にそれをきっかけにしてwatchOSアプリをリリースできたので、他にも懇親会でのディスカッションなども含めて行って本当によかったと感じている。
謝辞
SwiftPMを使うといったパッケージ構成などの様々な相談に乗ってくれた@kouki_danさんと@nanashikiさんに感謝する。
-
そういうわけで(?)この記事をiOSDC Japan 2024ということにする! ↩︎
-
誰でも簡単! 世界一の4:6メソッドでハマる 美味しいコーヒー(Amazon) ↩︎
-
後述するがiOSアプリとwatchOSアプリとで主要なロジックを共有できるようにSwiftPMを利用してパッケージに切り出しているため、iOSアプリとwatchOSアプリでロジックに差が生じないようにした。 ↩︎
-
実はできるやり方があるのかもしれないが……😇 ↩︎
Discussion