2017-12-15 3 views
1

Ich baue eine Funktion im Zusammenhang mit der Bereichsüberwachung beim Starten der Bereichsüberwachung. Ich beantrage den Status wie unten im Code dargestellt. Auf einigen Geräten erhalte ich ständig den Status Unknown. Wenn ich WLAN ein- oder ausschalten oder das Ladegerät anschließe. Es beginnt gut zu funktionieren. Wie kann ich es in einem Mobilfunknetz zuverlässiger machen? Bitte beachten Sie, dass ich alle Standortberechtigungen vom Benutzer übernommen habe, bevor ich eine Regionsüberwachung oder Statusanfragen durchgeführt habe.CLRegionState wird angezeigt, während ein Status vom Standortmanager angefordert wird?

private func initiateLocationManager() { 
    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.distanceFilter = kCLLocationAccuracyBest 
    locationManager.requestAlwaysAuthorization() 
} 

func startMonitoring(alarm: StationAlarm) { 
    if LocationManager.sharedInstance.isRegionMonitoringAvailable() { 
     let coordinate = CLLocationCoordinate2D(latitude: stationLatitude, longitude: stationLongitude) 

     // 1 
     let region = CLCircularRegion(center: coordinate, radius: CLLocationDistance(radius * 1000), identifier: alarm.alarmId) 

     // 2 
     region.notifyOnEntry = true 
     region.notifyOnExit = false 

     // 4 
     locationManager.startMonitoring(for: region) 
     Utility.delay(0.1) { [weak self] in 
      self?.locationManager.requestState(for: region) 
     } 

    } 
} 

func locationManager(_: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion) { 
    Log.event("Region State is \(state.rawValue)") 
} 
+0

See [Empfehlung von Apple für die Überwachung von Test Region] (https://stackoverflow.com/questions/23866097/ios-geofence-clcircularregion-monitoring-locationmanagerdidexitregion-does-not/47099174#47099174) – Honey

+0

@Honey Aber Ich warte nicht auf die Eingangs- oder Ausgangsbenachrichtigung. Ich habe einfach nach dem bestehenden Zustand der Region gefragt, nachdem ich die Überwachung gestartet habe. – kidsid49

+0

Ja, aber Ihr WLAN ist ausgeschaltet. Ich wollte nur darauf hinweisen: "Wenn Wi-Fi deaktiviert ist, ist die Überwachung der Region wesentlich weniger genau." Und wahrscheinlich wird das dazu führen, dass es unbekannt ist ... – Honey

Antwort

3

Das Problem ist, haben Sie die requestState ruft eine hartcodierte Verzögerung mit - (0,1). Wie stellen Sie sicher, dass der Standortmanager Ihre Region innerhalb von 0,1 Sekunden überwacht? Sie erhalten nur dann den genauen Status einer Region, wenn Sie mit der Überwachung begonnen haben.

Die bessere Methode zur Überwindung dieses Problems ist, implementieren die didStartMonitoringForRegion Delegierten und rufen requestStateForRegion

locationManager.startMonitoring(for: region) 

func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) { 
    manager.requestState(for: region) 
} 

func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion) { 
    if (region is CLBeaconRegion) && state == .inside { 
     locationManager(manager, didEnterRegion: region) 
    } 
} 
1

Vom CLLocationManager requestState(for:) docs:

Region: der Region, deren Zustand Sie wollen wissen. Dieses Objekt muss eine Instanz einer der Standard-Regionsunterklassen sein, die von Map Kit bereitgestellt werden. Sie können diese Methode nicht verwenden, um den Status benutzerdefinierter Regionen zu bestimmen, die Sie selbst definieren.

Sie definiert die Region selbst, so dass Sie nicht requestState(for:) verwenden kann seinen Zustand zu erhalten. Sie verwenden diese Funktion mit Regionen, die Sie vom Core-Standort zurückerhalten (über die Delegate-Methoden).

Wenn Sie wissen wollen, ob das Gerät gerade in einem Bereich ist, starten Sie eine Standard-Positionsaktualisierungsanforderung (startUpdatingLocation() usw.) und wenn Sie eine wieder aktuelle und präzise koordinieren, verwenden Sie die CLCircularRegion Funktion der Koordinate zu überprüfen.

// In the locationManager(_:didUpdateLocations:) delegate method 
if myCircularRegion.contains(myCoordinate) { 
    // ... 
} 
Verwandte Themen