2013-12-14 22 views
3

я подготовил все необходимые вещи, чтобы настроить область радиомаяка:IBeacon: didRangeBeacons не вызывался при запуске приложения

// Create a NSUUID with the same UUID as the broadcasting beacon 
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"]; 
//raspberry pi:E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 
//estimote:B9407F30-F5F8-466E-AFF9-25556B57FE6D 

// Setup a new region with that UUID and same identifier as the broadcasting beacon 
self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
                   identifier:@"monaLisaBeacon"]; 

// Tell location manager to start monitoring for the beacon region 
[self.locationManager startMonitoringForRegion:self.myBeaconRegion]; 

Однако didRangeBeacons не всегда вызывается. Он вызывает только один раз, но затем перестает получать вызов.

ответ

0

Вы видите это только с помощью маяка с малиной Pi? Если это так, ваши рекламные объявления Pi могут быть отключены другим устройством, пытающимся связаться с ним. The Knock app for OSX is known to cause this problem, хотя другие приложения тоже могут это сделать.

Если это проблема, есть исправление, зарегистрированное в редакции для blog post, рассказывающее вам, как построить iBeacon из малины Pi. Вам нужно отредактировать стартовый IBeacon скрипт на Pi, чтобы изменить эту строку:

sudo hciconfig $BLUETOOTH_DEVICE leadv 0 

к:

sudo hciconfig $BLUETOOTH_DEVICE leadv 3 

В качестве альтернативы, вы можете попробовать просто перекрывая все, что приложение работает, который пытается установить Соединение Bluetooth LE с малиновой пи. Если вы не знаете, какое приложение это делает, это может быть сложно.

2

Вы уверены, что один раз был вызван didRangeBeacons? Он не будет вызываться, если вы просто вызываете startMonitoringForRegion. Когда вы вызываете startMonitoringForRegion, вы должны получить обратную связь в своем делете делегата locationManager в виде didDetermineState, didEnterRegion и didExitRegion. Что вам нужно сделать, в вашем методе didEnterRegion, вызовите startRangingBeaconsInRegion. Вот пример:

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { 
    if ([region isKindOfClass:[CLBeaconRegion class]]) { 
     CLBeaconRegion *beaconRegion = (CLBeaconRegion *)region; 

     //now start ranging 
     [_locationManager startRangingBeaconsInRegion:beaconRegion]; 
    } 
} 

Также не забудьте остановиться в пределах:

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
    if ([region isKindOfClass:[CLBeaconRegion class]]) { 
     CLBeaconRegion *beaconRegion = (CLBeaconRegion *)region; 

     //STOP ranging 
     [_locationManager stopRangingBeaconsInRegion:beaconRegion]; 
    } 
} 

Только если вы начинаете в диапазоне, ваш didRangeBeacons будет вызван.

Надеюсь, это поможет.

+0

решил проблему для меня. – gatoAlfa

2

Попробуйте следующий код:

// Create a NSUUID with the same UUID as the broadcasting beacon 
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"]; 
//raspberry pi:E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 
//estimote:B9407F30-F5F8-466E-AFF9-25556B57FE6D 

// Setup a new region with that UUID and same identifier as the broadcasting beacon 
self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
                   identifier:@"monaLisaBeacon"]; 

// Tell location manager to start monitoring for the beacon region 
[self.locationManager startMonitoringForRegion:self.myBeaconRegion]; 
[self.locationManager startRangingBeaconsInRegion:beaconRegion]; 

Вы должны начать в пределах маяки, а также сделать didRangebeacons называться.

Смежные вопросы