Подтвердить что ты не робот

Отслеживание нескольких (20+) местоположений с помощью geofencing iOS

Приложение iOS использует геообъект для уведомления пользователя о предопределенных соседних местоположениях. Приложение может пропустить некоторое место (пользователь не получает уведомление о ближайшем местоположении), но желательно сохранить недостающую скорость.

Одним из способов реализации этого является запуск мониторинга для значительных местоположений изменений с помощью startMonitoringSignificantLocationChanges, и каждый раз, когда происходит событие изменения местоположения, ищите места внутри радиуса 500 м от зарегистрированного местоположения.

Меня беспокоит требование выполнять запрос для соседних регионов каждый раз, когда происходит существенное изменение местоположения, и оно влияет на батарею.

Другой способ сделать это - зарегистрировать местоположения с помощью startMonitoringForRegion, но Apple установила (разумное) ограничение количества одновременно отслеживаемых регионов, которое составляет 20, и у нас есть значительно более 20 местоположений. Поэтому требуется какое-то динамическое обновление отслеживаемых регионов, но я все еще не уверен, что это лучший способ сделать это.

Любые идеи о том, как это можно сделать так, чтобы он сохранял низкое потребление энергии, но также имел низкий коэффициент пропускания для местоположений?

4b9b3361

Ответ 1

Поскольку в этом вопросе не было большой активности, я опишу, как мы в настоящее время решаем эту проблему.

Мы связали перезагрузку новых регионов с событиями значительного изменения местоположения (SLC). Когда происходит SLC, мы проверяем наличие 20 соседних областей, которые должны быть "геофотографированы". Чтобы найти 20 ближайших областей, мы просто приближаемся к 1 '' широты и долготы в соответствии со следующими формулами:

Широта: 1 град = 110,54 км

Долгота: 1 град = 111.320 * cos (широта) км

и просто проверьте ограничивающий квадрат текущего положения устройства для центров контролируемых областей (см. Простые вычисления для работы с расстоянием lat/lon + km?)

Итак, например, если (10N, 10E) является текущим местоположением устройства, мы начинаем с ограничивающего квадрата с вершинами в (10-1 ', 10-1'), (X-10 ', 10 + 1 '), (10 + 1', 10 + 1 '), (10 + 1', 10-1 ') (на широте (10N, 10E) одна широта/долгота минута приблизительно 1,85 км).

Если есть 20 (или почти 20), мы регистрируем их для геообработки и ожидаем следующего SCL. Если меньше/больше, просто увеличьте/уменьшите размер ограничивающего прямоугольника и повторите поиск.

Вы можете настроить этот алгоритм поиска на лучшую производительность, но описанная здесь работа уже выполнит работу.

Ответ 2

Вы можете зарезервировать место для "метагеоценности", охватывающее все контролируемые в настоящее время местоположения. Когда пользователь покинет этот геозон, приложение будет уведомлено. Затем приложение может обновить себя и перестать отслеживать самые дальние районы и начать отслеживать новые области поблизости.

Ответ 3

Я думал, что добавлю еще один вариант использования более 20 Geofences в вашем приложении. Этот способ уже давно работает в нашем приложении и использует встроенные методы CLLocation.

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    if (locations.count > 0) {
        CLLocation *location = locations[0];

        NSMutableArray *sortedFences = [[NSMutableArray alloc] init];

        // add distance to each fence to be sorted
        for (GeofenceObject *geofence in enabledFences) {
            // create a CLLocation object from my custom object
            CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(geofence.latitude, geofence.longitude);
            CLLocation *fenceLocation = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
            // calculate distance from current location
            CLLocationDistance distance = [location distanceFromLocation:fenceLocation];
            // save distance so we can filter array later
            geofence.distance = distance;
            [sortedFences addObject:geofence];
        }

        // sort our array of geofences by distance and add we can add the first 20

        NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
        NSArray *sortedArray = [sortedFences sortedArrayUsingDescriptors:sortDescriptors];

       // should only use array of 20, but I was using hardcoded count to exit

        for (GeofenceObject *geofence in sortedArray) {
            CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(geofence.latitude, geofence.longitude);
            CLLocationDistance radius = geofence.radius;
            NSString *ident = geofence.geofenceId;

            CLCircularRegion *fenceRegion = [[CLCircularRegion alloc] initWithCenter:coordinate radius:radius identifier:ident];
            fenceRegion.notifyOnEntry = geofence.entry;
            fenceRegion.notifyOnExit = geofence.exit;
            [locationController.locationManager startMonitoringForRegion:fenceRegion];
        }
    }
}

Надеюсь, это поможет кому-то или направит их по правильному пути.

Ответ 4

Если вас беспокоит выполнение проверки близости при каждом существенном изменении местоположения, вы можете использовать метод пространственного индексирования/поиска, например R-tree или R * -tree, чтобы уменьшить количество сравнений, необходимых для каждого изменения местоположения, поскольку эти алгоритмы поиска будут отфильтровывать (возможно, большие) пространственно-несоответствующие регионы, Это должно уменьшить время/заряд батареи, необходимый для проведения проверок близости.

Ответ 5

Я знаю, что этот пост старый, но для тех, кто хочет сделать что-то подобное, Skyhook предлагает возможность геозонности бесконечного числа центры.

От их маркетинга: Skyhooks Context Accelerator позволяет разработчикам приложений и рекламодателям мгновенно развертывать Infinite Geofences в любой торговой сети (например, CVS) или в категории места проведения (например, в магазинах товаров) через простой веб-интерфейс. Используя ту же запатентованную технологию из сети локальных местоположений Skyhooks, SDK Context Accelerator управляет этими активными геообъектами на устройстве, независимо от ограничений ОС, позволяющих бесконечное геообложение.