---
title: watchOSで高負荷な処理を安定させるための工夫
tags: 
author: [Junsei Nagao](https://www.docswell.com/user/junseinagao)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/27V24R6Y7Q.jpg?width=480
description: 2025年9月20日 iOSDC Japan 2025 day 1
published: September 20, 25
canonical: https://www.docswell.com/s/junseinagao/KJQ1Y1-2025-09-20-iosdc-japan-2025-watchos
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/27V24R6Y7Q.jpg)

【iOSDC Japan 2025】
watchOSで高負荷な処理
を安定させるための工夫
Github: junseinagao / Twitter: @junpai_code


# Page. 2

![Page Image](https://bcdn.docswell.com/page/5JGR1MNW7L.jpg)

自己紹介
長尾准誠 (ながおじゅんせい)
1997年2月生まれ (27歳)
普段は KODANSHAtech 合同会社 で Webフロントエンドエンジニアとして業務
チューバという金管楽器（
🎺の仲間）を高校の頃から続けています
最近は、オーボエを吹くパートナーと一緒に吹奏楽の演奏活動に力を入れています


# Page. 3

![Page Image](https://bcdn.docswell.com/page/47QVDRQQEP.jpg)

メトロノームが楽器練習の鍵
「https://youtu.be/trl5vwdAQpI?si=vl4XERS3E08AGay9」より引用


# Page. 4

![Page Image](https://bcdn.docswell.com/page/KE4MZ8NY71.jpg)

Apple Watchで動くメトロノームを実装
watchOSでメトロノームを実装
針アニメーション＋ハプティクス（振動）＋音
身につけているデバイスならではの体験


# Page. 5

![Page Image](https://bcdn.docswell.com/page/L718R25NJG.jpg)

だんだんテンポが遅くなる
シミュレータ：問題なし／軽快
実機：テンポが徐々に遅れる
原因はwatchOSのリソース制約か...？


# Page. 6

![Page Image](https://bcdn.docswell.com/page/G7WZ1RWM72.jpg)

[補足]：高負荷ではなく安定実行かも


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4JZ1PR5ME3.jpg)

watchOS 開発特有の問題
watchOSアプリのライフサイクル：
active / inactive / background / suspended を OS が積極的に切り替え
非対応なフレームワーク１：
Core AnimationのCALayerはwatchOSでは操作できない
非対応なフレームワーク２：
Haptic Feedbackは`WKInterfaceDevice.play()`で固定パターンのみ
WKInterfaceDevice 9種類 + SwiftUI SensoryFeedback 1種類


# Page. 8

![Page Image](https://bcdn.docswell.com/page/YE6LMR957V.jpg)

watchOSアプリのライフサイクル
バッテリー節約などのためにアプリケーションの実行にOSが
積極的に関与している
例えば...「Apple Watchを身につけて腕を降ろすと Inactive に
移行する」
「https://developer.apple.com/documentation/watchkit/working-with-the-watchos-app-life-cycle」より引用


# Page. 9

![Page Image](https://bcdn.docswell.com/page/GE51Z8NGJ4.jpg)

柔軟な操作ができるフレームワークは非対応


# Page. 10

![Page Image](https://bcdn.docswell.com/page/9721RK5DER.jpg)

どうやって音のズレを解決したか...
メトロノームのタイミング管理を行っている
AVAudioEngine の処理の優先度を下げない


# Page. 11

![Page Image](https://bcdn.docswell.com/page/DJYZDNKMEM.jpg)

Debuggerに接続してると安定する...?!
XCodeからDebuggerを繋いで検証中は安定して動作する
しかし、Macから離してApple Watch単体で実行すると3~5秒ほどでズレ
始める...
→ デバッガー非接続の時はwatchos によって処理
が割り込んでいるのでは...？
（特にテンポのタイミング管理をしているAVAudioEngineの処理が遅れると音
の再生の遅れに繋がる）


# Page. 12

![Page Image](https://bcdn.docswell.com/page/V7N36XR378.jpg)

メトロノームアプリの仕組み
AVAudioEngine + AVAudioPlayerNode でサンプル時刻に再生を予約
テンポから各ビートのサンプル位置を算出
`AVAudioTime()` で再生時刻を作り、
`AVAudioPlayerNode.scheduleBuffer()` へ
Haptic と UI の同期は、`DispatchQueue.global()` を使う
デリゲートでHapticとUIへビートを通知する


# Page. 13

![Page Image](https://bcdn.docswell.com/page/YJ99L8MPJ3.jpg)

対策 1：Extended Runtime Session
WKExtendedRuntimeSession を起動して長時間実行を確保
WKBackgroundModes の目的で挙動が変化
（mindfulness → Frontmost / Physical Therapy → Background）
観測: Mind fullness では音ズレが残存する、Physical Therapy で解消
考察: Background 継続前提で他処理介入時の優先度低下の影響が小さい(？)


# Page. 14

![Page Image](https://bcdn.docswell.com/page/GJ89X8LXED.jpg)

対策 2：非同期に処理を投げる
同期 `.sync` を廃止し、`.async` で非同期スケジューリング
Haptic は事前予約（DispatchQueue.main.asyncAfter）、オーディオと独立
`DispatchQueue`で専用キューを用意（QoS: .userInteractive）
備考: QoS は状況によりシステムに無視される


# Page. 15

![Page Image](https://bcdn.docswell.com/page/LJLW8RLN7R.jpg)

対策 3：スケジューリングをまとめて投げる
予約の粒度を拡大（約1秒 → 約10秒分を一括）
再スケジューリング境界を減らし、ズレ発生箇所を回避


# Page. 16

![Page Image](https://bcdn.docswell.com/page/47M96RMQJW.jpg)

まとめ
メトロノームのタイミング管理を行っている AVAudioEngine +
AVAudioPlayerNode のスケジューリング再実行が優先度低く実行されるのを
避けるために
1. Extended Runtime Session を使用する
2. DispatchQueue を非同期に実行する
3. 処理毎にスケジューリングを並列して実行する
という対策実施


# Page. 17

![Page Image](https://bcdn.docswell.com/page/P7RGPRVKJ9.jpg)

【演奏デモ】
Csárdás
(チャルダッシュ)
作曲：Vittorio Monti (ヴィットーリオ・モンティ)


