Getting Started
Dieser Inhalt ist in Ihrer Sprache noch nicht verfügbar.
-
Install the package
Terminal-Fenster npm i @capgo/capacitor-ibeaconTerminal-Fenster pnpm add @capgo/capacitor-ibeaconTerminal-Fenster yarn add @capgo/capacitor-ibeaconTerminal-Fenster bun add @capgo/capacitor-ibeacon -
Sync with native projects
Terminal-Fenster npx cap syncTerminal-Fenster pnpm cap syncTerminal-Fenster yarn cap syncTerminal-Fenster bunx cap sync
Configuration
Section titled “Configuration”iOS Configuration
Section titled “iOS Configuration”Add the following to your Info.plist:
<key>NSLocationWhenInUseUsageDescription</key><string>This app needs location access to detect nearby beacons</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key><string>This app needs location access to monitor beacons in the background</string>
<key>NSBluetoothAlwaysUsageDescription</key><string>This app uses Bluetooth to detect nearby beacons</string>
<key>UIBackgroundModes</key><array> <string>location</string></array>Android Configuration
Section titled “Android Configuration”Add the following to your AndroidManifest.xml:
<manifest> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /></manifest>Important: For Android, you need to integrate the AltBeacon library into your project for beacon detection to work.
Add to your app’s build.gradle:
dependencies { implementation 'org.altbeacon:android-beacon-library:2.20+'}Basic Setup
Section titled “Basic Setup”import { CapacitorIbeacon } from '@capgo/capacitor-ibeacon';
// Define your beacon regionconst beaconRegion = { identifier: 'MyStore', uuid: 'B9407F30-F5F8-466E-AFF9-25556B57FE6D', major: 1, // Optional minor: 2 // Optional};Request Permissions
Section titled “Request Permissions”// Request "When In Use" permissionconst requestPermission = async () => { const { status } = await CapacitorIbeacon.requestWhenInUseAuthorization(); console.log('Permission status:', status); // status: 'not_determined' | 'restricted' | 'denied' | 'authorized_always' | 'authorized_when_in_use'};
// Request "Always" permission (for background monitoring)const requestAlwaysPermission = async () => { const { status } = await CapacitorIbeacon.requestAlwaysAuthorization(); console.log('Always permission status:', status);};
// Check current authorization statusconst checkPermission = async () => { const { status } = await CapacitorIbeacon.getAuthorizationStatus(); console.log('Current status:', status);};Check Device Capabilities
Section titled “Check Device Capabilities”// Check if Bluetooth is enabledconst checkBluetooth = async () => { const { enabled } = await CapacitorIbeacon.isBluetoothEnabled(); if (!enabled) { console.log('Please enable Bluetooth'); }};
// Check if ranging is availableconst checkRanging = async () => { const { available } = await CapacitorIbeacon.isRangingAvailable(); console.log('Ranging available:', available);};Monitor Beacon Regions
Section titled “Monitor Beacon Regions”Monitoring detects when you enter or exit a beacon region. This works in the background.
// Start monitoringconst startMonitoring = async () => { await CapacitorIbeacon.startMonitoringForRegion({ identifier: 'MyStore', uuid: 'B9407F30-F5F8-466E-AFF9-25556B57FE6D', major: 1, minor: 2 }); console.log('Started monitoring for beacons');};
// Stop monitoringconst stopMonitoring = async () => { await CapacitorIbeacon.stopMonitoringForRegion({ identifier: 'MyStore', uuid: 'B9407F30-F5F8-466E-AFF9-25556B57FE6D' });};Range Beacons
Section titled “Range Beacons”Ranging provides continuous updates about nearby beacons and their distances. This requires the app to be in the foreground.
// Start rangingconst startRanging = async () => { await CapacitorIbeacon.startRangingBeaconsInRegion({ identifier: 'MyStore', uuid: 'B9407F30-F5F8-466E-AFF9-25556B57FE6D' }); console.log('Started ranging beacons');};
// Stop rangingconst stopRanging = async () => { await CapacitorIbeacon.stopRangingBeaconsInRegion({ identifier: 'MyStore', uuid: 'B9407F30-F5F8-466E-AFF9-25556B57FE6D' });};Listen to Events
Section titled “Listen to Events”import { PluginListenerHandle } from '@capacitor/core';
// Listen for ranging events (continuous distance updates)const rangingListener: PluginListenerHandle = await CapacitorIbeacon.addListener( 'didRangeBeacons', (data) => { console.log('Beacons detected:', data.beacons); data.beacons.forEach(beacon => { console.log(`UUID: ${beacon.uuid}`); console.log(`Major: ${beacon.major}, Minor: ${beacon.minor}`); console.log(`Distance: ${beacon.accuracy}m`); console.log(`Proximity: ${beacon.proximity}`); // immediate, near, far, unknown console.log(`RSSI: ${beacon.rssi}`); }); });
// Listen for region enter eventsconst enterListener: PluginListenerHandle = await CapacitorIbeacon.addListener( 'didEnterRegion', (data) => { console.log('Entered region:', data.region.identifier); // Show welcome notification or trigger action });
// Listen for region exit eventsconst exitListener: PluginListenerHandle = await CapacitorIbeacon.addListener( 'didExitRegion', (data) => { console.log('Exited region:', data.region.identifier); // Trigger goodbye action });
// Listen for region state changesconst stateListener: PluginListenerHandle = await CapacitorIbeacon.addListener( 'didDetermineStateForRegion', (data) => { console.log(`Region ${data.region.identifier}: ${data.state}`); // state: 'inside' | 'outside' | 'unknown' });
// Clean up listeners when doneconst cleanup = () => { rangingListener.remove(); enterListener.remove(); exitListener.remove(); stateListener.remove();};Advertise as iBeacon (iOS only)
Section titled “Advertise as iBeacon (iOS only)”Turn your device into an iBeacon transmitter.
// Start advertisingconst startAdvertising = async () => { await CapacitorIbeacon.startAdvertising({ uuid: 'B9407F30-F5F8-466E-AFF9-25556B57FE6D', major: 1, minor: 2, identifier: 'MyBeacon', measuredPower: -59 // Optional: calibrated power at 1 meter }); console.log('Started advertising as iBeacon');};
// Stop advertisingconst stopAdvertising = async () => { await CapacitorIbeacon.stopAdvertising();};Complete Example
Section titled “Complete Example”import { CapacitorIbeacon } from '@capgo/capacitor-ibeacon';import { PluginListenerHandle } from '@capacitor/core';
export class BeaconService { private listeners: PluginListenerHandle[] = [];
async init() { // Request permissions const { status } = await CapacitorIbeacon.requestWhenInUseAuthorization();
if (status !== 'authorized_when_in_use' && status !== 'authorized_always') { throw new Error('Location permission denied'); }
// Check Bluetooth const { enabled } = await CapacitorIbeacon.isBluetoothEnabled(); if (!enabled) { throw new Error('Bluetooth is not enabled'); }
// Set up event listeners this.setupListeners(); }
private setupListeners() { this.listeners.push( await CapacitorIbeacon.addListener('didEnterRegion', (data) => { console.log('Welcome! Entered:', data.region.identifier); this.onEnterRegion(data.region); }) );
this.listeners.push( await CapacitorIbeacon.addListener('didExitRegion', (data) => { console.log('Goodbye! Left:', data.region.identifier); this.onExitRegion(data.region); }) );
this.listeners.push( await CapacitorIbeacon.addListener('didRangeBeacons', (data) => { this.onRangeBeacons(data.beacons); }) ); }
async startMonitoring(uuid: string, identifier: string, major?: number, minor?: number) { await CapacitorIbeacon.startMonitoringForRegion({ identifier, uuid, major, minor }); }
async startRanging(uuid: string, identifier: string) { await CapacitorIbeacon.startRangingBeaconsInRegion({ identifier, uuid }); }
private onEnterRegion(region: any) { // Handle region entry (e.g., show notification, trigger content) console.log('Entered beacon region:', region); }
private onExitRegion(region: any) { // Handle region exit console.log('Left beacon region:', region); }
private onRangeBeacons(beacons: any[]) { // Process beacon distances const nearestBeacon = beacons.reduce((nearest, beacon) => { return beacon.accuracy < nearest.accuracy ? beacon : nearest; }, beacons[0]);
if (nearestBeacon) { console.log('Nearest beacon:', nearestBeacon); this.handleProximity(nearestBeacon); } }
private handleProximity(beacon: any) { switch (beacon.proximity) { case 'immediate': // < 0.5m console.log('Very close to beacon'); break; case 'near': // 0.5m - 3m console.log('Near beacon'); break; case 'far': // > 3m console.log('Far from beacon'); break; case 'unknown': console.log('Distance unknown'); break; } }
cleanup() { this.listeners.forEach(listener => listener.remove()); this.listeners = []; }}API Reference
Section titled “API Reference”startMonitoringForRegion(options)
Section titled “startMonitoringForRegion(options)”Start monitoring for a beacon region. Triggers events when entering/exiting.
interface BeaconRegion { identifier: string; uuid: string; major?: number; minor?: number; notifyEntryStateOnDisplay?: boolean;}
await CapacitorIbeacon.startMonitoringForRegion(options);stopMonitoringForRegion(options)
Section titled “stopMonitoringForRegion(options)”Stop monitoring for a beacon region.
await CapacitorIbeacon.stopMonitoringForRegion(options);startRangingBeaconsInRegion(options)
Section titled “startRangingBeaconsInRegion(options)”Start ranging beacons in a region for continuous distance updates.
await CapacitorIbeacon.startRangingBeaconsInRegion(options);stopRangingBeaconsInRegion(options)
Section titled “stopRangingBeaconsInRegion(options)”Stop ranging beacons in a region.
await CapacitorIbeacon.stopRangingBeaconsInRegion(options);startAdvertising(options)
Section titled “startAdvertising(options)”Start advertising the device as an iBeacon (iOS only).
interface BeaconAdvertisingOptions { uuid: string; major: number; minor: number; identifier: string; measuredPower?: number; // Calibrated power at 1 meter}
await CapacitorIbeacon.startAdvertising(options);stopAdvertising()
Section titled “stopAdvertising()”Stop advertising the device as an iBeacon.
await CapacitorIbeacon.stopAdvertising();requestWhenInUseAuthorization()
Section titled “requestWhenInUseAuthorization()”Request “When In Use” location authorization.
const result = await CapacitorIbeacon.requestWhenInUseAuthorization();// Returns: { status: string }requestAlwaysAuthorization()
Section titled “requestAlwaysAuthorization()”Request “Always” location authorization (required for background monitoring).
const result = await CapacitorIbeacon.requestAlwaysAuthorization();// Returns: { status: string }getAuthorizationStatus()
Section titled “getAuthorizationStatus()”Get current location authorization status.
const result = await CapacitorIbeacon.getAuthorizationStatus();// Returns: { status: 'not_determined' | 'restricted' | 'denied' | 'authorized_always' | 'authorized_when_in_use' }isBluetoothEnabled()
Section titled “isBluetoothEnabled()”Check if Bluetooth is enabled.
const result = await CapacitorIbeacon.isBluetoothEnabled();// Returns: { enabled: boolean }isRangingAvailable()
Section titled “isRangingAvailable()”Check if ranging is available on the device.
const result = await CapacitorIbeacon.isRangingAvailable();// Returns: { available: boolean }enableARMAFilter(options)
Section titled “enableARMAFilter(options)”Enable ARMA filtering for distance calculations (Android only).
await CapacitorIbeacon.enableARMAFilter({ enabled: true });Events
Section titled “Events”didRangeBeacons
Section titled “didRangeBeacons”Fired when beacons are detected during ranging.
interface RangingEvent { region: BeaconRegion; beacons: Beacon[];}
interface Beacon { uuid: string; major: number; minor: number; rssi: number; // Signal strength proximity: 'immediate' | 'near' | 'far' | 'unknown'; accuracy: number; // Distance in meters}didEnterRegion
Section titled “didEnterRegion”Fired when entering a monitored beacon region.
interface RegionEvent { region: BeaconRegion;}didExitRegion
Section titled “didExitRegion”Fired when exiting a monitored beacon region.
interface RegionEvent { region: BeaconRegion;}didDetermineStateForRegion
Section titled “didDetermineStateForRegion”Fired when region state is determined.
interface StateEvent { region: BeaconRegion; state: 'inside' | 'outside' | 'unknown';}Proximity Values
Section titled “Proximity Values”- immediate: Very close (< 0.5 meters)
- near: Relatively close (0.5 - 3 meters)
- far: Further away (> 3 meters)
- unknown: Distance cannot be determined
Best Practices
Section titled “Best Practices”-
Request appropriate permissions
- Use “When In Use” for foreground features
- Request “Always” only if you need background monitoring
- Explain clearly why you need location access
-
Handle Bluetooth state
const { enabled } = await CapacitorIbeacon.isBluetoothEnabled();if (!enabled) {// Prompt user to enable Bluetooth} -
Battery optimization
- Use monitoring instead of ranging when possible (more battery-efficient)
- Stop ranging when not actively needed
- Consider using larger major/minor ranges to reduce processing
-
Error handling
try {await CapacitorIbeacon.startMonitoringForRegion(region);} catch (error) {console.error('Failed to start monitoring:', error);} -
Clean up listeners Always remove event listeners when component unmounts to prevent memory leaks.
Platform Notes
Section titled “Platform Notes”- Requires iOS 10.0+
- Uses native CoreLocation framework
- Supports background monitoring with “Always” permission
- Can advertise as iBeacon using CoreBluetooth
- Ranging requires app to be in foreground
Android
Section titled “Android”- Requires Android 6.0 (API 23)+
- Uses AltBeacon library
- Requires location permissions even though beacons use Bluetooth
- Background monitoring requires ACCESS_BACKGROUND_LOCATION (Android 10+)
- Cannot advertise as iBeacon (hardware limitation on most devices)
- Not supported on web platform
Common Use Cases
Section titled “Common Use Cases”- Proximity Marketing: Trigger notifications or content when users approach your store
- Indoor Navigation: Guide users through buildings using beacon waypoints
- Attendance Tracking: Automatically check-in when users enter a location
- Asset Tracking: Monitor equipment or inventory movement
- Museum Tours: Provide contextual information as visitors approach exhibits
- Smart Home: Trigger automations based on room presence
Troubleshooting
Section titled “Troubleshooting”Beacons not detected
Section titled “Beacons not detected”- Ensure Bluetooth is enabled
- Verify location permissions are granted
- Check beacon UUID matches exactly (case-sensitive)
- Confirm beacon is powered and transmitting
- Try without major/minor filters first
Background monitoring not working
Section titled “Background monitoring not working”- Ensure “Always” location permission is granted
- Add
locationto UIBackgroundModes (iOS) - Request ACCESS_BACKGROUND_LOCATION (Android 10+)
- Note: iOS may delay background callbacks to save battery
Distance measurements inaccurate
Section titled “Distance measurements inaccurate”- Beacon RSSI varies with environment (walls, interference)
- Use multiple beacons for triangulation
- Calibrate measuredPower at 1 meter from beacon
- Enable ARMA filtering on Android for smoother values