"When an iBeacon is received, a BLE scan API is called within didEnterRegion. However, if executed while the screen is off, Core Bluetooth's didDiscover does not function. Yet, if the screen is turned on once and then turned off again, didDiscover functions. Is there a way to make Core Bluetooth's didDiscover work while the screen is off?"
Let me know if you need further assistance or clarification!
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if let beaconRegion = region as? CLBeaconRegion {
startRanging(in: beaconRegion)
}
}
func startRanging(in beaconRegion: CLBeaconRegion) {
// バックグラウンドタスクを開始
bgTask = UIApplication.shared.beginBackgroundTask(expirationHandler: { [self] in
print("バックグラウンドタスクの有効期限が切れ")
// バックグラウンドタスクの有効期限が切れたときに、バックグラウンドタスクを終了
self.lm!.stopRangingBeacons(satisfying: beaconRegion.beaconIdentityConstraint)
UIApplication.shared.endBackgroundTask(bgTask)
// バックグラウンドタスクの識別子を無効
bgTask = .invalid
})
// レンジング開始
self.lm!.startRangingBeacons(satisfying: beaconRegion.beaconIdentityConstraint)
//サービス指定してCoreBluetoothを起動
self.centralManager.stopScan()
self.centralManager.scanForPeripherals(withServices: [self.kServiceUUID], options: nil)
// バックグラウンドタスク終了
let time = UIApplication.shared.backgroundTimeRemaining - 1.0
DispatchQueue.main.asyncAfter(deadline: .now() + time) {
self.stopRanging(in: beaconRegion)
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print("---- didDiscover ----")
print("peripheral-->\(peripheral)")
print("advertisementData-->\(advertisementData)")
print("rssi-->\(RSSI)")
print("---------------------")
}