Может ли [LocationManager didEnterRegion] получить мажор и минор Маяка?


Я получил несколько маяков от Roximity, и из того, что я собрал, все маяки Roximity имеют один и тот же UUID. Я знаю, что могу получить главные и второстепенные значения с помощью [locationManager: didRangeBeacons: inRegion:], но если я настрою [locationManager didEnterRegion] для отправки push-уведомления, и мой пользователь пройдет мимо другого маяка Roximity, который связан с чужим приложением, как я могу определить это в [locationManager didEnterRegion] ?

2 6

2 ответа:

У вас в основном есть два варианта.

  1. Определите регионы, которые вы отслеживаете, чтобы они включали ваши конкретные главные и второстепенные числа. Основное ограничение заключается в том, что 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];
    ...
    
  2. Контролируйте область, основанную только на 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];
}