iBeacon监视和后台测距

我花了几个月的时间来开发一个基于iBeacons的应用程序,我感到非常沮丧。

总的想法是,当检测到信标时,通知用户特定于该信标的信息。

该应用程序devise如下,所有iBeacons具有相同的UUID,主要决定build设(博物馆,商店…)和次要的具体产品(图片,鞋…)。 所以这个应用程序可以为多个客户端

当应用程序启动时,我开始使用我们的UUID对区域进行监视和测距。 当应用程序在前台,所有的作品完美。 但是在后台或暂停状态下,问题就开始了。 测距不允许在背景或暂停状态。

我知道,当您进入或退出信标区域时,应用程序将被启动到后台大约5秒钟。 你可以在这里做五秒钟的时间,之后iOS会暂停你的应用程序。

我用这里学到的技术在后台扩展了3分钟。 我也得到一个额外的callbacknotifyEntryStateOnDisplay = YES;

但是,这是不够的,如果客户进入一个地区的应用程序在后台或暂停状态,他将被通知。 在额外的3分钟内,如果测距检测到另一个iBeacon,他将被通知,但是当3分钟后台任务过期时,如果没有区域出口被触发,他将不会再收到任何通知。

在这种情况下是否没有真正的解决scheme? 我认为这是一个非常普遍的情况,我很惊讶没办法处理它。

编辑:我试图find一个解决scheme,通过监测两个地区的build议大卫杨在他的回应。 为了获得更多的进入/退出地区的事件。

我添加了我实现的代码来尝试监视两个区域。

但是我做了不正确的事情,并做了RangeBeacons:InRegion:callback是每10毫秒发射预计是每秒。

AppDelegate.m ,我正在做didFinishLaunchingWithOptions:的以下内容didFinishLaunchingWithOptions:

 [self.locationManager startMonitoringForRegion:self.beaconRegion]; [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion]; [self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; [self.locationManager startMonitoringForRegion:self.beaconRegion2]; [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion2]; [self.locationManager startRangingBeaconsInRegion:self.beaconRegion2]; 

然后,在didRangeBeacons:InRegion:

 - (void) locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region{ if(beacons.count > 0){ [self.locationManager stopRangingBeaconsInRegion:region]; for (CLBeacon *beacon in beacons){ NSLog(@"beacon detected major: %@ minor: %@", beacon.major,beacon.minor); } [self.locationManager startRangingBeaconsInRegion:region]; } } 

当我在模拟器上运行应用程序,并且范围内的每个networking都有一个信标时,消息大约每10毫秒显示在控制台上。

我怀疑,停止并重新启动测距打破了预期的callbackstream程,但是当只有一个区域在范围内时,callback每秒发生如预期。

你所描述的问题很常见。 除了延长背景测距时间(你已经完成), iOS上没有魔术弹道

另外两个技巧可能会有帮助 这两种技术都涉及从一个信标到另一个信标时获得新的进入事件

  1. 获取硬件信标,使您能够调整发射机功率 (我公司的RadBeacon产品允许),使传输不重叠。 这样,当你从信标转到信标时,你会得到一个退出事件,然后是一个新的进入事件。

  2. 重新devise您的标识符schene,所以主要领域是致力于识别多达20个不同的地区 (基于UUID和主要1-20)。 然后你监控所有这些地区。 您的个人信标仍然可以使用未成年人,不pipe你想要什么,特别是作为触发信息的关键。 放置信标时,要确保没有重叠传输的信号共享相同的信号。 当你从一个移动到另一个时,这将确保一个新的背景input事件。

在后台工作的烽火台在iOS 8上工作得很好,只要你跳过所有的箍环。

首先,你需要正确的授权。 将密钥NSLocationAlwaysUsageDescription添加到Info.plist中,然后调用

 [self.locationManager requestAlwaysAuthorization]; 

您的应用必须具有Location UpdatesBackground Mode 。 在Info.plist中指定或通过function(与生成设置并行)。

然后检查applicationDidBecomeActive与授权

 switch([CLLocationManager authorizationStatus]) { ... 

一旦获得授权,您需要做:

 self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; // If you don't do this, location updates will pause after 15 minutes in the same place // Usually this is what you want, so I've left this line commented out // self.locationManager.pausesLocationUpdatesAutomatically = NO; // Create a NSUUID with the same UUID as the broadcasting beacon NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:kProximityUUID]; _beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"uk.co.airsource.testregion"]; // Necessary to get continued background ranging. // See https://community.estimote.com/hc/en-us/articles/203914068-Is-it-possible-to-use-beacon-ranging-in-the-background- _locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers; [_locationManager startUpdatingLocation]; [_locationManager startMonitoringForRegion:self.beaconRegion];