特定のBluetoothLowEnergyデバイスが範囲内に入ったときに通知を受ける必要があるアプリを作成しました。 BLEデバイスが認識された場合、私のアプリはタイムスタンプを保存するだけです。
WWDC 2012 Core Bluetoothビデオで述べられているように、CoreBluetoothを使用するときにバックグラウンドモードで動作するアプリには2つの可能性があります。
イベントの背景
イベントのバックグラウンドは、Bluetooth LowEnergyデバイスと対話するときにほとんどのアプリが使用するものです。このモードでは、アプリがバックグラウンドにあるときにアクセサリに直接通信することはできませんが、アプリと通信するときにアクセサリからの通知を提供します。アプリがバックグラウンドにある場合、iOSはBTLEアクセサリに接続されたままになり、通知を監視し続けます。接続されたBTLEアクセサリで通知が利用可能になると、iOSは、アクセサリがアプリと通信することをユーザーに通知し、ユーザーがアプリを読み込んでアクセサリを操作できるようにします。多くのデバイスは電力を節約する必要があるため、決定論的な時間に情報を提供するだけで、アクセサリとiPhone4Sのバッテリー寿命が大幅に向上します。
- このモードでは、info.plistエントリは必要ありません。
セッションのバックグラウンド
アプリがバックグラウンドで実行されている場合でも、アプリがアクセサリと対話する必要がある場合があります。心拍数をリアルタイムで監視する必要がある実行中のアプリについて考えてみます。このモデルには明確な開始と停止があります。ユーザーはアプリで実行を開始します。実行がアクティブである間、アプリは実行が完了するか停止するまで心拍数情報を読み取ります。セッションのバックグラウンドでは、アプリがバックグラウンドにあるときにスキャンしてBTLEアクセサリに接続することもできます。 scanForPeripheralsWithServicesまたはconnectPeripheral呼び出しは、アプリがバックグラウンドにある場合でも続行されます。 CoreBluetoothは、アプリが探しているサービスに一致する特定の周辺機器または周辺機器を引き続き監視し、見つかったときまたは接続されたときにアプリのデリゲートを呼び出します。 BTLEペリフェラルまたはiPhone4Sが無線を使用するたびに、それぞれのデバイスの使用可能な電力が枯渇することに注意してください。セッションベースのバックグラウンドを使用するアプリ開発者は、電力使用量に注意する必要があります。
- セッションのバックグラウンド処理には、アプリinfo.plistのUIBackgroundModes(bluetooth-central)へのバックグラウンドモードエントリが必要です。
今まで私はセッションのバックグラウンド(それに応じたinfo.plistエントリを使用)。アプリはiOSにすべての既知のデバイスを取得するように要求し、探しているデバイスに接続コマンドを与えます。接続コールバックは、アプリがバックグラウンドになってから数分後にも発生します。
ただし、アプリは1時間後に一時停止されます。これは、次にユーザーがアプリを起動したときに、対象のBLEデバイスが目撃されたかどうかを判断できないことを意味します。
私の質問は:特定のBLEデバイスが範囲内に入ったときに、バックグラウンドに送信されてから数日後でも、ユーザーの操作なしでアプリに通知を受け取り、タイムスタンプを保存することはできますか?
いいえ、iOSはアプリがバックグラウンドで存続することを保証しません。ドキュメントによると:
ただし、このメソッドは、アプリケーションがバックグラウンドで実行されており(一時停止されていない)、システムが何らかの理由でアプリケーションを終了する必要がある場合に呼び出されることがあります。
( applicationWillTerminate のドキュメント)
IOS 7以降、ユースケースのサポートが簡単になりました。 iOS 7より前は、アプリケーションはそのペリフェラルに関する通知を登録でき、システムが配信する通知を受け取ったときにバックグラウンドでウェイクアップされていました。ただし、アプリがバックグラウンドで実行されているときにシステムのメモリが不足したり、再起動されたりした場合、システムは再起動されません。 iOS7ではCBCentralManager
とCBPeripheralManager
に状態復元が追加されたため、前述のいずれかの条件で実行されていなくても、OSは限られた容量でアプリケーションを再起動します。詳細については、 CoreBluetoothガイド を参照してください。
つまり、ユースケースでは、次のことができます。
bluetooth-central
バックグラウンド実行モードとして。IOS7を使用BLE状態の保存と復元
アプリがメモリ不足のためにIOSで終了(これがアプリが数日後に機能しない理由です)の場合、Bluetoothデリゲートを処理できなくなります。この場合、State Preservation&Restorationを使用した場合は、アプリをバックグラウンドで再起動して、10秒間だけ再実行できます。 10秒後、一時停止状態に移行します。 この状況でのみ、CBCentralManagerのwillRestoreStateをトリガーできます。
幸運を。