
Company News
Free Business Plan Upgrades for Open Source Maintainers
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.
@ios-web-bluetooth/react
Advanced tools
React hooks for Bluetooth Low Energy — useDevice, useScan, useProfile. Real-time BLE data in React
React hooks and components for Web Bluetooth. Works with the WebBLE Safari Extension for iOS support.
npm install @ios-web-bluetooth/react @ios-web-bluetooth/core
Add the polyfill import to your app entry file:
import '@ios-web-bluetooth/core/auto';
import { WebBLEProvider, useBluetooth, useDevice } from '@ios-web-bluetooth/react';
import type { WebBLEDevice } from '@ios-web-bluetooth/core';
function App() {
return (
<WebBLEProvider>
<HeartRateMonitor />
</WebBLEProvider>
);
}
function HeartRateMonitor() {
const { requestDevice } = useBluetooth();
const [device, setDevice] = useState<WebBLEDevice | null>(null);
const { isConnected, connect, disconnect } = useDevice(device, { autoReconnect: true });
const handlePair = async () => {
// Must be called from a user gesture (button click)
const d = await requestDevice({ filters: [{ services: ['heart_rate'] }] });
if (d) setDevice(d);
};
return (
<div>
{!device && <button onClick={handlePair}>Pair</button>}
{device && !isConnected && <button onClick={connect}>Connect</button>}
{isConnected && <button onClick={disconnect}>Disconnect</button>}
</div>
);
}
useBluetooth()Main hook for Bluetooth availability and device requests.
import { useBluetooth } from '@ios-web-bluetooth/react';
const {
isAvailable, // Web Bluetooth available?
isExtensionInstalled, // WebBLE extension installed?
requestDevice, // Request device (must be called from user gesture)
getDevices, // Get previously paired devices
ble, // Core WebBLE instance
backgroundSync, // Background sync API
peripheral, // Peripheral mode API
error,
} = useBluetooth();
useDevice(device, options?)Manage a device's connection lifecycle with optional auto-reconnect.
import { useDevice } from '@ios-web-bluetooth/react';
const {
connectionState, // 'disconnected' | 'connecting' | 'connected' | 'disconnecting'
isConnected,
isConnecting,
connect,
disconnect,
services, // Discovered GATT services
error,
autoReconnect, // Current auto-reconnect state
setAutoReconnect, // Toggle auto-reconnect
reconnectAttempt, // Current reconnect attempt number (0 = not reconnecting)
} = useDevice(device, {
autoReconnect: true,
reconnectAttempts: 3,
reconnectDelay: 1000,
reconnectBackoffMultiplier: 2,
onReconnectAttempt: (attempt, delayMs) => {},
onReconnectSuccess: (attempt) => {},
onReconnectFailure: (error, attempt, willRetry) => {},
});
useCharacteristic(device, serviceUUID, characteristicUUID)Read, write, and subscribe to a BLE characteristic. All operations delegate to the core SDK.
import { useCharacteristic } from '@ios-web-bluetooth/react';
const {
value, // Latest DataView value
isNotifying, // Currently subscribed?
read, // () => Promise<DataView | null>
write, // (value: BufferSource) => Promise<void>
writeWithoutResponse,
subscribe, // (handler: (value: DataView) => void) => Promise<void>
unsubscribe,
error,
} = useCharacteristic(device, 'heart_rate', 'heart_rate_measurement');
// Read a value
const data = await read();
// Write a value
await write(new Uint8Array([0x01, 0x02]));
// Subscribe to notifications
await subscribe((value) => {
console.log('Heart rate:', value.getUint8(1));
});
useNotifications(device, service, characteristic, options?)Subscribe to characteristic notifications with a rolling history.
import { useNotifications } from '@ios-web-bluetooth/react';
const {
value, // Latest DataView
history, // Array<{ timestamp: Date, value: DataView }>
isSubscribed,
subscribe, // () => Promise<void>
unsubscribe,
clear, // Clear history
error,
} = useNotifications(device, 'heart_rate', 'heart_rate_measurement', {
autoSubscribe: true,
maxHistory: 100,
});
useScan()Scan for nearby BLE devices.
import { useScan } from '@ios-web-bluetooth/react';
const {
scanState, // 'idle' | 'scanning' | 'stopped'
devices, // WebBLEDevice[]
start, // (options?: ScanOptions) => Promise<void>
stop,
clear,
error,
} = useScan();
await start({
filters: [{ namePrefix: 'Device' }],
keepRepeatedDevices: true,
});
<WebBLEProvider>Required context provider. Optionally accepts a pre-configured WebBLE instance.
import { WebBLEProvider } from '@ios-web-bluetooth/react';
// Auto-creates WebBLE instance
<WebBLEProvider config={{ apiKey: 'wbl_xxxxx', operatorName: 'MyApp' }}>
<App />
</WebBLEProvider>
// Or pass an existing instance (useful for testing)
<WebBLEProvider ble={existingBleInstance}>
<App />
</WebBLEProvider>
<DeviceScanner>Device selection UI with scan controls.
import { DeviceScanner } from '@ios-web-bluetooth/react';
<DeviceScanner
filters={[{ services: ['heart_rate'] }]}
onDeviceSelected={(device) => setDevice(device)}
autoConnect
maxDevices={10}
scanDuration={30000}
/>
<ConnectionStatus>Connection state indicator dot.
import { ConnectionStatus } from '@ios-web-bluetooth/react';
<ConnectionStatus device={device} className="status-dot" />
<InstallationWizard>Guides users through WebBLE extension installation on Safari iOS.
import { InstallationWizard } from '@ios-web-bluetooth/react';
<InstallationWizard
onComplete={() => console.log('Extension installed!')}
/>
All hooks return a WebBLEError with .code and .suggestion fields:
const { error } = useDevice(device);
if (error) {
console.log(error.code); // e.g. 'GATT_OPERATION_FAILED'
console.log(error.suggestion); // e.g. 'Check that the device is in range'
}
Types are re-exported from @ios-web-bluetooth/core for convenience:
import type { WebBLEDevice, WebBLEError, RequestDeviceOptions } from '@ios-web-bluetooth/react';
import type { ConnectionState, UseDeviceReturn } from '@ios-web-bluetooth/react';
| Browser | Support | Notes |
|---|---|---|
| Safari iOS | Full | Requires WebBLE Extension |
| Chrome 56+ | Full | Native Web Bluetooth |
| Edge 79+ | Full | Native Web Bluetooth |
MIT
FAQs
React hooks for Bluetooth Low Energy — useDevice, useScan, useProfile. Real-time BLE data in React
The npm package @ios-web-bluetooth/react receives a total of 0 weekly downloads. As such, @ios-web-bluetooth/react popularity was classified as not popular.
We found that @ios-web-bluetooth/react demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.