2014-06-10 17 views
5

Ich habe eine App aus, die Beacon-Regionen registriert und startet diese Regionen Überwachung mit CLLocationManagerIBeacon - didEnterRegion nicht aufgerufen wird, wenn app in der Region beginnt

CLLocationManager *manager = [[CLLocationManager alloc] init]; 
manager.delegate = self; 

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:estimoteUUID major:12445 identifier:@"id"]; 
region.notifyEntryStateOnDisplay = YES; 
region.notifyOnEntry = YES; 
[manager startMonitoringForRegion:region]; 

Dies funktioniert gut, wenn ich weit genug von einer Bake und zu Fuß gehen zurück in den Bereich. Allerdings möchte ich auch die Delegate-Methode didEnterRegion auslösen, wenn ich die App bereits im Bereich der Beacon-Region starte, nicht nur wenn ich wieder in die Grenze komme. Gibt es einen einfachen Weg, dies zu erreichen? Oder eine Möglichkeit, den CLLocationManager zu denken, dass wir den Beacon-Bereich verlassen haben?

Ein anderer Beitrag sagte, dass Einstellung region.notifyEntryStateOnDisplay = YES; und Drücken der Halte-Taste würde dies tun - aber ich habe nicht funktioniert (iOS 7.1, iPhone 5S).

Antwort

0

berechnen Sie den Wert in Meter nach Benutzer aktuelle Position mit Start-und Endpunkt der Beacon, die in Beacon komplette Funkgeräte sein sollte, dann didEnterRegionto gewaltsam oder tun, was auch immer Sie tun möchten.

+0

Diese Antwort nichts mit dem zu tun hat, was OP gefragt, die über IBeacon Region Überwachung war. Auch wenn es nicht iBeacon ist, sollten Sie die Bereichsüberwachung verwenden, anstatt die Entfernung manuell zu berechnen. –

0

Versuchen Sie, diese Zeile nach startMonitoringForeRegion:: [self.locationManager requestStateForRegion:region]; einzufügen.

+0

das scheint nicht zu funktionieren – Tys

+0

Also @Tys ist es sehr seltsam, weil Ihr Code scheint in Ordnung zu sein. Ich habe mit Estimote Beacons gearbeitet und sie haben gut funktioniert. Warum verwenden Sie nicht ihr [SDK] (https://github.com/Estimote/iOS-SDK)? – cojoj

+0

Ich verwende ihr SDK in anderen Teilen - ich dachte nur, ich würde den nativen Code für diese Frage zeigen, also war es nicht spezifisch für Estimote SDK. Versteh mich nicht falsch, die Beacons funktionieren gut. Ich möchte nur einen DidEnterRegion Callback bekommen, wenn ich die App starte, während ich bereits in der Region bin :) – Tys

2

von der Apple-Dokumentation:

Überwachung einer geografischen Region beginnt unmittelbar nach Registrierung für autorisierte Anwendungen. Erwarten Sie jedoch nicht, sofort ein Ereignis zu erhalten, da nur Grenzübergänge ein Ereignis generieren. Insbesondere Wenn sich der Standort des Benutzers zur Registrierungszeit bereits in der Region befindet, generiert der Standortmanager nicht automatisch ein Ereignis. Stattdessen muss Ihre App darauf warten, dass der Benutzer die Bereichsgrenze überschreitet, bevor ein Ereignis generiert und an den Delegaten gesendet wird. Um zu überprüfen, ob sich der Benutzer bereits innerhalb der Grenze einer Region befindet, verwenden Sie die requestStateForRegion: -Methode der CLLocationManager-Klasse .

So landete ich tun dies:

#import "ViewController.h" 

@interface ViewController() 
@property (nonatomic, strong) NSDictionary *regionDictionary; 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // setup regions in case you have multiple regions 
    self.regionDictionary = @{@"com.test" : @"2FAE2A83-1634-443B-8A0C-56704F81A181"}; 

    // setup location manager 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 

    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
     [self.locationManager requestAlwaysAuthorization]; 
    } 

    [self.locationManager startUpdatingLocation]; 

    //start monitoring for all regions 
    for (NSString *key in self.regionDictionary.allKeys) { 
     CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[key]] identifier:key]; 
     [self.locationManager startMonitoringForRegion:beaconRegion]; 
    } 
} 

- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion *)region { 
    if (region.identifier.length != 0) { 
     CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[region.identifier]] identifier:region.identifier]; 
     [self.locationManager startRangingBeaconsInRegion:beaconRegion]; 
    } 
} 

- (void)locationManager:(CLLocationManager*)manager didExitRegion:(CLRegion *)region { 
    if (region.identifier.length != 0) { 
     CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[region.identifier]] identifier:region.identifier]; 
     [self.locationManager stopRangingBeaconsInRegion:beaconRegion]; 
    } 
} 

- (void)locationManager:(CLLocationManager*)manager didRangeBeacons:(NSArray*)beacons inRegion:(CLBeaconRegion*)region { 
    // Beacon found! 
    CLBeacon *foundBeacon = [beacons firstObject]; 
    NSLog(@"UUID:%@; major:%@; minor:%@;", foundBeacon.proximityUUID.UUIDString, foundBeacon.major, foundBeacon.minor); 
} 

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { 
    if ([region isKindOfClass:[CLBeaconRegion class]] && state == CLRegionStateInside) { 
     [self locationManager:manager didEnterRegion:region]; 
    } 
} 

- (void)locationManager:(CLLocationManager *) manager didStartMonitoringForRegion:(CLRegion *) region { 
    [manager requestStateForRegion:region]; 
}