2014-06-11 4 views
12

Ich versuche Region Überwachung zu testen, für die ich bin immer aktuelle Lage wie folgt aus:Region aktuellen Standort Überwachung benachrichtigen nicht an der Ausfahrt

- (void)startLocationTracking 
{ 
    CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 

    // Start location manager 
    if ([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) { 
     locationManager = [LocationTracker sharedLocationManager]; 
     locationManager.delegate = self; 
     [locationManager startMonitoringSignificantLocationChanges]; 
    } 
} 

Und erste Lage mit Region Überwachung wie diese Tracking:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:manager.location.coordinate radius:300 identifier:@"first location initializer"]; 

     NSLog(@"0: %@", manager.location); 
     NSLog(@"1: %@", region); 

     [manager startMonitoringForRegion:region]; 
     NSLog(@"[locationManager startMonitoringForRegion:%@];", region); 
    }); 
} 

Dann in jeder Ausfahrt aus der aktuellen Region ich überwache die neue Position wie folgt aus:

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 
{ 
    NSLog(@"%s, %@", __PRETTY_FUNCTION__, region); 
} 

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region 
{ 
    NSLog(@"%s, %@", __PRETTY_FUNCTION__, region); 

    NSArray *allRegions = manager.monitoredRegions.allObjects; 

    if (allRegions.count > 0) { 
     for (CLRegion *reg in allRegions) { 
      [manager stopMonitoringForRegion:reg]; 
     } 
    } 

    CLLocationCoordinate2D cord = CLLocationCoordinate2DMake(manager.location.coordinate.latitude, manager.location.coordinate.longitude); 
    CLRegion *regionNew = [[CLRegion alloc] initCircularRegionWithCenter:cord radius:300 identifier:@"new region"]; 

    NSLog(@"region: %@", region); 
    NSLog(@"regionNew: %@", regionNew); 

    [manager startMonitoringForRegion:regionNew]; 
} 

Ich erkläre, was ich erwarte:

  1. Registrieren Sie den aktuellen Standort in der Region Überwachung.
  2. Benutzer benachrichtigen aktuellen Bereich verlassen.
  3. Beim Beenden des Protokolls und registrieren Sie erneut den aktuellen Standort als Region.

Dies passiert nicht.

Wo liege ich falsch?

Ich versuchte auf Simulator mit "Freeway Drive".

UPDATE:

Geprüft und Arbeit, wegen Apple-Bug in Geofencing wird app unterstützen nur 7.1+, ziemlich schlecht, aber ich habe nicht eine andere Idee.

+1

Nun, Sie sollten diese Art von Verhalten nie auf einem Simulator testen. Sie benötigen dafür ein echtes Gerät. Ich habe versucht, dies einmal für eine Location-Tracker-App, aber es wurde einfach zufällig auf einem Simulator ab. –

+0

Getestet in Echtzeit, funktioniert immer noch nicht. –

+0

Können Sie Ihr Update näher erläutern? Funktioniert Ihr Code in Ihrer Frage jetzt ohne die in der Antwort angegebene Lösung? – rene

Antwort

11

Ich denke, die Art, wie Sie die Region-Überwachung implementieren, könnte einige Probleme verursachen.

Hier sind die Gründe: -

  1. Innerhalb der startLocationTracking Methode, Ihre locationManager ist ein lokales Objekt, das nicht über den Lebenszyklus dieses Verfahrens erstreckt. Es bedeutet auch, dass jedes Mal, wenn Sie startLocationTracking aufrufen, ein neues locationManager Objekt vorhanden ist, das mit einem neuen Speicherblock belegt wird.

    Um dieses Problem zu lösen: Sie haben einen SingletonlocationManager, die eine gemeinsame locationManager für den gesamten Lebenszyklus der Anwendung ist verwenden soll.

  2. Ich glaube, Sie sollten nicht startMonitoringForRegion innerhalb der Delegierten Methode -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:. Der Grund dafür ist, dass wenn Sie startLocationTracking mehr einmal aufrufen, es mehr als einen locationManager geben wird. Mehrere locationManager können dieselbe Region überwachen, die mehrere Benachrichtigungen verursachen kann.

  3. Nach dem Aufruf [manager startMonitoringForRegion:region]; wird die Region nicht sofort überwacht. Wenn Sie mir nicht glauben, glauben, versuchen Sie den Folgecode: -

    [locationManager startMonitoringForRegion:region]; 
    NSLog(@"%@",locationManager.monitoredRegions); 
    

Sie werden feststellen, dass die Region, die Sie gerade nicht in der locationManager.monitoredRegions sein überwacht wird. Da dies auf iOS-Ebene gehandhabt wird, denke ich, dass es einige Minuten dauern kann, bis die Region zur Überwachung bereit ist.

