BLUETOOTH_SCAN
Bluetooth scanning only — discovering nearby devices and beacons, without connecting to them.
Prefer this over BLUETOOTH when your app only scans: BLUETOOTH requests SCAN and CONNECT together, so using it for a scan-only feature asks for connect access the app never exercises.
Android:
BLUETOOTH_SCAN(API 31+). Below API 31 there is no separate scan permission and scanning genuinely requiredACCESS_FINE_LOCATION, so that is what this maps to there.iOS:
NSBluetoothAlwaysUsageDescription— iOS has a single Bluetooth authorization covering scan, connect and advertise alike, so this behaves exactly like BLUETOOTH there. The split is an Android-only distinction.
neverForLocation
Android treats BLUETOOTH_SCAN as capable of deriving location unless the app declares otherwise:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />Add that flag if your app does not derive physical location from scan results — it narrows what reviewers and users see the app asking for. Grant logs a warning when the flag is absent; see ManifestValidator.