【问题标题】:Why android Ibeacon need bluetooth permission?为什么 android Ibeacon 需要蓝牙权限?
【发布时间】:2021-12-10 08:29:05
【问题描述】:
【问题讨论】:
标签:
android
ibeacon
ibeacon-android
【解决方案2】:
是的,Android 需要蓝牙权限才能扫描蓝牙信标,但 iOS 不需要相同的权限来检测 iBeacon。 无论您使用什么库,Android 都必须具有蓝牙权限才能扫描信标。这是操作系统平台限制。
Android 需要此权限而 iOS 不需要此权限的原因是基于这两个平台如何演变的历史。几点:
-
从 iOS 7 开始,蓝牙信标支持被添加到 CoreLocation API,它使用 Location 权限,而不是各种传感器(如 GPS、WiFi、蜂窝无线电和蓝牙)的单独权限,所有可用于定位目的。 Apple 显然做出了设计决定,将所有传感器置于单一权限之下。
-
开源 Android 根本没有用于检测信标的内置 API——它只有蓝牙 API。 (Beacon API 由 Google Play Services add on 或开源 Android Beacon Library 提供)。所以在 Android 4.3 中添加蓝牙 LE 扫描时,它被视为必须在蓝牙权限之后的东西。。这些 API 恰好可以与 Apple 的 iBeacon 发明配合使用,但这些 API 并不是为定位而设计的。
-
当Android在Android 6中添加运行时权限时,它试图通过将位置权限设置为运行时权限来保护用户的隐私,并进一步将蓝牙扫描置于相同的位置权限之后,以尝试在蓝牙权限之外保护隐私。
-
在 iOS 上,蓝牙 LE API 确实需要蓝牙权限,并且Apple 对来自 iBeacon 的蓝牙功能进行了沙盒化。这样检测iBeacon必须获得Location权限,不需要蓝牙权限。另一方面,非 iBeacon 检测可以通过常规蓝牙许可进行,但 Apple 会过滤掉任何与 iBeacon 匹配的数据包。 Android 没有等效的沙盒,这是两个权限都需要的原因之一。
需要注意的重要一点:Apple 不需要蓝牙权限来检测信标仅适用于 iBeacon 格式。如果您尝试检测 AltBeacon 或 Eddystone,您实际上确实需要蓝牙权限(而不是这些格式的位置权限。)这是一个“漏洞”,对于在某些情况下在 iOS 设备上避免额外权限很有用。
最后一点:从 Android 12 开始,您可以使用新的 BLUETOOTH_SCAN 权限代替位置权限。这个想法是为了让 Android 不再需要位置权限来扫描常规蓝牙设备。但是有一个很大的问题:要使用这个新权限,您必须在 AndroidManifest.xml 中声明您的应用程序不使用蓝牙进行定位(例如信标),并且 Android 表示它会在这些情况下过滤掉一些扫描结果。他们没有明确说明,但这可能意味着他们会过滤掉任何与已知信标格式(如 iBeacon、AltBeacon 或 Eddystone)匹配的蓝牙数据包。