주제는 정말로 모든 것을 말합니다. 문서에 따르면 iOS 장치에서 실행되는 CoreBluetooth 프레임 워크에 대해 작성된 앱은 백그라운드 권한 목록에 “bluetooth-central”을 추가 할 수 있으므로 비활성 상태에서 일종의 Bluetooth 이벤트를 처리 할 수 있지만 정확한 이벤트는 배달되지 않습니까?
예를 들면 :
- 이미 페어링을 설정 한 장치와 통신을 계속할 수 있습니까?
- 범위를 벗어난 장치를 찾기 위해 주기적으로 검색 요청을 할 수 있습니까? (예를 들어 새로운 흥미로운 장치가 발견 될 때 알림을 전달하고 싶을 때)
- 장치가 범위를 벗어났다가 다시 돌아 오면 어떻게됩니까? 사용자 개입없이 연결이 끊어지고 연결된 이벤트를 받게됩니까? 아니면 포 그라운드 상태에서 사용자가 명시 적으로 재 연결을 요청해야합니까?
답변
아무도 모르는 것 같았 기 때문에 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 프로그래밍 가이드를 발표했으며 여기에 대한 공식 메모가 있습니다.
답변
iBeacon과 관련된 백그라운드 및 CoreBluetooth의 동작을 기록하는 것도 좋습니다. Apple은 이것을 CoreLocation 기능으로 생각하는 것을 좋아합니다.
-
iBeacon 지역에 대한 알림이 켜져 있으면 사용자에게 지역 진입 또는 종료를 알립니다. 이러한 알림은 디스플레이가 켜져 있는지 꺼져 있는지에 따라 만들 수 있습니다. 이러한 알림은 알림을 요청하는 앱이 백그라운드에있는 경우에도 작동합니다. (이 정도는 문서에서 명확합니다).
-
그다지 명확하지 않습니다. iBeacon 범위 API를 사용하는 경우 앱이 포 그라운드에 있어야합니다. 문서에서이를 명시 적으로 언급하지 않습니다. 사실 범위 지정이 문서의 백그라운드에서 작동해야한다고 오해 할 수 있습니다. 그러나 Apple 엔지니어는 Apple 개발자 포럼의 긴 스레드 어딘가에 묻혀있는 게시물에서이를 명확히했으며이 역시 실패하는 것을 보았습니다. 범위 지정은 전경에서만 작동합니다.
-
iBeacon을 광고하는 주변기기에 의해 광고되는 다른 서비스를 발견 할 수 있습니다. 그러나 이것은 전경에서만 작동합니다. 따라서 중앙에 iBeacon을 사용하여 근접성을 알리고 다른 BLE 기반 서비스를 사용하여 다른 트랜잭션을 수행하려면 이것은 작동하지만 포 그라운드에서만 작동합니다. 백그라운드에서는 작동하지 않습니다. 백그라운드에서 BLE 기반 서비스를 사용하는 거래의 경우 광고는 iBeacon이 아닌 일반 BLE 광고 여야합니다. iBeacon 광고를 사용하여 백그라운드에서 검색 프로세스를 지원 한 다음 백그라운드에서 BLE 서비스 사용으로 전환 할 수 없습니다. (나는 이것을 일하는 것을 매우 좋아했지만 주사위는 없습니다).
답변
방금 iOS8.3 및 8.4에서 BLE 장치에 대한 백그라운드 모드를 배웠으며 위와 몇 가지 차이점을 발견했습니다.
-
내가 시작하면
[centralManager scanForPeripheralsWithServices : @ [[CBUUID UUIDWithString : kServiceUUID]] 옵션 : @ {CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
…에서
- (void)applicationDidEnterBackground:(UIApplication *)application
열거 형은 RSSI가 다른 모든 호출에서 동일한 장치를 반환하므로 CBCentralManagerScanOptionAllowDuplicatesKey가 무시되지 않습니다.
- 앱이 포 그라운드에 있으면 BLE 장치를 초당 50 번 발견했습니다. 앱이 백그라운드에 있지만 전화 화면이 활성 상태 인 경우 앱이 BLE 장치를 초에 6 번 발견했습니다. 전화 화면이 차단되면 앱이 BLE 장치를 초당 1 회 발견했습니다.