VitalsResult object, and learned how to interpret the quality tier before displaying or persisting any metric. If you haven’t added the SDK to your project yet, complete Installation first.
1
Initialize the SDK
Call Place this call in
VitalsSDK.configure once during app startup — typically in your AppDelegate (iOS) or Application subclass (Android). Initialization validates your license key and prepares the measurement engine. Attempting to present a scan before calling configure will throw a runtime error.- iOS — Swift
- Android — Kotlin
application(_:didFinishLaunchingWithOptions:) inside your AppDelegate, or in the init() of your top-level App struct if you are using SwiftUI.2
Present the scan view
The SDK ships a purpose-built scan UI that handles camera preview, the 60-second countdown, real-time signal quality feedback, and user guidance. Present it when the user initiates a scan.
- iOS — Swift
- Android — Kotlin
Instantiate The view controller manages its own camera session lifecycle. It requests camera permission on first presentation if the user has not yet been prompted.
VitalsScanViewController, assign your delegate, and present it. It can be pushed onto a navigation stack or presented modally.The scan requires 60 seconds of continuous rear-camera contact with a fingertip. The SDK UI guides the user through correct finger placement and will surface a
.withheld quality tier if the signal is too noisy to produce a reliable result.3
Handle results
When the scan completes, the SDK delivers a Available metrics on
VitalsResult containing all measured metrics. Implement the appropriate callback for your platform.- iOS — Swift
- Android — Kotlin
Conform to
VitalsScanDelegate in the view controller (or object) that owns the scan:didComplete fires when the 60-second capture finishes and the engine has produced a result. didFailWith fires for hard errors such as camera access denial or an invalid license key.Available metrics on VitalsResult
4
Check the quality tier before using results
Every
VitalsResult carries a qualityTier that tells you whether the SDK has enough confidence in the signal to consider the result reliable. Always inspect this value before displaying metrics to a user or writing them to a data store.- iOS — Swift
- Android — Kotlin
What does each quality tier mean?
What does each quality tier mean?
.accepted / QualityTier.ACCEPTED
The photoplethysmography signal met the SDK’s internal quality thresholds throughout the 60-second window. The result has been validated against the methodology used in Polar H10 comparison testing and is reliable for wellness reporting..withheld / QualityTier.WITHHELD
The signal contained too much motion artifact or noise for the engine to produce a result within validation tolerances. Individual metric properties on the result object will not contain usable values. Prompt the user to retake the scan with their finger resting steadily against the lens in a well-lit environment.The Neurofit Vitals SDK is a wellness tool validated against the Polar H10 chest strap. It is not a medical device. Quality tier
.accepted means the result is within the SDK’s own validation bounds — it does not constitute a clinical determination.Next Steps
iOS Integration Guide
Deep-dive into SwiftUI and UIKit integration patterns, background handling, and lifecycle best practices for iOS.
Android Integration Guide
Jetpack Compose and View-based integration, runtime permissions flow, and activity result API migration.
Handling Results
Store, display, and trend vitals results — including quality filtering, local persistence, and charting guidance.
Metrics Overview
Understand what each metric measures, how it is computed from the PPG signal, and how to interpret values for your users.
