Imagine you're launching a fitness app measuring heart rate. PPG via camera gives ±15 bpm – motion artifacts, glare, iOS frame rate limitations. A BLE sensor loses connection due to incorrect parsing of the Heart Rate Measurement characteristic. HealthKit requires complex permission setup, and Apple rejects publication due to Section 5.1 non-compliance. We solve these problems in 2–4 weeks turnkey: from frame capture to store publication. Contact us to get a detailed integration plan for your project.
What problems do we solve?
PPG measurement inaccuracy is the main pain: motion artifacts, changing light, flashlight limitations on iOS. BLE integration is also non-trivial: incorrect flag parsing, RR-interval parsing leads to HRV errors. HealthKit/Health Connect – complications with authorization and background collection. We cover each of these layers: from frame capture to publication.
BLE sensors are 5–10 times more accurate than PPG in standard deviation (±1 vs ±10 bpm at rest). For apps aiming at sports monitoring or HRV – only BLE.
How we implement PPG via camera: step by step
- Capture video stream: AVCaptureVideoDataOutputSampleBufferDelegate (iOS) or CameraX (Android). 30 fps.
- Compute average green channel: take central area – 1/3 of dimensions. Avoid glare.
- Filtering: pass signal through bandpass filter 0.67–3.33 Hz (FFT or IIR).
- Peak detection: algorithms based on autocorrelation or zero-crossing analysis.
- Heart rate calculation: number of peaks in last 5 seconds.
- HRV estimation: if required – measure RR intervals (BLE native, PPG indirect).
Detailed heart rate and HRV calculation
Sampling rate 30 fps → time resolution 33 ms. For HR 180 bpm (3 Hz) minimum 6 Hz (Nyquist theorem). We use FFT with Hann window length 5 seconds (150 points). For HRV measure SDNN and RMSSD; on PPG they are less accurate than on BLE.
Why BLE is more accurate than PPG?
Standard Bluetooth LE profile for heart rate sensors (Polar H10, Wahoo TICKR, Garmin HRM):
- Service UUID:
0x180D(Heart Rate) - Characteristic UUID:
0x2A37(Heart Rate Measurement)
Data comes via Notification. First byte – flags: bit 0 defines format (UINT8 or UINT16), bit 4 – presence of RR intervals.
override fun onCharacteristicChanged( gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, value: ByteArray ) { val flag = value[0].toInt() val isUint16 = flag and 0x01 != 0 val heartRate = if (isUint16) { ((value[2].toInt() and 0xFF) shl 8) or (value[1].toInt() and 0xFF) } else { value[1].toInt() and 0xFF } // RR intervals (if present) – for HRV if (flag and 0x10 != 0) { var offset = if (flag and 0x08 != 0) 4 else 3 // skip energy expenditure if present while (offset + 1 < value.size) { val rrRaw = ((value[offset + 1].toInt() and 0xFF) shl 8) or (value[offset].toInt() and 0xFF) val rrMs = rrRaw * 1000 / 1024 // convert from 1/1024 sec to ms rrIntervals.add(rrMs) offset += 2 } } } RR intervals are the basis for HRV (Heart Rate Variability) calculation. If your product claims stress monitoring or recovery – RR is a must.
How to test BLE heart rate integration?
Typical mistakes: incorrect flag handling, no reconnection on disconnect, wrong RR-interval parsing. We automate testing on 20+ sensor models (Polar, Wahoo, Garmin, Scosche) to guarantee stable connection and accurate data. Order testing of your integration – get a report in 2 days.
Reading from HealthKit / Health Connect
For apps that don't measure directly but only display data:
let query = HKAnchoredObjectQuery( type: HKQuantityType(.heartRate), predicate: nil, anchor: lastAnchor, limit: HKObjectQueryNoLimit ) { _, samples, _, newAnchor, _ in self.lastAnchor = newAnchor let bpmValues = (samples as? [HKQuantitySample])?.map { $0.quantity.doubleValue(for: HKUnit(from: "count/min")) } ?? [] } healthStore.execute(query) Data comes from sources: Apple Watch Series 4+ provides heart rate every 5–15 minutes at rest and every second during workout.
Visualization
For real-time heart rate graph: circular buffer of last N values, update every second. On iOS – Charts (DanielGindi) or Swift Charts (iOS 16+). On Android – MPAndroidChart or Compose Canvas with custom drawing.
Heart rate zones calculated from max heart rate (220 minus age or Karvonen formula with resting HR):
| Zone | % of max | Color |
|---|---|---|
| 1 – Recovery | 50–60% | Gray |
| 2 – Aerobic base | 60–70% | Blue |
| 3 – Aerobic | 70–80% | Green |
| 4 – Anaerobic threshold | 80–90% | Orange |
| 5 – Maximal | 90–100% | Red |
Max heart rate formula
Most common formula: 220 minus age (men) or 226 minus age (women). For more accurate calculation, Karvonen formula: HRmax = 220 - age for untrained, for athletes – 205.8 - 0.685 * age.
What's included in turnkey heart rate monitoring development?
- Requirements analysis and method selection (camera/BLE/platform or combination)
- Data collection implementation with cleaning and filtering
- Processing algorithms (FFT, peak detection, HRV)
- Visualization (graph, zones, statistics)
- HealthKit / Health Connect integration (read and write)
- Background mode and notifications
- Testing on real devices and sensors (including Fitbit, Garmin, etc.)
- Architecture documentation, build configuration, store submission assistance
Our experience and metrics
We have many years of experience in mobile development. Completed 50+ projects with heart rate monitoring, integrated HealthKit into 30 apps. Portfolio includes integrations with Polar, Wahoo, Garmin, Fitbit, as well as HealthKit and Health Connect. Guarantee stable BLE connection on 20+ sensor models. All solutions pass App Store and Google Play reviews without rejections. Budget savings through algorithm optimization – discussed individually. Get an engineer consultation and preliminary estimate.
Estimated timelines
| Stage | Duration |
|---|---|
| PPG measurement via camera (with algorithms) | 2–3 weeks |
| Bluetooth GATT integration | 1–2 weeks |
| HealthKit/Health Connect + visualization | 5–8 days |
| Full turnkey cycle (all methods) | from 4 weeks |
Cost of each stage calculated individually. Contact us for accurate project estimation – get a step-by-step implementation plan and timeline estimate within 2 days.
Source: Photoplethysmogram and Bluetooth Heart Rate Profile.







