- 元の記事 : Detecting low power mode
- 元の記事の著者 : useyourloaf
- 翻訳元 : 掘金翻訳計画
- 翻訳者 : Zheaoli
- 校正者 : LoneyIsError, wild-flame
今週、私は Uber がスマートフォンの省電力モードをどのように検出しているかについての記事を読みました。(注:記事のリンクはUber found people more likely to payです)スマートフォンの電池残量が少なくなると、Uber の利用料金が高くなる可能性があります。Uber はこのデータを利用して料金を設定していないと主張していますが、ここで私が知りたいのは、ユーザーの iPhone が低電力モードになっているかどうかをどのように知るのかということです。
低電力モード#
iOS 9 では、iPhone に低電力モードが追加されました。充電できるまでの間、低電力モードはメールの送受信、Siri、バックグラウンドでのプッシュ通知などの電力を消費する機能を停止して、バッテリーの使用時間を延ばします。
重要な点は、低電力モードはユーザーが自分で設定する必要があるということです。バッテリーの設定で低電力モードをオンにする必要があります。低電力モードに入ると、ステータスバーのバッテリーアイコンが黄色に変わります。
充電が 80%以上になると、システムは自動的に低電力モードをオフにします。
低電力モードの検出#
実際には、iOS 9 で低電力モードの情報を取得するのは非常に簡単です。ユーザーが低電力モードに入っているかどうかは、NSProcessInfoクラスを使用して判断することができます:
if NSProcessInfo.processInfo().lowPowerModeEnabled {
// 電池消費の激しい処理を停止する
}
Objective-C で同じ機能を実装する場合は:
if ([[NSProcessInfo processInfo] isLowPowerModeEnabled]) {
// 電池消費の激しい処理を停止する
}
NSProcessInfoPowerStateDidChangeNotification通知を監視している場合、ユーザーが低電力モードに切り替えたときに通知を受け取ることができます。たとえば、ビューコントローラのviewDidLoadメソッド内で次のようにします:
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(didChangePowerMode(_:)),
name: NSProcessInfoPowerStateDidChangeNotification,
object: nil)
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didChangePowerMode:)
name:NSProcessInfoPowerStateDidChangeNotification
object:nil];
このメソッドでは、電池モードを監視し、切り替え時に応答します。
func didChangePowerMode(notification: NSNotification) {
if NSProcessInfo.processInfo().lowPowerModeEnabled {
// 低電力モードがオンになっている場合
} else {
// 低電力モードがオフになっている場合
}
}
- (void)didChangePowerMode:(NSNotification *)notification {
if ([[NSProcessInfo processInfo] isLowPowerModeEnabled]) {
// 低電力モードがオンになっている場合
} else {
// 低電力モードがオフになっている場合
}
}
ヒント:
-
この通知メソッドと NSProcessInfo のプロパティは、iOS 9 以降で提供される新しいメソッドです。アプリを iOS 8 やそれ以前のバージョンと互換性があるようにするには、test for availabilityでコードが正常に動作するかをテストする必要があります。
-
低電力モードは iPhone の独自の機能であり、iPad で前述のコードをテストすると常に false が返されます。
ユーザーが低電力モードを有効にしている場合にのみ、アプリが電池寿命を延ばすための省電力対策を実施できる場合にのみ、低電力モードの検出が有用です。Apple は以下のような提案をしています:
- 位置情報の更新を停止する
- ユーザーインタラクションのアニメーションを減らす
- バックグラウンドでのデータストリームなどの操作を停止する
- エフェクトを無効にする