Геозона, когда приложение закрывается пользователем в iOS 11
iOS 11. У меня правильно настроен CLLocationManager, и он прослушивает вход / выход из региона.Все отлично работает.Но когда я убил свое приложение и вошел в регион, я получил локальное уведомление (которое было определено в методе didEnterRegion). Но не смог перезапустить в фоновом режиме.Я думал, что это запустит приложение в фоновом режиме, выполнит didEnterRegion: и убьет себя снова через некоторое время.Все, что мне нужно сделать, сканирование BLE и вызов делегата BLE внутри didEnterRegion:
Пожалуйста, дайте мне знать, возможно ли это и как?
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
if region is CLCircularRegion {
debugPrintLog(s: ">>>>>>>>>>>>>>>>>>>>>didEnterRegion")
outSideFromGeoReasion(identifire: region.identifier)
}
}
// called when user Enters a monitored region
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
debugPrintLog(s: ">>>>>>>>>>>>>>>>>>>>>didEnterRegion")
if region is CLCircularRegion {
insideInGeoResion(identifire: region.identifier)
Shared.sharedInstance.isStopBleScanFromGeo = false
}
}
func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion) {
switch state {
case .inside:
print("inside doorname :-" + region.identifier)
insideInGeoResion(identifire: region.identifier)
Shared.sharedInstance.isStopBleScanFromGeo = false
print("inside")
case .outside:
outSideFromGeoReasion(identifire: region.identifier)
print("outside doorname :-" + region.identifier)
print("outside")
default:
print("Unknown")
}
}
func insideInGeoResion(identifire:String){
let stringArray :[String] = identifire.components(separatedBy: "()");
let dooId:Int = Int(stringArray[0])!
let inside: Int = DataBaseManager.sharedInstance.fatchInsideGeofence(doorId: dooId)
if !(inside == 2){
print(">>>>>>>>>>>>>>m Door Home identifire", identifire )
Shared.sharedInstance.fireLocalPush(title:"Geofence", subtitle: stringArray[1] + " in Home mode", timeInterval:1, identifier: identifire + "Entry", enableSound: false)
DataBaseManager.sharedInstance.updateInsideGeofancing(insideDB: dooId, value: 2)
}
if !(Shared.sharedInstance.centralManager != nil) {
Shared.sharedInstance.centralManager = CBCentralManager()
}else{
if Shared.sharedInstance.centralManager?.state == .poweredOn {
if let manager = Shared.sharedInstance.centralManager, !manager.isScanning {
manager.scanForPeripherals(withServices: [Shared.sharedInstance.serviceUUID], options:[CBCentralManagerScanOptionAllowDuplicatesKey:false])
Shared.sharedInstance.isStopBleScanFromGeo = true
}
}
}
}
func outSideFromGeoReasion(identifire:String) {
let stringArray :[String] = identifire.components(separatedBy: "()");
// print(">>>>>>>>>>>>>>m Door Away identifire", identifire )
let dooId:Int = Int(stringArray[0])!
let outside: Int = DataBaseManager.sharedInstance.fatchInsideGeofence(doorId: dooId)
if !(outside == 1){
print(">>>>>>>>>>>>>>m Door Away identifire", identifire )
Shared.sharedInstance.fireLocalPush(title:"Geofence", subtitle: stringArray[1] + " in Away mode", timeInterval: 1, identifier: identifire + "Exit", enableSound: false)
DataBaseManager.sharedInstance.updateInsideGeofancing(insideDB: dooId, value: 1)
}
DataBaseManager.sharedInstance.devicesDetail { (savedoor) in
let existLock = savedoor.filter({ (object) -> Bool in
return (object.value(forKey: "inside_Geofance") as! Int) == 2
})
if !(existLock.count > 0) {
if Shared.sharedInstance.centralManager != nil {
if Shared.sharedInstance.centralManager?.state == .poweredOn {
Shared.sharedInstance.centralManager?.stopScan()
Shared.sharedInstance.isStopBleScanFromGeo = true
}
}
}
}
}
запускать сканирование BLE только в уничтоженном состоянии.вызвать всех делегатов CBCentralManager.и как проверить сканирование Ble или нет.