Геозона, когда приложение убито пользователем в iOS 11 - PullRequest
0 голосов
/ 03 июля 2019

Геозона, когда приложение закрывается пользователем в 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 или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...