2014-06-10 11 views
5

ho fatto un app che registra le regioni beacon e inizia a monitorare queste regioni che utilizzano CLLocationManagerIBeacon - didEnterRegion non essere chiamato quando app inizia nella regione

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]; 

Questa grande opera quando cammino abbastanza lontano da un faro e passeggiata di nuovo in campo. Tuttavia mi piacerebbe anche che il metodo delegato didEnterRegion sparasse se avvii l'app già nel raggio della regione beacon, non solo quando torno nel confine. C'è un modo semplice per raggiungere questo obiettivo? O un modo per far credere a CLLocationManager che abbiamo lasciato la gamma di beacon?

Un altro post ha detto che l'impostazione di region.notifyEntryStateOnDisplay = YES; e la pressione del pulsante di sospensione lo farebbero, ma non funziona (iOS 7.1, iPhone 5S).

risposta

0

calcolare il valore in metri in base alla posizione corrente dell'utente con punto iniziale e punto finale del beacon che deve essere all'interno di radiofrequenze complete, quindi chiamato didEnterRegion in modo forzato o eseguire qualsiasi operazione che si desidera eseguire.

+0

Questa risposta non ha nulla a che vedere con quello che ha chiesto OP, che era di circa il monitoraggio regione IBeacon. Anche se non è iBeacon, è necessario utilizzare il monitoraggio della regione anziché calcolare manualmente la distanza. –

0

Provare a inserire questa riga dopo startMonitoringForeRegion:: [self.locationManager requestStateForRegion:region];.

+0

questo non sembra funzionare – Tys

+0

Quindi @Tys è molto strano perché il tuo codice sembra andare bene. Ho lavorato con Estimote Beacons e hanno lavorato bene. Perché non stai utilizzando il loro [SDK] (https://github.com/Estimote/iOS-SDK)? – cojoj

+0

Sto utilizzando il loro SDK in altre parti: ho pensato di mostrare il codice nativo per questa domanda, quindi non era specifico per Estimote SDK. Non fraintendermi, i fari funzionano bene. Vorrei solo ricevere una richiamata didEnterRegion quando avvii l'app mentre ero già all'interno della regione :) – Tys

2

Dalla documentazione di Apple:

Monitoraggio di una regione geografica inizia immediatamente dopo registrazione per le applicazioni autorizzate. Tuttavia, non aspettarti di ricevere immediatamente un evento , perché solo i passaggi a ostacoli generano un evento. In particolare, se la posizione dell'utente è già all'interno della regione al momento della registrazione, il gestore località non genera automaticamente un evento. . Invece, l'app deve attendere che l'utente attraversi il limite dell'area prima che un evento venga generato e inviato al delegato . Per verificare se l'utente è già all'interno del confine di una regione, utilizzare requestStateForRegion: metodo della classe CLLocationManager .

Così ho finito per fare questo:

#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]; 
} 
Problemi correlati