7

Bluetooth Low Energy を使用するアプリを開発していると、iOS デバイスが周辺機器との接続を失うことがあります。(時には何時間も。)

既存の周辺機器に再接続するには、アプリがバックグラウンドで実行されている場合でも、アプリは 1 日を通して特定の速度でバックグラウンドで常にスキャンする必要があります。

問題は、メモリの制約などにより、iOS がアプリが強制終了されないことを保証しないことです。

iPhone OS プログラミング ガイドに記載されている情報には、次のように記載されています。

Bluetooth 周辺機器で動作するアプリは、アプリが中断されたときに周辺機器が更新を配信する場合、起動するように要求できます。このサポートは、Bluetooth 心拍数ベルトなど、定期的にデータを送信する Bluetooth-le アクセサリにとって重要です。アプリの Info.plist ファイルに bluetooth-central 値を持つ UIBackgroundModes キーが含まれている場合、Core Bluetooth フレームワークは、対応する周辺機器のアクティブなセッションを開いたままにします。さらに、周辺機器から新しいデータが到着すると、システムはアプリを起動して、データを処理できるようにします。また、システムはアプリを起動して、アクセサリの接続と切断の通知を処理します。

電話がデバイスに接続されていて、アプリケーションがバックグラウンドである場合、問題は発生しません。ただし、デバイスが切断され、アプリがバックグラウンドになっている場合に発生します。この特定のケースでは、電話機が周辺機器に接続されていないため、通知を受信できなくなります。

これについては、Stack Overflow または Apple フォーラムで多くの人が以前に議論しており、Apple 開発者の 1 人が次のように答えていると思います。

私たちはこの問題を認識しており、解決策を見つけようとしています。現在、回避策はありません。」

私の質問は、メモリの制約のために iOS によって強制終了されない可能性を少なくとも改善する方法はありますか?

たとえば、インスタント メッセージング アプリ (IMO) はバックグラウンドで非常にうまく動作しているようです。何日も使用されていないと、アプリが起動し、gChat メッセージが表示されます。

などを質問しています。

  • 強い指針
  • 全体のメモリサイズ
  • アプリがバックグラウンドまたは最小化されているときのメモリ サイズの削減
  • バックグラウンド操作の頻度を減らす
  • 等。
4

3 に答える 3

1

Bluetoothハードウェアが切断されている場合でも、なぜバックグラウンド実行が必要なのですか?再接続するために「継続的に再スキャン」する必要はないと思います。ハードウェアがiPhone/iPadと「ペアリング」されている場合は、それ自体が再接続されます。ブルートゥースヘッドセットのように。か否か?

AFAIKあなたはあなたが求めていることを達成する機会がありません。ユーザーが家に帰ると、通常のアプリは常に一時停止されます。アプリには約があります。タイマーを停止するための5秒のバックグラウンド時間、状態ecceccを保存します。より多くのバックグラウンド時間を設定できる特別なバックグラウンドモードがあり、このモード(リンクしたページで説明)はそれぞれ異なる動作をします。

Bluetoothモードについて:記述された動作は問題ではありませんが、仕様によるものです。

  • アプリは一時停止されています

  • アプリが一時停止されると、OSによってRAMを解放するためにアプリが強制終了される可能性があります(これを回避するためのトリックはありません)が、システムは必要に応じてウェイクアップします。

  • その後、通知を受信するたびにアプリが起動されます(一時停止状態から起動されるか、「以前に強制終了された」状態から起動されます)

  • アプリはタスクを実行するのに10秒あります(情報の保存、ecc ecc)。さらに、+10分をリクエストできます。特定のタスクのバックグラウンド時間の

  • 10秒(または10分)後、アプリは再び一時停止されます

チャットアプリについて書いた例は正しくありません。チャットアプリは通常、バックグラウンドモードを使用せず、プッシュ通知を使用してメッセージを転送するだけです。アプリを開くと、アプリはすべてのメッセージを保存するサーバーに接続してダウンロードします。

ロケーションバックグラウンドモード(ルーティングアプリはバックグラウンドで動作可能)を使用するか、重要なロケーション変更(アプリが起動する)と10分のバックグラウンドタイムの​​組み合わせを使用して「より多くの稼働時間」を得ることができますが、Appleはアプリを拒否すると思いますこれを「乱用」します。

間もなく、この動作をサポートするようにアプリを設計する必要があります。

于 2013-01-07T17:07:47.410 に答える
0

アップルのドキュメントから、私は常に次のことを想定しています。

connectPeripheral:options:
Establish a connection to the peripheral.

- (void)connectPeripheral:(CBPeripheral *)peripheral options:(NSDictionary *)options;
Parameters
peripheral
The peripheral to connect to.

options
A dictionary to customize the behavior of the connection. See CBConnectPeripheralOptionNotifyOnDisconnectionKey.

Discussion
**This never times out**. Use cancelPeripheralConnection: to cancel a pending connection.'

重要な部分は、これが決してタイムアウトしないという事実にあります。これはシステムにハンドオフされ、周辺機器が範囲に入ると自動的に接続されるため、完全なバックグラウンド処理が不要になると思います。私が間違っている場合は、誰かが私を修正してください!

于 2013-01-08T07:51:42.410 に答える
0

私はこれをいくつかのAppleドキュメントで見つけました:

バックグラウンド アプリのメモリ使用量

すべてのアプリは、バックグラウンドに入ったときに実用的な範囲でできるだけ多くのメモリを解放する必要があります。システムはできるだけ多くのアプリを同時にメモリに保持しようとしますが、メモリが少なくなると、中断されたアプリを終了してそのメモリを再利用します。バックグラウンドで大量のメモリを消費するアプリは、最初に終了するアプリです。

実際には、アプリはオブジェクトへの強い参照が不要になったらすぐに削除する必要があります。強い参照を削除すると、コンパイラはオブジェクトをすぐに解放して、対応するメモリを再利用できるようになります。ただし、パフォーマンスを向上させるために一部のオブジェクトをキャッシュする場合は、アプリがバックグラウンドに移行するまで待ってから、それらへの参照を削除できます。

できるだけ早く強い参照を削除する必要があるオブジェクトの例には、次のものがあります。

画像オブジェクト

ディスクから再度読み込むことができる大きなメディア ファイルまたはデータ ファイル アプリが必要とせず、後で簡単に再作成できるその他のオブジェクト アプリのメモリ フットプリントを削減するために、システムは、アプリが移動するときに、アプリに代わって割り当てられた一部のデータを自動的に消去します。背景に。

システムは、すべてのコア アニメーション レイヤーのバッキング ストアをパージします。この作業によって、アプリのレイヤー オブジェクトがメモリから削除されたり、現在のレイヤー プロパティが変更されたりすることはありません。アプリがバックグラウンドにあることを考えると、これらのレイヤーのコンテンツが画面に表示されないようにするだけです。キャッシュされたイメージへのシステム参照が削除されます。(アプリに画像への強い参照がない場合、それらは後でメモリから削除されます。)他のシステム管理データ キャッシュへの強い参照が削除されます。

于 2013-01-07T18:31:10.577 に答える