Настройка geofencing-уведомлений для 1С-Битрикс
Геофенсинг — триггер, срабатывающий при входе пользователя в заданную географическую зону или выходе из неё. В контексте Битрикса это чаще всего push-уведомление мобильного приложения: «Вы рядом с нашим магазином — сегодня скидка 10%».
Из чего состоит решение
Геофенсинг не реализуется силами только серверной части Битрикса. Нужны три компонента:
- Мобильное приложение (iOS/Android) с фоновым мониторингом геолокации — регистрирует зоны и отправляет события на сервер
- Серверный API на Битриксе — принимает события входа/выхода, принимает решение об отправке уведомления
- Push-инфраструктура — Firebase Cloud Messaging (FCM) для Android, APNs для iOS
Браузерный геофенсинг через Geolocation API работает только при открытой вкладке, поэтому для полноценных уведомлений нужно именно мобильное приложение.
Регистрация геозон на стороне приложения
Нативные SDK обоих платформ поддерживают геофенсинг:
-
Android:
com.google.android.gms.location.GeofencingClient(Geofencing API Google Play Services) -
iOS:
CLLocationManagerс методомstartMonitoring(for: CLCircularRegion)
Приложение загружает список зон при старте с сервера Битрикса и регистрирует их в системе. При входе/выходе ОС генерирует событие — приложение отправляет POST-запрос на ваш API.
API на стороне Битрикса
Создаёте REST-эндпоинт /local/ajax/geofence-event.php, который принимает события:
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
$data = json_decode(file_get_contents('php://input'), true);
$userId = (int)$data['user_id'];
$zoneId = (int)$data['zone_id'];
$eventType = $data['event']; // 'enter' или 'exit'
$deviceToken = $data['device_token'];
if ($eventType === 'enter') {
\Local\Geofence\NotificationService::sendEnterZoneNotification(
$userId,
$zoneId,
$deviceToken
);
}
Хранение геозон
Для хранения зон удобен HL-инфоблок GeoZones:
| Поле | Тип | Описание |
|---|---|---|
UF_NAME |
Строка | Название зоны |
UF_LAT |
Дробное | Широта центра |
UF_LNG |
Дробное | Долгота центра |
UF_RADIUS |
Целое | Радиус в метрах |
UF_NOTIFICATION_TEXT |
Текст | Текст push-уведомления |
UF_ACTIVE |
Флаг | Активна ли зона |
Отправка push через FCM
namespace Local\Geofence;
class NotificationService {
private const FCM_URL = 'https://fcm.googleapis.com/fcm/send';
public static function sendEnterZoneNotification(
int $userId,
int $zoneId,
string $deviceToken
): void {
$zone = \Local\Geofence\GeoZoneTable::getById($zoneId)->fetch();
if (!$zone || $zone['UF_ACTIVE'] !== true) return;
$payload = [
'to' => $deviceToken,
'notification' => [
'title' => 'Вы рядом с нами',
'body' => $zone['UF_NOTIFICATION_TEXT'],
],
];
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Authorization', 'key=' . FCM_SERVER_KEY);
$http->setHeader('Content-Type', 'application/json');
$http->post(self::FCM_URL, json_encode($payload));
}
}
Ограничения и антиспам
Без ограничений пользователь, проходящий мимо магазина несколько раз в день, получит столько же уведомлений. Добавляете cooldown: логируете отправленные уведомления в таблицу b_user_counter или HL-инфоблок, и повторно не отправляете, если с прошлого уведомления по этой зоне прошло менее N часов.
| Этап | Время |
|---|---|
| Проектирование структуры зон и API | 3–4 ч |
| Разработка серверного API | 6–10 ч |
| Настройка FCM / APNs | 2–3 ч |
| Интеграция в мобильное приложение | 8–16 ч |
| Логика cooldown и антиспама | 2–4 ч |







