HAVS Protect on managed phones: IT approval pack
Facts for an IT or security department deciding whether to allow the HAVS Protect app on managed iOS and Android phones. They are taken from the app's source code (version 2.12.0) and the backend configuration, not from marketing copy.
Updated 22 October 2026
No certification
HAVS Protect and the Copyl platform have not been assessed or approved under the Swedish Protective Security Act (säkerhetsskyddslagen 2018:585) or any other security classification scheme, and we do not claim they are. This pack gives you the facts for your own assessment.
Indicator, not a measurement. A phone is not a calibrated sound level meter. Use it to see when to protect your hearing and when a real measurement is needed.
Sound is processed on the phone only. No audio is recorded, stored or sent. Only sound levels (dB(A), time, duration, tool and project) leave the phone, and only when you log a session yourself. Your employer sees them the same way as your vibration values.
Apps and identifiers
| App | HAVS Protect, published by We Protect AB |
|---|---|
| iOS bundle id | io.havs (extensions io.havs.HavsGlanceWidgetExtension and io.havs.HavsLiveActivityExtension) |
| App Store | https://apps.apple.com/se/app/havs-protect/id6469731381 |
| Lowest iOS version | iOS 16.1 |
| Android application id | io.havs |
| Google Play | https://play.google.com/store/apps/details?id=io.havs |
| Lowest Android version | Android 8.0 (API 26), target API 36 |
| Backend | api.copyl.com (Copyl platform, Microsoft Azure, West Europe) |
Permissions per platform
Each permission is asked for only when the feature that needs it is used. A worker can refuse any of them; the feature that needs it then does not work, the rest of the app does.
Android
| Permission | Asked when | Why |
|---|---|---|
| BLUETOOTH_SCAN (neverForLocation), BLUETOOTH_CONNECT | Pairing a HAVS Protect sensor | Connects to the Bluetooth vibration sensor. The scan is declared as never used to find the phone's location. |
| BLUETOOTH, BLUETOOTH_ADMIN, ACCESS_FINE_LOCATION (Android 11 and older only), ACCESS_COARSE_LOCATION (Android 9 and older only) | Pairing a sensor on older Android | Older Android versions require these for any Bluetooth scan. They are not declared for Android 12 and later. |
| RECORD_AUDIO | Opening the Noise screen | The noise indicator. Never asked when the indicator is switched off by the employer or by MDM. |
| CAMERA | Attaching a photo to a note | Photo on a note. |
| POST_NOTIFICATIONS | First start | Exposure alarms and the notification shown while a work session runs. |
| FOREGROUND_SERVICE, FOREGROUND_SERVICE_CONNECTED_DEVICE, FOREGROUND_SERVICE_DATA_SYNC | Starting a work session | Keeps the sensor connection and upload running with the screen off. A persistent notification shows while it runs. |
| REQUEST_IGNORE_BATTERY_OPTIMIZATIONS | Starting a work session | Stops battery optimisation from ending a running session. |
| SCHEDULE_EXACT_ALARM | Setting exposure alarms | Exposure alarms fire on time. |
This is the app's own manifest. The store build also carries normal-level permissions merged in by libraries, such as INTERNET; the Google Play listing shows the full set. NFC is used to read tool tags where the phone has it (bluetooth_le is a required feature, NFC is not).
iOS
| Permission | Asked when | Why |
|---|---|---|
| Bluetooth (NSBluetoothAlwaysUsageDescription) | Pairing a HAVS Protect sensor | Connects to the Bluetooth vibration sensor and keeps the connection in the background. |
| Location, Always (NSLocationAlwaysUsageDescription) | Not asked by the app (declared only) | Declared in Info.plist for background Bluetooth; the app does not request location on iOS and sends no location to the backend. |
| Microphone (NSMicrophoneUsageDescription) | Opening the Noise screen | The noise indicator. Never asked when the indicator is switched off by the employer or by MDM. |
| Camera (NSCameraUsageDescription) | Attaching a photo to a note | Photo on a note. |
| NFC (NFCReaderUsageDescription) | Scanning a tool tag | Reads the tool's identity from its tag. |
| Notifications | First start | Exposure alarms and push notifications. |
Background modes declared: bluetooth-central, bluetooth-peripheral, remote-notification, processing, fetch.
Data flow and region
What happens to sound in the noise indicator:
- The microphone stream is processed in memory into an A-weighted level. No audio is written to storage and no audio is sent anywhere.
- Nothing is sent while the worker only looks at the gauge. Levels leave the phone only when the worker logs a session.
- A logged session goes over HTTPS to api.copyl.com (Azure API Management) and is stored by the CopylAPI_Strategy service in Azure SQL. All of these run in Microsoft Azure, region West Europe (Netherlands).
- If the phone is offline, the logged session waits on the phone and is sent when it is back online.
What one logged noise session contains
- Start time and duration
- Indicated LAeq and LAmax in dB(A), and seconds above 80 and 85 dB(A)
- The phone model, the offset used for that model and whether the model is uncalibrated
- Optionally the tool and the project (work moment) the worker chose
- The worker's user id and the employer's enterprise id, taken from the sign-in
Other services the app uses
- Sign-in and the account: the Copyl platform (cUsersAPI, Azure West Europe). Optional sign-in with Apple or Google.
- Google Firebase: Google sign-in, push notifications (Firebase Cloud Messaging), usage analytics and crash reports (Firebase Analytics, Crashlytics). No audio and no noise levels are sent to Firebase.
- Vibration (HAV) data from the sensor goes to the same CopylAPI_Strategy service as noise.
Retention
- Audio: none is kept, anywhere.
- Live levels on the screen are not stored.
- Logged sessions are kept while the employer's Connected Worker account is active, like vibration data. There is no automatic deletion period today.
- A worker's own session can be deleted; it is then excluded from every view and estimate. The employer can ask We Protect to delete a worker's data (contact below).
Who at the employer sees what
- The worker sees their own levels and sessions in the app.
- In the employer's Copyl enterprise, Connected Worker shows a worker's noise sessions and daily estimate next to their vibration exposure, with exactly the same access as vibration data. No new access path was added for noise.
- Another organisation (for example a main contractor) sees them only through a data-sharing request that has been approved, the same as for vibration data.
- Nobody, including We Protect, can hear anything: there is no audio to listen to.
Off switch and managed-config keys
The noise indicator can be switched off for a whole organisation or per phone. When it is off, the Noise screen and its home card are gone and the app never asks for the microphone.
- MDM managed app configuration on the phone, if set, wins.
- Otherwise the organisation setting: Copyl › Settings › Connected Worker › Noise indicator (enterprise administrators only). Default on.
- The app reads both at sign-in and at app start.
| Platform | Key | Type | Values |
|---|---|---|---|
| Android (managed configurations, app_restrictions.xml) | noiseIndicatorEnabled | bool | false = off, true = on (default) |
| iOS (com.apple.configuration.managed) | noiseIndicatorEnabled | Boolean | false = off, true = on (default). The strings "false"/"true" and 0/1 are also accepted. |
Example: iOS app configuration (Intune, Workspace ONE)
<dict>
<key>noiseIndicatorEnabled</key>
<false/>
</dict>- Android: the key appears in the EMM console under the app's managed configuration as "Noise indicator" once the version with it is published.
- Removing the key returns the phone to the organisation setting.
Contact
We Protect AB. Questions from IT and security departments: [email protected]. Ask us for anything this pack does not answer, for example a data processing agreement or the source of a statement here.