ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
電力の制限:バッテリー消費の改善
電力使用量を制限しながら、ユーザがAppをさらに活用できるようにする方法をご確認ください。ご自身のコードに4つの重要な変更を加えて、Appからのバッテリー消費を抑える方法について解説します。さらに、ご利用のAppにダークモードを追加してOLEDディスプレイの利点が得られるようにしたり、セカンダリアニメーションからのフレームレートを監査したり、バックグラウンドデータ処理を制限したり、長時間実行タスクを延期したりする方法を紹介します。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC19
-
ダウンロード
♪ ♪ こんにちは Vaibhav Gautamです Software Powerチームの エンジニアです Appは 一日を通して 様々な重要な機能を提供し 生活を豊かにしています しかし 代償が伴います: バッテリーの消耗です そのため Appのバッテリー 駆動時間の改善には 特に注目すべきです より長く デバイスやAppを 使えるようにするためです 我々は 消費バッテリーを 理解するために システムコンポーネントを 研究しています この動画では Appの バッテリー寿命を大幅に 改善するために 我々が特定した 4つの重要なアクションを 紹介します その4つとは Appのダークモード フレームレートの監査 バックグラウンド時間の制限 Appの作業の延期です
まずは ダークモードについて ダークモードは iOS 13で 導入され デバイスを 暗い表現のプレゼンテーションで 構成できます ダークモードの 個人への 効果は知られていますが バッテリー駆動時間にも 劇的に影響します
iPhone 13や13 Proのような 有機ELディスプレイ搭載の デバイスでは 暗いコンテンツは 明るいものよりも消費 バッテリーが少ないためです 有機EL画面では 画素ごとに電力を必要とし 暗い色ほど少ない電力で 画素が点灯できます システムを構成する 部品の中で ディスプレイはバッテリー 消費の大きな要因の一つです 実際 一般的な使用例では ディスプレイが バッテリー消耗の 主要因になり得ます ディスプレイの 消費バッテリーに影響する 方法の一つが ダークモードの採用です 私のチームが取り組む Food Truck Appを 例に挙げて説明します このAppは 画面の大半を占める 背景色がとても目立ちます ダークモードでは 背景色がライトモードより かなり濃く バッテリーの節約に 大きく貢献します このようなケースでは 結果として最大で70% ディスプレイの 省電力化が期待できます これは大きな節約です! 画面の輝度が高い場合は さらに高い バッテリー節約効果を 発揮します ダークモードを好む ユーザーにとって バッテリーの消耗を抑え 熱負荷も軽減できる 絶好の機会です まず ダークモードを 有効にしたときに Appが どのように表示されるかの 確認から始めます Appのどのコンポーネントを 更新すれば システムの UIに適合するか把握します App構築の際に アピアランス機能を使用することで Xcodeがこれを簡単にします
ライトモードしか対応せず Appの色がハードコード されている場合もあります Xcodeのダイナミックカラーで 両方の背景色 画像 テキストに対応させます システムが自動的に正しい カラーバリューを使用し モードが変わると更新します
また Appはライトモードと ダークモードの代替画像に 対応する必要があります Appのダークモード対応に ついて詳しくはWWDC 2019の 「iOSのダークモードを 実装する」をご覧ください
Appだけでなく Webコンテンツに ダークモードを採用する 方法も考えておきましょう Safariは Webコンテンツを 自動で暗くはしないので Webコンテンツにも ダークモードを採用します
Webサイトのスタイルシート にcolor-schemeプロパティを
実装することで Webページのデフォルトの テキストと背景色が 現在の システムの外観や標準的な フォームコントロール スクロールバーと一致します ほかの名前の付いた システムカラーは ライトとダークモードを 切り替えて表情を変えます スタイルシートで 色が参照される場所では スタイルシート変数を 使います これで デバイスがライトと ダーク間で切り替わると Webコンテンツの色が 更新されます Webページの画像やメディア アセットにも同様に適用し モードごとに異なる バリエーションを用意します Webコンテンツへの ダークモードの実装について 詳しくは WWDC 2019の 「Webコンテンツを ダークモードに対応させる」 を参照してください バッテリー節約の別の方法は フレームレートの監査です ProMotionディスプレイを 搭載したデバイスでは リフレッシュレートが 消費電力に影響します リフレッシュレートが高い ほど 消費電力も大きくなり App内のアニメーションの フレームレートが ディスプレイのリフレッシュ レートを決定します App内のコンテンツすべてに 高いフレームレートが 必要なわけではないので App内のプライマリコンテンツが 必要とするフレームレートを 考慮してください ディスプレイのリフレッシュ レートは Appの中で 最もフレームレートの高い アニメーションが決定します Appの二次的要素が 必要以上に高速に更新され App全体が予想以上に バッテリーを消費している 可能性があります
再び Food Truck Appの 登場です 冒頭では 毎秒30フレームで レンダリングしています トラックの下には「Food Truck」というテキスト オーバーレイがあり 水平方向にスクロールします このセカンダリテキストは 毎秒60フレームなので 結果 画面全体が毎秒60フレームで レンダリングされます テキストアニメーションを 30fpsに変更すれば 画面全体が30fpsで レンダリングできるので バッテリーの消耗を 最大20%抑えらえれます 素晴らしいですね! Appのデバッグや フレームレートに関する 詳細を得るには Instrumentsを使用します CoreAnimation FPS instrumentで Appのフレームレートが 時系列で表示できます 主なユーザーシナリオの 監査から始めましょう フレームが期待したレートで レンダリングされているかの 確認は 画面上の 二次的要素がプライマリのコンテンツ よりも高いフレームレートか どうかで判断します
AppはiOSのCoreAnimationの CADisplayLinkでしばしば カスタムアニメーションや レンダーループを駆動します CADisplayLinkは ディスプレイのリフレッシュ レートに同期したタイマーで カスタム描画がリフレッシュ イベントを認識できるよう タイミング情報を渡します AppはCADisplayLink オブジェクトに 希望する 画面のリフレッシュレートに 関するヒントを与えられます CADisplayLinkのpreferred FrameRateRangeを設定し 最小 最大 好みのフレーム レートを指定します
ディスプレイリンクは システムが処理可能な フレームレートに基づいて 希望に最も近く 利用可能な レートを選択します レートが提供できない時は 指定した範囲内に 収めようとします ディスプレイリンクを 設定するには ターゲットとセレクタを 指定して初期化します このセレクタは カスタム アニメーションの実行と 次に表示するビデオフレーム の計算に使用します ディスプレイリンクが 初期化されたら 希望のフレームレート範囲を 設定します この例で好ましいレートは 30ですが 10~60の範囲で 扱うことができます 最後に 現在の実行ループに ディスプレイリンクを追加します
Appのバッテリー消費と リフレッシュレートは相関し ダイナミックなリフレッシュ レートに対応するProMotion ディスプレイを搭載した デバイスには特に重要です InstrumentsでAppの フレームレートを監視し Appをリリースする前に 問題の発見ができます 最後に CADisplayLinkで Appコンテンツの リフレッシュレートを制限する 情報をシステムに渡します
フレームレートの 最適化について 詳細は WWDC2021の 「可変リフレッシュレート ディスプレイ向けの最適化」を ご覧ください では バックグラウンドで 動作しているAppを パワーダウンさせる方法の 説明に移ります 誰かがみなさんのAppから 別のAppに切り替えたとき バックグラウンドでみなさんの Appが実行され続けて バックグラウンド実行APIに 依拠することがあります バックグラウンド動作中に Appは位置情報やオーディオ などの共通サービスを 使い続ける場合があります 長時間実行すると バッテリーの消耗が 激しくなるため Appがバックグラウンドで これらサービスを使う場合は 特に注意が必要です! これらのモードを使う際に 過剰な消耗を回避する方法を 説明します 位置情報サービスでは デバイスを起こし続けて 位置情報を流し続けます ユーザーからは見えない Appでも バックグラウンドで 位置情報を流し続け 過剰にバッテリーを 消耗する可能性があります Appのバックグラウンド ローケーションセッションの 実行時間を必ず 確認しましょう セッションが不要になったら Appが stopUpdatingLocation() を 呼び出して セッションを 停止させることを確認します App開発のさまざまな段階で ツールを使って バックグラウンドで 想定外の 位置情報の利用がないか 調べられます Appのビルドとテスト中に Xcodeのゲージで システムのエネルギー使用量や バックグラウンドの 位置情報の使用量を 知ることができます リリース前のAppをテスト する際は MetricKitで 1日使用した場合の 診断情報が収集できます iOS 16の新機能に コントロールセンターでの 位置情報の使用の表示があります Xcodeゲージは CPU 位置情報 ネットワーク使用状況などに 関する情報を提供します XcodeのゲージはAppの 位置情報の使用状況や エネルギーへの影響を 時系列で表示します このタイムライン表示で 位置情報のランタイムが 予想される時間に停止するか どうか確認できます Appのテスト時にMetricKit を使用するのも有効です cumulativeBackgroundLocationTime プロパティで Appの バックグラウンドでの位置 情報の使用時間を調べます
iOS 16の新機能では コントロールセンターで ユーザーは 現在位置情報を 使用しているAppを監視 できます 上部の テキストをタップすると 位置情報を利用している Appの詳細が表示されます 外出先で位置情報の 使用時間を 監視するために使用します みなさんのAppが表示されたら アクティブな位置情報 ストリーミングセッションを 持っている指標になります 同じ原理をオーディオ セッションにも適用できます 例えば 音楽Appでオーディオ プレーヤーを使って ファイルを再生していて それを止めたとします Appは音の一時停止や 停止だけでなく オーディオエンジンが アイドル状態にならないよう 一時停止や停止をする 必要があります AVAudioEngineクラスの autoShutdownEnabled プロパティを設定し オート シャットダウンモードを 使用することをお勧めします このモードでは オーディオ エンジンが一定時間 アイドル状態かどうか 継続的に監視し 検出します アイドル時には エンジンが オーディオハードウェアを シャットダウンします その後 いずれかのソースが 再びアクティブになれば オーディオハードウェアを 同時に起動します これらは すべて内部で行われます watchOSでは 強制的に 自動シャットダウンモードが 動作します 使用しないときは節電のため 必ずオーディオエンジンを 停止してください バックグラウンドの実行 時間を制限する鍵は 終了するときに それをシステムに 伝えるのを忘れないことです バッテリー駆動時間を改善 する最後のアクションは 作業の延期です 1日で Appはたくさんの 異なるタスクやデータを 処理することがあります 画面上にコンテンツを 表示したり ユーザーがタップした 音声や動画を再生したりと ユーザーの動作に即座に 対応する必要があります
機械学習タスクや分析の アップロード バックアップ などの作業は それほど 時間に制約されません 時間的制約のある作業を 充電時などのより良い タイミングで行えば バッテリーを節約し ユーザー主導の インタラクティブな作業との 競合が避けられます そのために利用できる3つの APIについて説明します BGProcessingTaskは長時間 タスクの延期に適します 裁量型URLSessionは 延期可能な ネットワーキングの スケジュールに最適です また 適切なプッシュの 優先順位を活用することで サーバが適切なタイミング で プッシュを配信できます 詳しく見ていきましょう まずは BGProcessingTaskから BGProcessingTaskを使うと 長時間実行する処理タスクを デバイスの充電中など より 良いタイミングに延期します データベースのクリーン アップやバックアップの作成 機械学習のトレーニングの 実行などに最適です 利用するには BGProcessing TaskRequest APIで リクエストを作成し App識別子を指定します 次に 外部電源や ネットワークが必要な タスクかどうかなど 詳しい情報を入力します より詳しく情報提供すると システムはより良い時間帯に タスクをスケジューリング できます その後システムは 適切なタイミングでAppを バックグラウンドで起動して 遅延可能な作業の完了のため 数分の実行時間を付与します 次は 裁量型URLSessionです みなさんのAppは 一般的なネットワーキングの ために バックグラウンド URLSessionsをすでに 使用しているかもしれません これは裁量フラグを使うと さらに向上します 裁量フラグ付きURLSessionは デバイスがプラグインされ Wi-Fiに接続中であるなど 最適なタイミングでの ネットワーキング実行のため システムにオフロードされた ネットワーキング トランザクションです 裁量フラグは テレメトリ収集や テレビ番組の 次の話のダウンロードなど ユーザー主導でない 長時間稼働の ネットワーキングに最適です また ネットワークが オフロードされたので ネットワーク トランザクション 完了までの間にAppを 実行する必要がありません 裁量URLセッションを 使用するには バックグラウンドの URLセッションを設定し isDiscretionaryをtrueに 設定します 追加情報の入力によって システムが適切な タイミングでダウンロードを 行うように設定できます タイムアウト時間の 設定によって 永久に ダウンロードを試みず バッテリーの消耗を防ぎます
データのアップロードや ダウンロードを 将来のある時点まで 行わない場合は 「最も早い開始日」を 指定してください 最後に 予想される ワークロードのサイズを 入力すると システムが ダウンロードタスク間で インテリジェントに ロードバランスをとります
BGProcessingTaskと 裁量型URLSessionで 特定の操作の即時性を 制御できるのと同様に 異なるプッシュ優先度を 使うことで プッシュ配信の即時性に 影響を与えられます プッシュの優先順位は プッシュをデバイスに 配信する 緊急性の程度を決めます 優先度の高いプッシュの場合 サーバはプッシュを すぐにデバイスに送信する ため デバイスが起動し バッテリーの消耗を 引き起こす可能性があります 優先度の低いプッシュの場合 サーバは デバイスの 起動中や優先度の高い プッシュが届くなど 適切なタイミングまで プッシュの送信を遅らせます 高優先度プッシュは 悪天候警報のような緊急性の 高いメッセージに最適です 低優先度プッシュは 緊急性がなく 延期できる 受動的な通知に最適です これを活用して 遅延可能な メッセージ配信を遅らせると デバイスがスリープから 頻繁に起動せずに済むため バッテリーを節約できます 低優先度のプッシュを設定は プッシュの ペイロードのapns-priority を5に設定するだけです サーバが残りを処理し ユーザーはバッテリー寿命の 節約に感謝することでしょう 最終の考察と次のステップに 入り まとめとしましょう Appにダークモード オプションを用意します ユーザーの意図を尊重して バッテリーが節約できます アニメーションを見直し フレームレートを必要な分 まで下げる機会を探します 小さなアニメーションひとつ が 大きな効果を発揮します バックグラウンドの 実行時間が終了したら システムに知らせることで 常に監視できます 最後に 長時間実行する バックグラウンド作業を デバイスの充電時など より 良いタイミングに延期します これらをすべて実行すれば Appの電力消費が 本当に抑えられます ご視聴 ありがとうございました
-
-
8:02 - Create a CADisplayLink
// Create a display link func createDisplayLink() { let displayLink = CADisplayLink(target: self, selector: #selector(step)) // Configure your desired refresh rate by calling preferredFrameRateRange displayLink.preferredFrameRateRange = CAFrameRateRange(minimum: 10, maximum: 60, preferred: 30) // then activate your CADisplayLink by adding it to the main runloop. displayLink.add(to: .current, forMode: .defaultRunLoopMode) }
-
16:03 - Discretionary URLSession
// Set up background URL session let config = URLSessionConfiguration.background(withIdentifier: "com.app.attachments") let session = URLSession(configuration: config, delegate: ..., delegateQueue: ...) // Set discretionary config.isDiscretionary = true // Set timeout intervals config.timeoutIntervalForResource = 24 * 60 * 60 config.timeoutIntervalForRequest = 60 // Create request and task var request = URLRequest(url: url) request.addValue("...", forHTTPHeaderField: "...") let task = session.downloadTask(with: request) // Set time window of two hours task.earliestBeginDate = Date(timeIntervalSinceNow: 2 * 60 * 60) // Set workload size task.countOfBytesClientExpectsToSend = 160 task.countOfBytesClientExpectsToReceive = 4096 task.resume()
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。