Может ли [LocationManager didEnterRegion] получить мажор и минор Маяка?
Я получил несколько маяков от Roximity, и из того, что я собрал, все маяки Roximity имеют один и тот же UUID. Я знаю, что могу получить главные и второстепенные значения с помощью [locationManager: didRangeBeacons: inRegion:]
, но если я настрою [locationManager didEnterRegion]
для отправки push-уведомления, и мой пользователь пройдет мимо другого маяка Roximity, который связан с чужим приложением, как я могу определить это в [locationManager didEnterRegion]
?
2 ответа:
У вас в основном есть два варианта.
Определите регионы, которые вы отслеживаете, чтобы они включали ваши конкретные главные и второстепенные числа. Основное ограничение заключается в том, что 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 , который позволяет хранить список идентификаторов 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 с настраиваемыми идентификаторами.
Вы можете определить мажор и минор с помощью этого кода:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{ CLBeaconRegion *r = (CLBeaconRegion *) region; NSLog(@"UUID %@, major %@, minor %@", r.proximityUUID, r.major, r.minor); [self myNotification:@"You are in the region"]; [self.locationManager startRangingBeaconsInRegion:r]; }