https://developer.apple.com/library/mac/documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html

Eine App auf 20 Regionen zu einer Zeit registrieren kann -:

Sie sollten auch andere Einschränkungen für Region Überwachung in iOS verstehen. Um Regionenänderungen rechtzeitig zu melden, erfordert der Regionsüberwachungsdienst Netzwerkkonnektivität.

In iOS 6 funktionieren Regionen mit einem Radius zwischen 1 und 400 Metern besser mit auf iPhone 4S oder neueren Geräten. (In iOS 5 funktionieren Regionen mit einem Radius zwischen 1 und 150 Metern besser auf iPhone 4S und neueren Geräten.) Auf diesen Geräten kann eine App innerhalb von 3 bis 5 Minuten erwarten, dass die entsprechende Region oder die Region-Exited-Benachrichtigung angezeigt wird auf Durchschnitt, wenn nicht früher.

Hinweis: Apps können eine Benachrichtigung erhalten, sobald sich das Gerät 500 Meter von der vorherigen Benachrichtigung entfernt. Es sollte nicht öfter als einmal alle fünf Minuten Benachrichtigungen erwarten. Wenn das Gerät Daten aus dem Netzwerk abrufen kann, sendet der Standortmanager viel wahrscheinlicher Benachrichtigungen zeitnah.

Ich weiß nicht, was Ihre App ist, ich glaube, Sie sollten den Fluss Ihrer App neu gestalten. Sie sollten versuchen, die Region außerhalb der Delegate-Methoden zu überwachen.

Für weitere Informationen über die Singleton LocationManager, können Sie diese Antwort überprüfen: Background Location Services not working in iOS 7. Es gibt ein komplettes Projekt auf GitHub, das eine Singleton LocationManager-Klasse enthält, die ich LocationTracker nannte.

könnten Sie auch iOS eine Störung für Region Überwachung prüfen wollen 7, die ich vor einem Monat fand heraus (mit einer Vermeidung des Problems die Panne zu lösen): Region Monitoring Glitch on iOS 7 - Multiple Notifications at the same time

+0

Ich weiß, dass es lange Zeit zu dieser Frage war, aber im Geofencing habe ich ein Problem. Ich habe einen Radius von 100 Metern gewählt, und bei der Ausfahrt sollte eine Benachrichtigung erfolgen. Aber ich bekomme eine Benachrichtigung auf/rund 250 Metern. Bitte hilf mir. –

+0

wenn ich nur eine buiding region überwachen will, wie kann ich es einstellen.Wenn ich die Koordinaten von google map bekomme funktioniert? – Lydia

+0

upvoted! Ich stimme zu, dass die Überwachung von RegionMonitoring, SLC, Visit auf der Betriebssystemebene verwaltet wird. Ich * denke * es ist nicht mehr wie du gesagt hast. Ab iOS 10, iPhone6, wenn ich '[locationManager startMonitoringForRegion: region]; NSLog (@ "% @", locationManager.monitoredRegions); "Ich ** sehe es sofort. – Honey

0

Die befriedigende Antwort auf die Delegierten Methoden (didEnterRegion und didExitRegion) wird nicht aufgerufen, apple docs sagt, dass Sie nach 3 bis 5 Minuten nach der Eingabe oder dem Verlassen benachrichtigt werden, aber beim tatsächlichen Testen, was ich gefunden habe, müssen Sie ca. 7 bis 8 Minuten warten.

Ich testete es für 10 bis 15 Mal und meine Region Radius war rund 80 Meter. Ich kratzte mich am Kopf, um zu sehen, was schief gelaufen war. Ich habe den Simulator mit der Ortungsverfolgung geöffnet (Verwendet eine GPX-Datei für die Standortsimulation). Nach 8 Minuten wurde didExitRegion aufgerufen.

Auch wenn Sie dies im Hintergrund tun möchten, müssen Sie Hintergrundmodi auf Ihrem Ziel aktivieren. enter image description here

+0

Ich weiß, dass es lange Zeit zu dieser Frage war, aber in Geofencing habe ich ein Problem. Ich habe einen Radius von 100 Metern gewählt, und bei der Ausfahrt sollte eine Benachrichtigung erfolgen. Aber ich bekomme eine Benachrichtigung auf/rund 250 Metern. Bitte hilf mir. –

+1

Hallo @UmangKothari ich bin konfrontiert mit dem Problem in Geofencing Start und Beenden Methoden rufen nie, können Sie bitte geben Sie keine Beispielcodes oder Beispiele –

+0

stackoverflow.com/questions/24165599/region-monitoring-current-location-doesnt-notify-on -exit/28315050? noredirect = 1 # Kommentar59114556_28315050 –

Verwandte Themen