◉RORK LABEN
●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主
記事一覧/開発ツール
⬡ 開発ツール/2026-06-24上級

発熱と省電力モードに合わせて、重い処理を静かに落とす設計

ProcessInfoのthermalStateと省電力モードを監視し、発熱時やバッテリー残量が少ないときに重い処理を段階的に落とす設計です。品質レベルを一箇所で決めて各機能をティアに従わせる実装、実機での確認方法までをSwiftのコードとともに整理します。

Rork Max235SwiftUI66パフォーマンス33バッテリーオンデバイスAI13

✦ プレミアム記事

個人開発で長く続けているアプリにオンデバイスのAI機能を足したとき、リリースから数日して「使っていると本体が熱くなる」「電池の減りが早い」というレビューが届きました。手元の検証機では一度も再現せず、しばらく原因が掴めませんでした。後から分かったのは、私の検証がいつも涼しい部屋・十分な充電という、いちばん条件の良い状態だったことです。

実際のユーザーは、夏の屋外や、バッテリー残量が一桁の通勤電車の中でアプリを開きます。そこでは iOS 自身が CPU/GPU の上限を絞り始めていて、私のアプリは「重い処理を全力で回そうとし続ける」ことで、発熱と電池の減りをさらに悪化させていました。アプリ側が端末の状態を読んで、自分から負荷を引いていく必要があったのです。

ここから、ProcessInfo が公開している二つの状態 — 発熱段階(thermalState)と省電力モード(isLowPowerModeEnabled)— を監視し、重い処理を段階的に落とす設計を、Rork Max が生成するネイティブ Swift にそのまま組み込める形で追っていきます。

発熱と省電力は別の信号として扱う

最初に押さえておきたいのは、この二つは原因も対処も違うということです。混ぜて一つのフラグにすると、判断を誤ります。

発熱(thermalState)は、端末が物理的に熱を持ち、OS が性能を絞り始めている状態を表します。.nominal(通常)→ .fair(やや上昇)→ .serious(深刻)→ .critical(危機的)の4段階で、.serious 以降は OS が積極的にスロットリングをかけます。ここでアプリが重い処理を続けると、体感が一気に悪化します。

省電力モード(Low Power Mode)は、ユーザーが、あるいは残量低下によって自動で、バッテリーを節約する設定を選んだ状態です。発熱とは無関係に発生します。ここでは「バックグラウンド更新を控える」「通信頻度を落とす」といった、電力を直接削る対処が効きます。

つまり、発熱には「いま回っている処理を軽くする」、省電力には「これからやる処理を減らす」と、別の引き出しで応える設計が向いています。

thermalState を監視して段階を定義する

ProcessInfo は現在の発熱段階を同期的に読めるほか、変化したときに通知を流してくれます。まずはこの通知を一箇所で受け、アプリ全体で参照できる状態に変換します。

import Foundation
import Combine
 
@MainActor
final class DeviceConditionMonitor: ObservableObject {
    @Published private(set) var thermalState: ProcessInfo.ThermalState
    @Published private(set) var isLowPower: Bool
 
    init() {
        let info = ProcessInfo.processInfo
        thermalState = info.thermalState
        isLowPower = info.isLowPowerModeEnabled
 
        NotificationCenter.default.addObserver(
            self, selector: #selector(thermalChanged),
            name: ProcessInfo.thermalStateDidChangeNotification, object: nil)
 
        NotificationCenter.default.addObserver(
            self, selector: #selector(powerChanged),
            name: .NSProcessInfoPowerStateDidChange, object: nil)
    }
 
    @objc private func thermalChanged() {
        let next = ProcessInfo.processInfo.thermalState
        Task { @MainActor in self.thermalState = next }
    }
 
    @objc private func powerChanged() {
        let next = ProcessInfo.processInfo.isLowPowerModeEnabled
        Task { @MainActor in self.isLowPower = next }
    }
}

通知は任意のスレッドから飛んでくるため、@MainActor で受け直して UI 側の状態更新と整合させています。Rork Max が生成したコードがこの通知購読を持っていない場合は、まずこの監視クラスを一つ置くところから始めると、後の判断がすべてここに集約できます。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦ProcessInfo の thermalState と isLowPowerModeEnabled を監視し、発熱・省電力時に負荷の高い処理を段階的に落とす仕組みを組めます
✦アニメーション・バックグラウンド更新・オンデバイス推論を「品質レベル」で切り替える設計に落とし込み、機能を止めずに体験だけ軽くできます
✦ユーザーに不便を感じさせずにバッテリーと発熱を守る、長期運用に耐えるアプリの組み方が分かります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-07-18
文字サイズ最大とドイツ語で、生成された画面は静かに詰まる — Rork Max の SwiftUI にレイアウト耐性の検証を通した記録
Rork Max が生成した SwiftUI 画面を疑似ローカライズと最大文字サイズに通し、どこから詰まるかを機械的に洗い出した記録です。ViewThatFits・ScaledMetric・layoutPriority の使いどころと、再生成のたびに回帰を捕まえるスナップショット検証を、実際の数値とともにまとめました。
⬡ 開発ツール2026-05-17
Rork Max の SwiftUI 機能を壁紙アプリ開発で検証した結果 — 実際に動いた機能と手を入れた機能
運用中の壁紙アプリの本番コードを基準に、Rork Max の SwiftUI ネイティブ生成を検証しました。そのまま使えた機能、手を入れた機能、生成を諦めた機能を、動くコードと実機での計測値とともにお伝えします。
⬡ 開発ツール2026-05-12
Rork Max で複数アプリ共通UIライブラリを Swift Package Manager で構築する実践ガイド
複数アプリを運営する個人開発者向けに、Swift Package Managerで共通UIライブラリを構築してRork Max生成コードの重複を排除する手順です。パッケージ構成の設計、テーマシステムとカードコンポーネント、アニメーションプリセットの共通化、テストまで詳解します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます