M-1戦士のためのApple WatchアプリM-1 Timerをつくりました

2023/12/20に公開

漫才日本一を決める大会、M-1グランプリ。
そんなM-1に挑むお笑い芸人を見ていたら、こんなアプリあったらいいかなと思って、つくってみました。

https://apps.apple.com/app/m-1-timer/id6474502299

その名もM-1 Timer。
ステージの脇でタイマーをスタートさせると、1分ごとにApple Watchが振動して通知します。

タイマーの時間と通知間隔は設定で変えられます。

M-1に出ない方も、プレゼンのときに使えるかもしれません。

M-1の制限時間

M-1の制限時間のことよく知らなかったんですが、調べたらこんなルールみたいです。

1回戦は「2分」/2回戦・3回戦は「3分」/準々決勝・準決勝・敗者復活戦・決勝は「4分」

https://www.m-1gp.com/entry/

以下、大変だったこと。

Xcodeの実機デバッグが完全にできなくなった

Apple Watchの実機デバッグ、今までも不安定だったんですが、Xcode 15.1で完全にできなくなりました。
何時間か試行錯誤して、本気でできなかったので、シミュレーターでの確認だけでストア申請しました。

Hapticどれを使うか

このアプリのポイントは、振動にあります。
Appleのつけた正式名称がHaptic(触覚フィードバック)らしく、どれを使うか悩みました。

https://note.com/yorifuji/n/n6a24bf81fc53

こちらの方が、全Haptic試せるテストアプリつくってくれてるんですが、実機で試せなかったため、結局どの指定がどの振動なのかわからないままストア申請しました。

バックグラウンド処理

watchOSアプリ、バックグラウンドに回すと処理が止まります。
WKExtendedRuntimeSession を使って、処理を継続させる必要がありました。

import Foundation
import WatchKit

final class ExtendedRuntimeSession: NSObject, ObservableObject {
    private var session: WKExtendedRuntimeSession!
    var sessionEndCompletion: (() -> Void)?
    
    func startSession() {
        session = WKExtendedRuntimeSession()
        session.start()
    }
    
    func endSession() {
        session.invalidate()
    }
}

extension ExtendedRuntimeSession: WKExtendedRuntimeSessionDelegate {
    func extendedRuntimeSessionDidStart(_ extendedRuntimeSession: WKExtendedRuntimeSession) {}
    func extendedRuntimeSessionWillExpire(_ extendedRuntimeSession: WKExtendedRuntimeSession) {
        sessionEndCompletion?()
    }
        
    func extendedRuntimeSession(_ extendedRuntimeSession: WKExtendedRuntimeSession, didInvalidateWith reason: WKExtendedRuntimeSessionInvalidationReason, error: Error?) {
        sessionEndCompletion?()
    }
}

タイマーを起動したときにセッションを開始します。
そうすると、バックグラウンドにアプリが回ったときに、こんな表示になって処理が継続します。

詳細

アプリは無料ですし、ソースコードはOSSとして下記リポジトリで公開しています。
似たようなwatchOSアプリつくりたい人はお気軽にパクってください。

https://github.com/0si43/M-1Timer

実装したときの細かいキャッチアップは下記のスクラップを参照してください。

https://zenn.dev/st43/scraps/929b41aeb0dc33

(了)

Discussion