NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
Bearound Flutter SDK - Beacon detection and proximity tracking
Last release 7 days ago
30 Sep 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 40 of 43 stable releases
Nothing withdrawn
no release was ever pulled
1 years old
43 releases · first in 2025
One column per month.
chore(release): pin native 3.14.0 by @jottasystem in #86
Full Changelog: v3.13.0...v3.14.0
Fixa os SDKs nativos 3.14.0 (CocoaPods e JitPack).
com.apple.developer.networking.wifi-info) e localização
Always no app. Nenhuma permissão nova. Desliga pelos mesmos controles da detecção de visita.feat(readiness): expose the native detection readiness by @jottasystem in #82
Full Changelog: v3.12.0...v3.13.0
Fixa os SDKs nativos 3.13.0 (CocoaPods e JitPack), que desenham o push rico.
BearoundFlutterSdk.getDetectionReadiness(): o que esta instalação consegue detectar,
em um valor só ([DetectionReadiness]): full, backgroundBle, foregroundOnly, blind.
Um valor em vez de cruzar getAuthorizationStatus() com precisão de localização,
permissão de Bluetooth e os background modes do Info.plist. wakesWhenTerminated e
needsAppOpen respondem direto as duas perguntas que o app costuma fazer. Sinal de iOS
(SDK nativo 3.12.0 ou superior); no Android retorna DetectionReadiness.unknown em vez de
lançar.PLAY é um vídeo de verdade (MP4 de até 15 MB e 30 s, com imagem de capa). No iOS a
Service Extension baixa o MP4 e anexa à notificação; ao expandir, o player do sistema
toca o vídeo. No Android a notificação expandida mostra quadros do próprio vídeo e o toque
abre o player em tela cheia do SDK; em rede tarifada ou com Economia de dados ligada, o
SDK mostra a capa e o vídeo toca no toque.handleRemoteMessage.
Encaminhe também em foreground (FirebaseMessaging.onMessage), não só no handler de
background: sem isso, um push rico recebido com o app aberto não aparece.pod 'BearoundSDKNotificationExtensions' nos dois. É um pod separado, com módulo
próprio, então funciona com o use_frameworks! do Podfile do Flutter sem colidir com o
BearoundSDK do app. Cada extensão é uma subclasse
de uma linha (BearoundNotificationService, BearoundNotificationViewController) e o
Info.plist da Content Extension declara as categorias BEAROUND_IMAGE,
BEAROUND_TWO_IMAGES e BEAROUND_CAROUSEL. A Content Extension desenha só a imagem,
as duas imagens e o carrossel. Não declare BEAROUND_PLAY: a extensão que assume uma
categoria substitui a view do sistema, e no PLAY a view do sistema é o player de vídeo.
Sem as extensões o aparelho continua recebendo a notificação padrão (título e texto).feat(example): request ATT from the example app by @jottasystem in #80
Full Changelog: v3.10.0...v3.12.0
Fixa os SDKs nativos 3.12.0 (CocoaPods e JitPack). A 3.11.0 do bridge não foi publicada; o conteúdo dela sai nesta versão.
errorStream entregava só
message, texto localizado no idioma do device. Um app Flutter de cliente em campo
(iPhone XR, iOS 18.7.2) registrou "A operação não pôde ser concluída. (kCLErrorDomain erro 4.)" como não-fatal, sem nada para classificar nem ação a tomar. O bridge iOS agora manda
também domain e code, e BearoundError expõe os dois. message continua igual: nunca
case nele.collectLocation: false. Requisitos no aparelho:
Sempre e precisão total (o mesmo par que o despertador por região
já exige). Para visita o SDK usa no máximo 11 regiões (10 ambientes e a cerca de
atualização), além da região de beacon, e sempre deixa 5 das 20 do iOS livres para o
app; o prefixo bearound.visit. é reservado a ele.ACCESS_BACKGROUND_LOCATION declarada pelo app e concedida pelo
usuário, usa geofence nativa e detecta com o app fechado. Sem ela, só detecta com o app
aberto (o Android não entrega localização em background sem essa permissão). O SDK não
declara a permissão: a decisão, e a revisão da Play Store que vem com ela, é do app.com.google.android.gms:play-services-location:21.3.0.BearoundError.domain e BearoundError.code: nulos quando a plataforma não manda
(Android, que não tem o conceito).BearoundError.isLocationAlwaysRequired: o único erro que é estado de permissão, não
falha. O iOS recusou armar o region monitoring porque o app não tem Sempre
(BeAroundSDK#11 a partir do nativo 3.12.0, kCLErrorDomain#4 antes dele). A
detecção continua pelo Bluetooth enquanto o app está vivo, mas não há acorde para app
em background ou encerrado. Trate como convite a pedir Sempre (ou a mandar o usuário para
os Ajustes), não como crash.handleRemoteMessage do plugin; no Android os dois vêm do
handleRemoteMessage e do intent da activity aberta pelo toque. Novo
BearoundFlutterSdk.trackNotificationOpened(data) para apps que tratam o toque antes do SDK
(por exemplo onMessageOpenedApp); chamar a mais é inofensivo, cada push conta uma vez.
No Android, chame-o também com getInitialMessage(): no cold start o configure() do Dart
roda depois da activity aberta pelo toque.ci: let the release job create the GitHub Release by @jottasystem in #72
Full Changelog: v3.8.3...v3.10.0
Fixa os SDKs nativos 3.10.0 (CocoaPods e JitPack). A 3.9.0 do plugin não chegou ao pub.dev; o conteúdo dela (seção abaixo) sai nesta versão.
configure(): o app chama
BearoundFlutterSdk.requestTrackingAuthorization() no momento que escolher. Sem essa
chamada (ou uma equivalente do próprio app), o aparelho fica em notDetermined e o payload
segue sem IDFA.com.google.android.gms.permission.AD_ID. Coletar o advertising ID no Android passa a
ser decisão do app: ele inclui play-services-ads-identifier (a 18.x já declara AD_ID) ou
declara a permissão no próprio manifest. Sem ela, a partir do targetSdk 33 o payload segue
sem AAID.configure(requestTrackingOnStart:): aceito para não quebrar a compilação, mas ignorado e
não enviado ao nativo.3.8.3; agora reporta a versão do plugin.The iOS Bluetooth alert no longer pops up over other apps (BearoundSDK 3.8.2). Both CBCentralManager instances in the native iOS SDK were created with
CBCentralManager instances in the native iOS SDK were created withoutCBCentralManagerOptionShowPowerAlertKey, which defaults to true: with the radio off orrequestPermissions() no longer asks for ACCESS_BACKGROUND_LOCATION on Android. Google Play requires the host app to show a prominent disclosure before
requestPermissions() no longer asks for ACCESS_BACKGROUND_LOCATION on Android.
Google Play requires the host app to show a prominent disclosure before any
background-location request, and the SDK asking on its own took that ordering away: the
system screen appeared regardless of what the user answered to the app's disclosure —
including when they declined — which also makes the demonstration video Play requires
impossible to record honestly. It is now opt-in:
await BearoundFlutterSdk.requestPermissions(includeBackgroundLocation: true);This changes behaviour. Without that flag a backgrounded app stops receiving Wi-Fi
access points (wifis[] arrives empty, with no error — Android returns the placeholder
BSSID 02:00:00:00:00:00). If your app already shows a disclosure and wants the
access-point map in background, pass true after showing it. Beacon detection, encounters,
location and the presence heartbeat are unaffected — on Android 12+ the scan runs on
BLUETOOTH_SCAN alone. This matches the React Native SDK, which already required an
explicit opt-in.
requestPermissions() was "a no-op that returns true" on Android. ThatBLUETOOTH_SCAN,BLUETOOTH_CONNECT, foreground location, notifications and (13+) NEARBY_WIFI_DEVICES.Debug notifications went silent on a background relaunch. The switch could only be flipped from Dart, and both Dart-side paths need the engine running
encounter_mesh andpresence_heartbeat never reaching the payload — until now every beacon-less upload wasCo-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
configure() parameters
periodicReconciliationEnabled (default true), periodicReconciliationInterval
(default 20 min) and periodicScanDuration (default 12s), forwarded to the native
SDKs (iOS BGAppRefreshTask, Android WorkManager). Best effort — the interval is a
minimum, never a guaranteed cadence. Out-of-range values are clamped by the native
SDKs with a highlighted log warning (interval floor 10 min iOS / 15 min Android,
ceiling 24 h; scan window 3-15s iOS / 3-30s Android).Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
goAsync() broadcast window, expedited one-shot sync worker with network constraint, periodic worker that awaits the upload. Field-validated on iPhone 17 Pro Max (iOS 27 beta): foreground launch→backend 14s; continuous seconds-level delivery in background; terminated wake delivering in the same second. No Dart API changes.Native SDKs bumped to the 3.6 line — iOS BearoundSDK 3.6.2 and Android bearound-android-sdk v3.6.1, carrying the full background/reliability package:
BearoundSDK 3.6.2 and Android bearound-android-sdk v3.6.1, carrying the full background/reliability package:
nil foreground / 0xBEAD background, pairs with beacon firmware v6) plus presence integrity — kernel region exits are confirmed before being propagated (no more false "left the zone" while parked next to a beacon), CLRegionState.unknown is preserved, cold relaunches survive until the region state resolves, and the Location-only permission profile (no Bluetooth) now detects and syncs end-to-end.fix: bump ErrorReporter _sdkVersion literal to 3.5.2 (release gate) (…
fix: bump ErrorReporter _sdkVersion literal to 3.5.2 (release gate) (…
Silent-push wake-up bridge (Android): BearoundFlutterSdk.handleRemoteMessage(data) — forward the FCM data message from your firebase_messaging backgro
Added
BearoundFlutterSdk.handleRemoteMessage(data) — forward the FCM data message from your firebase_messaging background handler to trigger an on-demand scan + sync (returns true only for Bearound wake-ups). See README → Silent-push wake-up (Android).Changed
Published on pub.dev.
BearoundFlutterSdk.handleRemoteMessage(Map<String, String> data) — forward the FCM data message from your firebase_messaging background handler and the SDK triggers an on-demand scan + sync (returns true only for Bearound wake-ups, marked bearound). See README → Silent-push wake-up (Android).withServices: nil + Service Data 0xBEAD match — beacons detect again; regression since 2.3.2) and Android v3.5.0 (silent-push wake-up + never-crash-the-host hardening).test(never-crash): make getPersistedLog telemetry test deterministic …
test(never-crash): make getPersistedLog telemetry test deterministic …
ErrorReporter). The plugin now captures uncaught Dart/Flutter errors originating in package:bearound_flutter_sdk (via chained FlutterError.onError + PlatformDispatcher.onError) and ships them fire-and-forget to POST https://ingest.bearound.io/sdk-errors, matching the Android native ErrorReporter contract (sdk.platform: "flutter"). Installed automatically on configure(). Ownership is decided by the first application frame (skipping the dart:/package:flutter runtime and the telemetry file itself) — only errors that ORIGINATE in the plugin are reported; a host error that merely passes through an SDK callback is never captured. Isolated transport (dart:io HttpClient, 5 s timeouts), in-memory rate limit (20/h) + 5 min dedupe, stack capped at 8000 chars, permission snapshot via permission_handler (read without prompting). The handlers are always chained (the previous FlutterError.onError is kept and invoked; PlatformDispatcher.onError returns false) so the host's error flow is never hijacked or broken. Native crashes keep being captured by the embedded native SDKs — this only adds the Dart layer they cannot see. No new dependency.BearoundFlutterSdk.setErrorReportingEnabled(bool) — public opt-out for the Dart-layer telemetry (default: enabled). No-op for native crash capture, which is independent.isIgnoringBatteryOptimizations(), openBatteryOptimizationSettings(), isAutostartManageable(), openManufacturerAutostartSettings() — exposes the native helpers to keep the process eligible to wake under Doze and aggressive OEM battery managers (Xiaomi/Huawei/Oppo/Vivo/OnePlus/Letv). No location, no Google Play policy impact (uses the Settings screen, not the restricted permission). No-op on iOS (no equivalent restriction).errorStream replay buffer. The wrapper now eagerly subscribes to the native error channel on the first errorStream access and buffers up to 16 errors emitted before the app's first listen(); the first listener receives them replayed in order. Fixes the class of bug where an error on the very first startScanning() (e.g. a permission/configuration failure) fired before the app attached its listener and was lost forever.setDebugNotificationsEnabled(bool) + configure(debugNotifications:) (iOS-only, default false) — QA aid that posts a visible local notification per silent-push-triggered scan. Silent no-op on Android. Keep false in production.PlatformDispatcher.onError now CHAINS a pre-existing host handler (e.g. Crashlytics) instead of silently replacing it — the previous handler is captured, always delegated to, and its return value honored; (2) the plugin's internal error-stream subscription gained an onError guard — an EventChannel failure no longer surfaces as an unhandled async error attributed to the SDK inside the host app (it is swallowed and reported to error telemetry via the new ErrorReporter.reportCaught); (3) telemetry reports were labeled with the previous version (3.4.4) — now 3.4.5. Doctrine: the SDK may fail silently, but it must NEVER crash the host — and every silent failure is reported to POST /sdk-errors.onMethodCall dispatch is now wrapped in a catch (Throwable) — the Flutter engine only converts RuntimeException into a PlatformException, so a linkage Error (e.g. NoSuchMethodError when the host's Gradle resolution downgrades the native SDK) used to kill the host process; it now surfaces as a catchable PlatformException (BEAROUND_INTERNAL). Same guard on onAttachedToEngine. (2) setDebugNotificationsEnabled gained the missing Android stub — it was documented as a silent no-op but actually threw MissingPluginException into the host. (3) getPersistedLog()/getPersistedLogRaw() no longer throw FormatException on malformed JSON from the native side (degrade to [] + report). (4) The Dart telemetry is installed BEFORE the native configure() call, so the session where configure itself fails — exactly the one that needs visibility — is covered. (5) PermissionService failures now report to /sdk-errors before returning false (silent for the host, visible to us). (6) The telemetry origin markers are anchored to the full package:bearound_flutter_sdk/ URI — a host file merely named after the SDK (e.g. bearound_flutter_sdk_helper.dart) can no longer have its errors misattributed to (and collected by) the SDK.AuthorizationStatus parsing (Android). The native side reports snake_case statuses (always, when_in_use, not_determined…); the Dart enum now parses them correctly instead of falling back to notDetermined, so getAuthorizationStatus() reflects the real permission state on Android.requestPermissions()/checkPermissions() semantics on Android 12+ (behavior change). Both now mirror the native 3.4.5 scan gate: only BLUETOOTH_SCAN ("Nearby devices") unlocks detection — location alone is no longer treated as sufficient, so an app that only holds location permissions now gets false where it previously got true. This reflects reality: since the manifest asserts neverForLocation, the OS never delivered scan results to the location-only path anyway; the old true was a false positive that masked "no beacons detected" complaints. On Android <12 the legacy location-based gate is unchanged.
Bumped native SDKs to 3.4.5 (Android + iOS). Android: DX audit + error telemetry + never-crash-the-host hardening (safe no-op on blank token; graceful degradation on devices without a Bluetooth radio) + two crash/robustness fixes — (1) a second FGS crash mode (ForegroundServiceStartNotAllowedException, started from the background on Android 14+; the 3.4.4 fix only covered the permission-missing SecurityException); (2) checkPermissions now requires BLUETOOTH_SCAN on Android 12+, so the location-only path stops attempting a scan the OS blocks (no more caught-SecurityException log spam). iOS: DX audit + error telemetry + never-crash-the-host hardening (CoreBluetooth state restoration gated on the host's bluetooth-central background mode) (BearoundSDK pin 3.4.2 → 3.4.5).
Bumped native Android SDK to 3.4.4. Brings two Android improvements to Flutter apps: (1) a crash fix — no more SecurityException /crash-loop when the
SecurityException/crash-loop when the user denies "Nearby devices" while foreground scanning is enabled on Android 14+; (2) background-reliability helpers (battery-optimization exemption + OEM autostart deep-links, no location, no Google Play policy impact). The crash fix is automatic (no Dart change); the reliability helpers are native-only for now. iOS pin unchanged (BearoundSDK 3.4.2).SecurityException/crash-loop when the user denies "Nearby devices" while foreground scanning is enabled on Android 14+; (2) background-reliability helpers (battery-optimization exemption + OEM autostart deep-links, no location, no Google Play policy impact). The crash fix is automatic (no Dart change); the reliability helpers are native-only for now (not yet exposed on the Flutter method channel).iOS: notificação local ao processar silent push. O plugin agora exibe uma notificação "Push → Scan" quando o SDK trata um silent push do backend (call
didCompletePushScan), espelhando o app nativo BeAroundScan. Depende da configuração de push no app cliente — ver a seção "Push notifications & background wakeup" no README.aps-environment, remote-notification no UIBackgroundModes, a desativação da UIScene (_UIApplicationSceneManifest) e o override do didReceiveRemoteNotification que contorna o flutter#155479. O example/ é a implementação de referência (validada em device iOS 26). SDK nativo inalterado (BearoundSDK 3.4.2).Android: removidas `USE_EXACT_ALARM` e `SCHEDULE_EXACT_ALARM` (via SDK nativo 3.4.2). O SDK não é app de "agenda"/"despertador" e não qualifica para a
USE_EXACT_ALARM e SCHEDULE_EXACT_ALARM (via SDK nativo 3.4.2). O SDK não é app de "agenda"/"despertador" e não qualifica para alarme exato no Google Play (a Play Console exige a remoção, senão pede a declaração de "Alarmes exatos"). O watchdog de scan passou a usar alarme inexato (setAndAllowWhileIdle) — o scan periódico (WorkManager + watchdog) continua funcionando, sem permissão de alarme exato. iOS não afetado.Push token à prova de ordem (SDKs nativos iOS/Android 3.4.1). setPushToken, quando o scan já está ativo e o token ainda não foi enviado, força um regi
setPushToken, quando o scan já está ativo e o token ainda não foi enviado, força um register na hora (beacons:[] + token) em vez de esperar o próximo sync. O token chega ao backend independente de o app chamar setPushToken antes ou depois de startScanning — antes, se o register-on-init já tivesse ocorrido, o device ficava sem push até o próximo register (TTL) ou até detectar um beacon.setPushToken do wrapper Android descartava o token (no-op herdado de quando o SDK Android não tinha o setter); agora chama BeAroundSDK.setPushToken (disponível no nativo Android ≥ 3.4.0), então o token fornecido pelo app chega ao backend. iOS já encaminhava.setPushToken: no iOS, prefira o token APNs cru (getAPNSToken()) — é o que o backend usa; o swizzle automático falha quando o Firebase está presente.Device register on init (via native SDKs 3.4.0). The device reports to the backend on startScanning() even before detecting a beacon, so it appears in
startScanning() even before detecting a beacon, so it appears in the Control Hub on first launch. No API change — handled by the native SDK.connectedDevice foreground service) with trade-offs, scan-window cadence, and a WorkManager note.android:label, localized by the device); subtitle is a generic, localized string ("Atualizando conteúdo" / "Updating content") — no Bluetooth or "reading data" wording. Clients can still override both.bearound-android-sdk, iOS BearoundSDK).Native SDKs bumped to 3.3.1 (both platforms). Three correctness fixes around BLE zone presence:
Native SDKs bumped to 3.3.1 (both platforms). Three correctness fixes around BLE zone presence:
lastBeaconSeenAt + grace bumped 60s → 300s.CLLocationManager() throwaways replaced with a single lifetime-scoped instance.Pins:
BearoundSDK 3.3.1com.github.Bearound:bearound-android-sdk:3.3.1No bridge-level changes — pure native bump. See native CHANGELOGs for root-cause details.
`configure()` API: replaced foregroundScanInterval and backgroundScanInterval (ForegroundScanInterval / BackgroundScanInterval enums) with a single un
configure() API: replaced foregroundScanInterval and backgroundScanInterval (ForegroundScanInterval / BackgroundScanInterval enums) with a single unified scanPrecision: ScanPrecision parameter, matching the native iOS/Android v2.4.0 API.
BearoundFlutterSdk.configure(businessToken: ..., foregroundScanInterval: ForegroundScanInterval.seconds15, backgroundScanInterval: BackgroundScanInterval.seconds30, maxQueuedPayloads: ...)BearoundFlutterSdk.configure(businessToken: ..., scanPrecision: ScanPrecision.medium, maxQueuedPayloads: ...)ForegroundScanInterval and BackgroundScanInterval enums have been removed. Migrate to ScanPrecision.high / medium / low.com.github.Bearound:bearound-android-sdk:2.4.0 (dropped legacy v prefix per JitPack cache compat)BearoundSDK ~> 2.4.0bearound_flutter_sdk/beacon_region — region enter/exit transitionsbearound_flutter_sdk/active_scan — active scanning toggle statebearound_flutter_sdk/location_capture — beacon-triggered GPS window lifecycle (started / completed)BearoundFlutterSdk:
beaconRegionStream → Stream<BeaconRegionEvent> (with isEnter / isExit helpers)activeScanStream → Stream<ActiveScanEvent> (isActive boolean)locationCaptureStream → Stream<LocationCaptureResult> (discriminated by isStarted / isCompleted)LocationCaptureResult, CapturedLocation, BeaconRegionEvent, ActiveScanEvent, ScanPrecision.For apps that spend most of their time outside any beacon region, this release drops CoreLocation + BLE active duty cycle to ~0 outside the region. Expect noticeable battery savings on users who carry the app but rarely encounter beacons.
Android: com.github.Bearound:bearound-android-sdk:v2.3.7
com.github.Bearound:bearound-android-sdk:v2.3.7BearoundSDK ~> 2.3.7Android: com.github.Bearound:bearound-android-sdk:v2.3.6
com.github.Bearound:bearound-android-sdk:v2.3.6BearoundSDK ~> 2.3.6Android: com.github.Bearound:bearound-android-sdk:v2.3.5
com.github.Bearound:bearound-android-sdk:v2.3.5BearoundSDK ~> 2.3.5Android: com.github.Bearound:bearound-android-sdk:v2.3.2
com.github.Bearound:bearound-android-sdk:v2.3.2BearoundSDK ~> 2.3.2Android: com.github.Bearound:bearound-android-sdk:v2.3.0
com.github.Bearound:bearound-android-sdk:v2.3.0BearoundSDK ~> 2.3.0BeaconProximity.bt value for beacons detected via Bluetooth scanning only, without CoreLocation/distance estimation.Nothing published for this version
Android: com.github.Bearound:bearound-android-sdk:v2.2.2
com.github.Bearound:bearound-android-sdk:v2.2.2BearoundSDK ~> 2.2.2iOS Permission Handling: Permissions are now requested via native Swift code using CLLocationManager.requestAlwaysAuthorization(), matching the behavi
CLLocationManager.requestAlwaysAuthorization(), matching the behavior of the iOS native SDK and React Native SDK. This eliminates the blue GPS indicator that appeared when using the location Flutter package.iOS: Blue GPS indicator no longer appears: Removed dependency on the location Flutter package for iOS. Permissions are now handled natively via MethodChannel, which prevents the continuous location updates that caused the blue GPS indicator to appear.
iOS: Permission flow aligned with native SDKs: The permission request now goes directly to "Always" authorization (like React Native and iOS native SDKs) instead of first asking for "When In Use" and then upgrading.
location package dependency: The location package is no longer used. iOS permissions are handled via native Swift code, and Android permissions continue to use permission_handler.iOS Plugin (BearoundFlutterSdkPlugin.swift):
CLLocationManagerDelegate conformancerequestPermissions method that calls requestAlwaysAuthorization() directlycheckPermissions method to verify current authorization statusRNBearoundBridge.swift implementationPermission Service (permission_service.dart):
MethodChannel to call native Swift permission methodspermission_handler packagecheckPermissions() method to the public APIRemoved `syncStream`: The countdown updates (secondsUntilNextSync, isRanging) have been removed to save battery. The native iOS SDK removed this callb
syncStream: The countdown updates (secondsUntilNextSync, isRanging) have been removed to save battery. The native iOS SDK removed this callback, and we're aligning all SDKs.SyncStatus model: No longer needed without syncStream.configure(), stops it, applies the new configuration, and restarts with correct periodic scan settings.configure() and startScanning() methods. The Android plugin now correctly redefines the listener to ensure beacon events are received even when the listener was previously overwritten by the Application class.android:usesPermissionFlags="neverForLocation" from BLUETOOTH_SCAN permission in example app manifest. This flag was blocking iBeacon detection since beacons require location services.willEnterForegroundNotification when starting scan in active state. This addresses a potential race condition where the BeaconManager might have been initialized with incorrect foreground state.configure() call in _startScan() method that was causing the scan to restart twice in rapid succession.com.github.Bearound:bearound-android-sdk:v2.2.1BearoundSDK ~> 2.2.1Both iOS and Android Plugins:
configure() to detect if SDK was already scanning (auto-restored)Android Plugin:
configure() and startScanning() methodsiOS Plugin:
willEnterForegroundNotification when starting scan in active stateisActiveScan with SDK state to handle auto-restored scanningSimplified Configuration: Bluetooth metadata and periodic scanning are now automatic. The enableBluetoothScanning and enablePeriodicScanning parameter
Simplified Configuration: Bluetooth metadata and periodic scanning are now automatic. The enableBluetoothScanning and enablePeriodicScanning parameters have been removed from the configure() method.
NEW Streams for Better Control:
syncLifecycleStream: Notifies when sync operations start and complete
onSyncStarted(beaconCount): Called before starting a synconSyncCompleted(beaconCount, success, error): Called after sync completesbackgroundDetectionStream: Notifies when beacons are detected in background
onBeaconDetectedInBackground(beaconCount): Called when beacons detected while app is in backgroundNew Models:
SyncLifecycleEvent: Represents sync lifecycle events with type, beaconCount, success, and error fieldsBackgroundDetectionEvent: Represents background detection events with beaconCountAutomatic Features:
Native SDKs Updated:
com.github.Bearound:bearound-android-sdk:v2.2.1BearoundSDK ~> 2.2.1Platform Improvements:
BeAroundSDKDelegate to BeAroundSDKListener (Android naming convention)did* to on* (e.g., didUpdateBeacons → onBeaconsUpdated)did* prefix (iOS convention)enableBluetoothScanning parameter from configure() method (now automatic)enablePeriodicScanning parameter from configure() method (now automatic)setBluetoothScanning() method (no longer needed)Before (v2.1.0):
await BearoundFlutterSdk.configure(
businessToken: 'your-token',
enableBluetoothScanning: true,
enablePeriodicScanning: true,
);
After (v2.2.0):
// Simpler configuration
await BearoundFlutterSdk.configure(
businessToken: 'your-token',
// Bluetooth metadata and periodic scanning are automatic
);
// NEW: Listen to sync lifecycle
BearoundFlutterSdk.syncLifecycleStream.listen((event) {
if (event.isStarted) {
print('📤 Sync started: ${event.beaconCount} beacons');
} else if (event.isCompleted) {
if (event.success == true) {
print('✅ Sync success: ${event.beaconCount} beacons sent');
} else {
print('❌ Sync failed: ${event.error}');
}
}
});
// NEW: Listen to background detections
BearoundFlutterSdk.backgroundDetectionStream.listen((event) {
print('🌙 Background: ${event.beaconCount} beacons detected');
});
Configurable Scan Intervals: SDK now supports separate foreground and background scan intervals with configurable retry queue.
Configurable Scan Intervals: SDK now supports separate foreground and background scan intervals with configurable retry queue.
Configurable Scan Intervals: New enums for fine-grained control over scan behavior
ForegroundScanInterval: Configure foreground scan intervals from 5 to 60 seconds (in 5-second increments)BackgroundScanInterval: Configure background scan intervals (15s, 30s, 60s, 90s, or 120s)Configurable Retry Queue: New MaxQueuedPayloads enum to control retry queue size
.small (50 failed batches).medium (100 failed batches) - default.large (200 failed batches).xlarge (500 failed batches)Configuration API: configure() method now accepts enum parameters instead of Duration
foregroundScanInterval: ForegroundScanInterval = ForegroundScanInterval.seconds15backgroundScanInterval: BackgroundScanInterval = BackgroundScanInterval.seconds30maxQueuedPayloads: MaxQueuedPayloads = MaxQueuedPayloads.mediumsyncInterval parameter removed in favor of separate foreground/background intervalsDynamic Interval Switching: SDK now automatically switches between foreground and background intervals based on app state (iOS only for now)
Improved Resilience: Increased default retry queue from fixed size to 100 failed batches
Native SDKs: Updated to version 2.1.0
BearoundSDK ~> 2.1.0com.github.Bearound:bearound-android-sdk:v2.1.0Before (v2.0.1):
await BearoundFlutterSdk.configure(
businessToken: 'your-business-token-here',
syncInterval: const Duration(seconds: 30),
);
After (v2.1.0):
// Using defaults (recommended)
await BearoundFlutterSdk.configure(
businessToken: 'your-business-token-here',
);
// Custom configuration
await BearoundFlutterSdk.configure(
businessToken: 'your-business-token-here',
foregroundScanInterval: ForegroundScanInterval.seconds30,
backgroundScanInterval: BackgroundScanInterval.seconds90,
maxQueuedPayloads: MaxQueuedPayloads.large,
);
scanDuration = max(5, min(syncInterval / 3, 10))Authentication Update: SDK now requires business token instead of appId for authentication.
Authentication Update: SDK now requires business token instead of appId for authentication.
configure() now requires businessToken parameter (replaces appId)appId automatically extracted from package/bundle identifierAuthorization header for all API requestscom.github.Bearound:bearound-android-sdk:v2.0.1BearoundSDK ~> 2.0.1Before (v2.0.0):
await BearoundFlutterSdk.configure(
appId: 'com.example.app',
syncInterval: const Duration(seconds: 30),
);
After (v2.0.1):
await BearoundFlutterSdk.configure(
businessToken: 'your-business-token-here',
syncInterval: const Duration(seconds: 30),
);
// Note: appId is now automatically extracted from package/bundle identifier
New Flutter API aligned to the native SDK 2.0.0 (configure, startScanning, stopScanning).
configure, startScanning, stopScanning).setUserProperties, clearUserProperties).com.github.Bearound:bearound-android-sdk:2.0.0.BearoundSDK ~> 2.0.0.Configurable Scan Interval: Set beacon scan frequency from 5 to 60 seconds via setSyncInterval()
setSyncInterval()
setBackupSize()
getSyncInterval() and getBackupSize() to retrieve current settingsSyncInterval and BackupSize enums for type-safe configurationBearound.configure() methodBearound(clientToken:isDebugEnable:) to Bearound.configure(clientToken:isDebugEnable:) (singleton pattern)initialize() on Android| Scenario | Sync Interval | Backup Size | Reason |
|---|---|---|---|
| Real-time tracking | TIME_5 - TIME_10 | SIZE_15 - SIZE_20 | Immediate updates, lower backup needed |
| Standard monitoring | TIME_20 - TIME_30 (⭐ default) | SIZE_30 - SIZE_40 | Balanced performance and battery |
| Battery-optimized | TIME_40 - TIME_60 | SIZE_40 - SIZE_50 | Longer intervals, larger backup for reliability |
| Offline-first apps | TIME_30 - TIME_60 | SIZE_50 | Handle poor network conditions |
BearoundFlutterSdk.setSyncInterval(SyncInterval) - Configure scan frequencyBearoundFlutterSdk.setBackupSize(BackupSize) - Configure backup list sizeBearoundFlutterSdk.getSyncInterval() - Get current sync intervalBearoundFlutterSdk.getBackupSize() - Get current backup sizestartServices() was called before permissions were granted
requestPermissions() to complete using async/await patternNothing published for this version
Nothing published for this version
Updated iOS BearoundSDK dependency to version 1.2.0
iOS Native SDK Update: Updated BearoundSDK iOS dependency from 1.1.0 to 1.1.1
requestPermissions() call during SDK initialization
State Synchronization Bug: Fixed critical issue where app state became desynchronized with native SDK after closing and reopening the app
BeAround.isInitialized() before re-initializing, preventing initialization errorsisInitialized() method to query SDK state from FlutterWidgetsBindingObserver to sync UI state when app resumes_syncStateWithNative() calls startScan() again to restore native event flowBearoundFlutterSdk.isInitialized() method to check if SDK is currently running
WidgetsBindingObserverinitialize method now handles already-initialized state gracefully
Event Listeners System: Comprehensive event listener architecture aligned with native iOS and Android SDKs
BeaconListener - Real-time beacon detection callbacks with event types (enter/exit/failed)SyncListener - API synchronization status monitoring (success/error events)RegionListener - Beacon region entry/exit notificationsbeaconsStream - Stream of detected beacons with event typessyncStream - Stream of API sync success/error eventsregionStream - Stream of region enter/exit eventslastSeen field (timestamp in milliseconds)BeaconRegionEnterEvent and BeaconRegionExitEvent now use regionName instead of beacon listSyncSuccessEvent now includes message field with server responseSyncErrorEvent now includes optional errorCode fieldMap<String, dynamic>.from() conversionsFoundation.UUID to String using .uuidStringOptional<Float> to Double conversion for distanceMetersString and Int types from native SDKBLUETOOTH and BLUETOOTH_ADMIN permissions to SDK manifestneverForLocation flag that was blocking beacon detectionMap<Object?, Object?> to Map<String, dynamic> casting issues in event streams.idea/ directories from repository and added to .gitignore.idea/ directory instead of individual fileslastSeen timestampMigrated iOS dependency from xcframework to official CocoaPods repository
com.github.Bearound:bearound-android-sdk:v1.0.3Comprehensive pre-commit hooks configuration
Initial release of Bearound Flutter SDK
Your coding agent can read these notes before it upgrades. Set up the MCP server →