是的,你可以这样做。诀窍是您需要同时结合测距和监控。需要监控才能将您的应用程序启动到后台。需要测距才能获取您看到的信标的特定 ID。
像这样设置它:
CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"blah"];
region.notifyOnEntry = YES;
[self.locationManager startMonitoringForRegion:region];
[self.locationManager startRangingBeaconsInRegion:region];
一旦发生这种情况,您将在应用程序重新进入睡眠状态之前收到大约五秒钟的测距回调,并且此方法将每秒调用一次:
-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
if (!_firstOneSeen) {
_firstOneSeen = true;
// Do something with beacons array here. read out the major/minor and get the
// notification message from your XML web service
}
}
两个注意事项:
在后台监控 iBeacon 区域可能有点棘手,而且获得回调所需的时间可能比您想象的要长。请参阅此详细讨论。
从您的应用程序被唤醒到重新进入睡眠状态,您只有五秒钟的时间,因此您的网站可以更好地快速响应。一个可以跨网络丢失工作的更安全的想法是预先获取 XML 并将其缓存在您的应用程序中,以便即使存在网络丢失也可以使用。
我的公司 Radius Networks 制作了一个名为ProximityKit的库和 Web 服务,它可以预先缓存特定于信标的键/值对,您可以使用 Web 浏览器配置这些键/值对。这样,您不必自己编写 Web 服务。