我从Roximity获得了一些信标,从我收集到的信号中,所有的Roximity信标都具有相同的UUID.我知道我可以使用[locationManager:didRangeBeacons:inRegion:]来获取主要和次要值,但是如果我设置[locationManager didEnterRegion]来发送推送通知,并且我的用户走过另一个与其他人相关的Roximity信标. app,如何在[locationManager didEnterRegion]中确定这个?
解决方法
你基本上有两个选择.
>定义您正在监控的区域,以便它们包含您的特定主要和次要编号.主要限制是iOS只允许您同时监控20个区域,这意味着您只能为20个不同的iBeacons执行此操作:
CLBeaconRegion *region1 = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"8deefbb9-f738-4297-8040-96668bb44281"] major:1201 minor:3211 identifier:@"beacon1"]; [_locationManager startRangingBeaconsInRegion:region1]; CLBeaconRegion *region1 = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"8deefbb9-f738-4297-8040-96668bb44281"] major:1798 minor:2122 identifier:@"beacon2"]; [_locationManager startRangingBeaconsInRegion:region2]; ...
>仅基于UUID监视区域,但同时也在同一区域上进行测距.您将看到针对您看到的每个特定iBeacon的测距回调. (即使在后台,您也会在进入区域后大约5秒钟获得此信息.)在测距回调中,您可以检查所看到的信标的主要/次要编号,并将它们与您拥有的信标列表进行比较.只有在看到匹配项时才会执行特定操作.如果您继续添加信标,则可能难以在应用中保持此列表最新,因此您可能希望使用像ProximityKit这样的Web服务,以便将您的iBeacon标识符列表存储在云中.
-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { for (CLBeacon *beacon in beacons) { if ([self isMyBeaconWithMajor: beacon.major minor: beacon.minor]) { // Yes,this is my beacon! Do something special here } } } -(BOOL)isMyBeaconWithMajor: (NSNumber *)major minor: (NSNumber *)minor { // TODO: write code here that returns YES if the major and minor belong to you }
另一个最终的可能性(不可否认的是,你提出的问题)是使用带有自定义UUID的信标,这使事情变得更加容易.完全披露:我是一家公司,销售带有可定制标识符的iBeacons.