[ios] 백그라운드에서 CoreBluetooth 애플리케이션이 정확히 무엇을 할 수 있습니까?

주제는 정말로 모든 것을 말합니다. 문서에 따르면 iOS 장치에서 실행되는 CoreBluetooth 프레임 워크에 대해 작성된 앱은 백그라운드 권한 목록에 “bluetooth-central”을 추가 할 수 있으므로 비활성 상태에서 일종의 Bluetooth 이벤트를 처리 할 수 ​​있지만 정확한 이벤트는 배달되지 않습니까?

예를 들면 :

  1. 이미 페어링을 설정 한 장치와 통신을 계속할 수 있습니까?
  2. 범위를 벗어난 장치를 찾기 위해 주기적으로 검색 요청을 할 수 있습니까? (예를 들어 새로운 흥미로운 장치가 발견 될 때 알림을 전달하고 싶을 때)
  3. 장치가 범위를 벗어났다가 다시 돌아 오면 어떻게됩니까? 사용자 개입없이 연결이 끊어지고 연결된 이벤트를 받게됩니까? 아니면 포 그라운드 상태에서 사용자가 명시 적으로 재 연결을 요청해야합니까?



답변

아무도 모르는 것 같았 기 때문에 iOS 개발자 계정을 구입하고 몇 가지 실험을 수행했습니다. 내가 찾은 내용은 다음과 같습니다.

포 그라운드에서 실행하는 경우 CBCentralManager :: scanForPeripheralsWithServices를 사용하여 스캔을 시작할 수 있습니다. 스캔은 특정 서비스를 광고하는 장치 로 제한 되거나 제한되지 않을 수 있습니다 (해당 호출의 매개 변수에 대해 nil 전달). 또한 중복을 허용 하거나 허용하지 않을 수 있습니다 . 전자의 경우 iPhone이 광고 패킷을 수신 할 때마다 didDiscoverPeripheral 콜백을 받게됩니다. 후자의 경우 발견 된 장치 당 하나의 콜백 만받습니다.

배경에 들어가면 규칙은 다음과 같이 나타납니다.

  • 무제한 검사를 실행 중이라면 자동으로 취소됩니다. didDiscover 콜백을받지 않습니다.
  • 스캔이 제한된 경우 (예 : 찾고 있던 하나 이상의 서비스 UUID를 지정한 경우) 스캔은 계속 실행되지만 중복 허용 플래그는 무시 됩니다. 즉, 이제 장치에 대한 didDiscoverPeripheral 콜백 만 받게 됩니다. 전경에있는 동안 모든 장치가 표시되면 콜백이 전혀 수신되지 않습니다.
  • 스캔을 시작하고 중지 해도 새 장치로 간주되는 장치는 재설정 되지 않습니다 . 하나의 장치가있는 경우 다음을 제외하고는 여러 스캔에 걸쳐 단일 콜백 만받습니다.
  • 이 경우 연결 장치에, 다음 분리 한 후 다시 스캔 장치 (즉 당신이 didDiscoverPeripheral에 한 번 더 전화를 얻을 것이다) 다시 열거됩니다. 나는 iOS가 그것을 장치에 “관심을 보인”것으로 간주한다고 생각한다.

연결이 불가능한 장치 (예 : 근접 프로필을 구현하는 BLE 광고주와 같은 BLE 광고주)에 대한 연결 시도가 내 예제 장치를 연결할 수 있기 때문에 충분한 지 모르겠습니다. 그러나 적어도 연결 가능한 장치의 경우이 검색 / 연결 / 연결 끊기 / 검색 절차는 백그라운드에서 장치의 존재를 폴링하는 데 충분합니다.

위의 결과는 iOS 5.0.1을 실행하는 iPhone 4S를 사용하여 수집되었습니다.


답변

Chris의 답변 외에도 :

  • 앱에 “bluetooth-central”백그라운드 모드가 있고 주변 장치에 연결되어 있으면 peripheral:didUpdateValueForCharacteristic:error:10 분 후에도 백그라운드에서 주변 장치의 알림 ( )을 받을 수 있습니다 .

