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


78

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

예를 들면 :

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

답변:


120

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

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

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

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

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

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


2
안녕 크리스. 흥미 롭군요! 나는 한 가지를 이해하지 못한다. Bluetooth 설계와 통신하는 경우 프로세스가 백그라운드에서 계속 실행될 수 있습니까? (예 : 심박수 모니터를 연결 한 다음 애플리케이션을 백그라운드로 이동하여 계속 실행될 것으로 예상 할 수 있습니까?)
Ben

2
안녕 벤. 포 그라운드 에서처럼 계속 실행되지는 않지만 위에서 설명한 종류의 Bluetooth 이벤트가 발생할 때 계속 실행됩니다. 내가 만난 문제는이 상황에서도 잠시 동안 사용자 상호 작용이 없으면 전화가 절전 모드로 전환되고 앱 호출이 중지된다는 것입니다. 나는이 문제를 해결하기 위해 오디오 응용 프로그램으로 등록 (거짓)하여 중단을 방지했습니다. 그러나 이것은 앱 스토어에서는 분명히 허용되지 않습니다.
Chris Smowton 2012-06-19

안녕 크리스. 좋은 게시물입니다. 귀하의 마지막 의견은이 게시물의 진술을 부정합니다. lists.apple.com/archives/bluetooth-dev/2011/Dec/msg00007.html 이것은 좋은 소식이 아닙니다. 이것이 구현의 실제 오류라고 생각하십니까? 장치에 대한 연결을 설정 했습니까? 값 업데이트 알림도 중지되는지 확인할 수 있습니까? 감사.
allprog 2012-08-08

1
@ChrisSmowton 더 이상 iOS 기기가 없다는 것을 알고 있습니다. 그러나 중복을 무시하는 iOS와 주변 장치를 찾지 못하는 iOS를 어떻게 구별 할 수 있을지 아이디어가 있습니까?
shreyashirday 15:53에

3
마지막으로 연결 한 이후로 보지 못했다면 거기에 없습니다. 당신이 그것을 본다면, 내가 백그라운드에서 그것을 다시 발견하는 유일한 방법 은 연결을 시도하는 것입니다.
Chris Smowton 2015

9

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 앱을위한 핵심 블루투스 백그라운드 프로세싱


7

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

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

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

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


4

방금 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 회 발견했습니다.

1
그들은 내가 :) 2012 년에 그것을 사용 된 이후 스택을 개선했습니다처럼 좋음, 소리를 알고
크리스 Smowton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.