14

アプリが実行されていないときでも、コアBluetoothがアプリを起動しようとしています。

Apple が述べているように、「状態の保存と復元は Core Bluetooth に組み込まれているため、アプリはこの機能を選択して、システムにアプリの中央マネージャーと周辺マネージャーの状態を保存し、特定の Bluetooth 関連タスクを実行し続けるように要求できます。これらのタスクのいずれかが完了すると、システムはアプリをバックグラウンドで再起動し、アプリにその状態を復元してイベントを適切に処理する機会を与えます。」

この機能をオプトインするために、次のコードを追加しました。

 myCentralManager =
        [[CBCentralManager alloc] initWithDelegate:self queue:nil
         options:@{ CBCentralManagerOptionRestoreIdentifierKey:
         @"myCentralManagerIdentifier" }];

しかし、アプリが起動したときのコールバックはトリガーされませんでした。

-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}

-(void)centralManager:(CBCentralManager *)central
      willRestoreState:(NSDictionary *)state {
}

これらの 2 つが呼び出されることはありません。

このウェイクアップ機能をテストする方法:

  1. info.plist のバックグラウンド モードに「bluetooth central」を追加して、BLE がバックグラウンドで実行されるようにします。

  2. 私のiPhone No.1でcentralManagerを起動します。スキャン開始。

  3. ホームを押して外に出て、メモリを大量に消費するゲームをプレイすると、デバッグログに次のように表示されます:「メモリ不足のため終了しました。プロセスは終了コード0で終了しました」これは、iOS システムがメモリ不足のためにバックグラウンド アプリを終了する方法をシミュレートするためです。

  4. 別のiphone2号でビーコンを起動し、ブロードキャストを開始します。

  5. 結果: これらの再起動コールバックは呼び出されません。

これが機能しない理由はありますか?API の問題である場合、携帯電話が BLE ビーコンに近づいたときにアプリを BLE でバックグラウンドに再起動する他の方法はありますか? ibeacon を使用してアプリを起動しようとしましたが、コア Bluetooth セントラル マネージャーでは、バックグラウンドで ibeacon に接続できません。

ありがとう!

4

3 に答える 3

14

ホームボタンをクリックしてアプリをバックグラウンドに送信すると、アプリが一時停止し、Bluetooth デリゲートを処理して 10 秒間バックグラウンドで実行できます。この機能は、「info.plist のバックグラウンド モードで Bluetooth Central を追加する」だけで実現でき、 State Preservation & Restoration を使用します。

アプリがIOS によって終了された場合、メモリ プレッシャが原因で、 Bluetooth デリゲートを処理できなくなります。この場合、State Preservation & Restoration を使用した場合、アプリをバックグラウンドで再起動して再度実行できますが、これも 10 秒間だけです。10 秒後、一時停止状態に移行します。 この状況でのみ、CBCentralManager の willRestoreState をトリガーできます。

コードを追加できます

kill(getpid(), SIGKILL);

ボタン アクションの場合、ボタンをクリックすると、メモリ不足によってアプリが強制終了されたように、IOS によってアプリが終了され、「willRestoreState」がトリガーされます。

幸運を。

于 2014-03-07T08:02:57.113 に答える
4

また、既知のサービスを使用した周辺機器のバックグラウンド スキャンにもこの問題がありますUUIDs。おそらくiOSのバグです。XCode のデバイス マネージャーからのコンソール出力を見るとわかるように、iOS は周辺機器を検出するとアプリを再起動します。didFinishLaunchingWithOptionsデリゲートが呼び出されますが、デリゲートへの呼び出しは、CBCentralManager's willRestoreStateユーザーがアプリを手動でフォアグラウンドに移動するまで遅延します。

アプリが起動されているにもかかわらず、メイン スレッドのイベント ループが実行されていないかのようです。たとえば、コードを追加する場合:

dispatch_async(dispatch_get_main_queue(), ^{
  NSLog(@"Hello from the main thread");
});

デリゲートに対してdidFinishLaunchingWithOptions、アプリがフォアグラウンドに移動するまで、メッセージはデバッグ コンソールに表示されません。

私の回避策はqueue:nilCBCentralManager. このようにして、アプリがまだバックグラウンドにある間にデリゲートが呼び出されます。

于 2014-01-09T12:17:42.603 に答える