따라서 백그라운드에서 계속 실행하려면 두 가지 옵션이 있습니다.

  • “연결, 연결 해제, 다시 스캔”루프 실행
  • 주변 장치가 알림을 보내도록합니다.

나중에 WWDC 2012 Core Bluetooth 비디오 https://developer.apple.com/videos/wwdc/2012/ 의 “이벤트 배경”이어야합니다.
하지만 전자는 해킹처럼 보이지만 의존하고 싶지 않습니다.

iPhone5, iOS6.1.4에서 테스트했습니다.


Apple은 마침내 Core Bluetooth 프로그래밍 가이드를 발표했으며 여기에 대한 공식 메모가 있습니다.

iOS 앱을위한 핵심 블루투스 백그라운드 프로세싱


답변

iBeacon과 관련된 백그라운드 및 CoreBluetooth의 동작을 기록하는 것도 좋습니다. Apple은 이것을 CoreLocation 기능으로 생각하는 것을 좋아합니다.

  1. iBeacon 지역에 대한 알림이 켜져 있으면 사용자에게 지역 진입 또는 종료를 알립니다. 이러한 알림은 디스플레이가 켜져 있는지 꺼져 있는지에 따라 만들 수 있습니다. 이러한 알림은 알림을 요청하는 앱이 백그라운드에있는 경우에도 작동합니다. (이 정도는 문서에서 명확합니다).

  2. 그다지 명확하지 않습니다. iBeacon 범위 API를 사용하는 경우 앱이 포 그라운드에 있어야합니다. 문서에서이를 명시 적으로 언급하지 않습니다. 사실 범위 지정이 문서의 백그라운드에서 작동해야한다고 오해 할 수 있습니다. 그러나 Apple 엔지니어는 Apple 개발자 포럼의 긴 스레드 어딘가에 묻혀있는 게시물에서이를 명확히했으며이 역시 실패하는 것을 보았습니다. 범위 지정은 전경에서만 작동합니다.

  3. iBeacon을 광고하는 주변기기에 의해 광고되는 다른 서비스를 발견 할 수 있습니다. 그러나 이것은 전경에서만 작동합니다. 따라서 중앙에 iBeacon을 사용하여 근접성을 알리고 다른 BLE 기반 서비스를 사용하여 다른 트랜잭션을 수행하려면 이것은 작동하지만 포 그라운드에서만 작동합니다. 백그라운드에서는 작동하지 않습니다. 백그라운드에서 BLE 기반 서비스를 사용하는 거래의 경우 광고는 iBeacon이 아닌 일반 BLE 광고 여야합니다. iBeacon 광고를 사용하여 백그라운드에서 검색 프로세스를 지원 한 다음 백그라운드에서 BLE 서비스 사용으로 전환 할 수 없습니다. (나는 이것을 일하는 것을 매우 좋아했지만 주사위는 없습니다).


답변

방금 iOS8.3 및 8.4에서 BLE 장치에 대한 백그라운드 모드를 배웠으며 위와 몇 가지 차이점을 발견했습니다.

  1. 내가 시작하면

    [centralManager scanForPeripheralsWithServices : @ [[CBUUID UUIDWithString : kServiceUUID]] 옵션 : @ {CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];

…에서

- (void)applicationDidEnterBackground:(UIApplication *)application

열거 형은 RSSI가 다른 모든 호출에서 동일한 장치를 반환하므로 CBCentralManagerScanOptionAllowDuplicatesKey가 무시되지 않습니다.

  1. 앱이 포 그라운드에 있으면 BLE 장치를 초당 50 번 발견했습니다. 앱이 백그라운드에 있지만 전화 화면이 활성 상태 인 경우 앱이 BLE 장치를 초에 6 번 발견했습니다. 전화 화면이 차단되면 앱이 BLE 장치를 초당 1 회 발견했습니다.


답변