2015-05-07 3 views
0

Я пытаюсь вызвать событие, основанное на iBeaconsIBeacon события в то время как экран выключен

Это прекрасно работает, когда приложение работает на переднем плане, фоне, но не приостановлено (экран выключен с кнопкой питания)

Я вижу сообщения NSLog, когда на экране блокировки, но не тогда, когда экран устройства выключен.

Есть ли способ сделать это? (Только соответствующий раздел)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"applicationDidFinishLaunching"); 

    _locationManager = [[CLLocationManager alloc] init]; 
    _locationManager.delegate = self; 

    [_locationManager requestAlwaysAuthorization]; 

    CLBeaconRegion *region; 

    region = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"EBEFD083-70A2-47C8-9837-E7B5634DF524"] major: 9 minor: 103 identifier: @"region1"]; 
    region.notifyEntryStateOnDisplay = YES; 
    region.notifyOnEntry = YES; 
    region.notifyOnExit = YES; 
    [_locationManager startMonitoringForRegion:region]; 
    [_locationManager startRangingBeaconsInRegion:region]; 

    return YES; 
} 

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region 
{ 
    if(state == CLRegionStateInside) { 
     NSLog(@"locationManager didDetermineState INSIDE for %@", region.identifier); 
    } 
    else if(state == CLRegionStateOutside) { 
     NSLog(@"locationManager didDetermineState OUTSIDE for %@", region.identifier); 
    } 
    else { 
     NSLog(@"locationManager didDetermineState OTHER for %@", region.identifier); 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region 
{ 
    if (beacons.count > 0) 
    { 
     NSLog(@"locationManager didRangeBeacons: %@",beacons.description); 
    } 
} 

Info.plist::

AppDelegate.m

 <key>NSLocationAlwaysUsageDescription</key> 
     <string>app location requested</string> 
     <key>UIBackgroundModes</key> 
     <array> 
      <string>location</string> 
      <string>voip</string> 
      <string>bluetooth-peripheral</string> 
      <string>bluetooth-central</string> 
      <string>external-accessory</string> 
     </array> 
+0

Вы можете попробовать добавить «Privacy - Location Описание использования» ключ к файлу Plist (если вы еще не добавили его еще). – 4esterUA

ответ

3

Set pausesLocationUpdatesAutomatically свойство LocationManager в "NO", С это свойство установлено в НЕТ служб определения местоположения никогда не отключается. Но вы должны быть осторожны, поскольку установка этого свойства в NO значительно увеличивает потребление энергии устройством.

+0

Спот-он! Однако любые системные вызовы выполняются, когда приложение заблокировано. – Ryan

1

Хотя мониторинг радиомаяка (didEnterRegion: и didExitRegion:) работает в фоновом режиме, маяка в диапазоне (didRangeBeacons:inRegion:) работает только тогда, когда приложение находится на переднем плане, и в течение ограниченного времени в фоновом режиме. Эти фоновые ограничения включают в себя пять секунд после того, как приложение проснулось в фоновом режиме из-за события (например, экран блокировки поступает из-за вашей настройки region.notifyEntryStateOnDisplay = YES;)

Есть несколько трюков, которые вы можете сделать, чтобы получить дополнительное фонирование. Читайте здесь:

http://developer.radiusnetworks.com/2014/11/13/extending-background-ranging-on-ios.html

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