☰
为什么iOS版只能用金丝雀模式?Nearby Glasses跨平台蓝牙扫描差异全解析
2026/10/4 6:08:25 网站建设 项目流程

为什么iOS版只能用金丝雀模式?Nearby Glasses跨平台蓝牙扫描差异全解析

【免费下载链接】yj_nearbyglassesattempting to detect smart glasses nearby and warn you项目地址: https://gitcode.com/gh_mirrors/yj/yj_nearbyglasses

Nearby Glasses 是一款免费的智能眼镜检测 App,通过扫描蓝牙低功耗(BLE)广播中的厂商公司 ID,在 Meta、Snap 等智能眼镜靠近时发出警告。很多用户注意到一个差异:iOS 版只有"金丝雀模式"(Canary Mode),无法使用系统通知,而 Android 版两种都行。这其实是 iOS 与 Android 在后台蓝牙扫描能力上的根本差异决定的。本文带你彻底搞懂背后的原因,以及两款版本各自怎么用。

1. 工作原理:Nearby Glasses 靠什么发现智能眼镜

智能眼镜的蓝牙 MAC 地址是随机化的,服务 UUID 也不稳定,无法靠"扫描特定信标"来抓。Nearby Glasses 采用的是启发式匹配:

  • 厂商公司 ID:每只 BLE 设备的广播帧(ADV)头部都带有蓝牙 SIG 分配的厂商编号,例如0x01AB/0x058E(Meta)、0x0D53(Luxottica)、0x03C2(Snap)。这些编号不可变更、必须携带,是当前最可靠的识别依据;
  • 设备名匹配:配对期间眼镜会广播产品名,因此也会匹配rayban、ray-ban、HeyCyan等关键词;
  • RSSI 信号强度阈值:默认-75 dBm,大约对应开阔空间 10~15 米、室内 3~10 米。

这套检测逻辑在 iOS 和 Android 上是同一套,两端的识别名单来自仓库根目录的数据文件 smart_glasses_identifiers.csv。所以"只能金丝雀模式"与检测精度无关,纯粹是运行环境的限制。

⚠️ 注意:公司 ID 也可能来自同厂商的 VR 头显等其他蓝牙产品,误报是可能存在的。App 的 README 特意用大段警告提醒:不要因为 App 报警就去纠缠对方,这可能构成违法。请冷静判断、谨慎使用。

2. 为什么 iOS 版没有后台扫描?

2.1 iOS:CoreBluetooth 只允许前台扫描

iOS 的蓝牙核心框架是CoreBluetooth。Nearby Glasses 的 iOS 版通过CBCentralManager.scanForPeripherals扫描周边设备,核心代码在 BLEScanner.swift 中。

问题在于:iOS 对蓝牙的限制是——Central(中心)角色只能在应用处于前台时持续扫描,苹果没有开放类似 Android 前台服务的通用机制来让 App 在后台长期扫描 BLE 广播。

因此 iOS 版做了一个干脆利落的设计:App 一旦退到后台,扫描自动停止。相关逻辑就在 ContentView.swift 里:

  • 监听scenePhase变化,App 离开前台即调用stopScanning(backgrounded: true);
  • 日志里会写一条提示:"Scanning stops automatically when the app leaves the foreground."

扫描状态与停止逻辑集中在 ScannerStore.swift。

2.2 Android:Foreground Service 实现后台持续扫描

Android 提供了**前台服务(Foreground Service)**机制。Nearby Glasses 的 Android 版用 BluetoothScanService.kt 实现了它:

  • 服务带常驻通知运行,并声明FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE类型,防止系统杀进程;
  • 因此即使 App 锁屏、切到后台,蓝牙扫描照样进行,检测到智能眼镜后直接推送系统通知,你不用一直盯着屏幕。

在 Android 设置页中可以看到这个开关:"Enable Foreground Service — Run scanning as a foreground service to prevent being stopped by the system"。官方建议保持开启。

3. 金丝雀模式(Canary Mode)是什么?怎么用?

既然 iOS 上无法在后台弹系统通知,作者选择了另一种低干扰、可视化的报警方式——借鉴矿井里"金丝雀"的意象:

  • 平时:画面上显示一只平静的金丝雀,代表"周围没有智能眼镜,安全";
  • 检测到智能眼镜:金丝雀藏起来(CanaryHide),面板换成黄色警戒条纹背景 + 警示图标,持续一个冷却时间(默认 10 秒)后恢复。

对比项Android 版iOS 版
报警方式系统通知或金丝雀模式(可切换)仅金丝雀模式
后台扫描✅ Foreground Service❌ 退后台自动停止
扫描期间使用习惯可锁屏/切后台需保持 App 在前台
检测逻辑(公司 ID + 设备名 + RSSI)✅ 完全一致✅ 完全一致
最低系统Android 8.0+(minSdk 26)iOS 16+

在 Android 设置里,金丝雀模式(canary_mode)是新安装的默认模式,开启后系统通知、日志显示、Debug 等选项会被自动锁定,避免功能互相干扰(见 SettingsActivity.kt 中的refreshCanaryLocks)。金丝雀的绘制与状态切换在 Android 端由 MainActivity.kt 的renderCanaryCanvas负责,iOS 端对应 CanaryPanel.swift。

4. 两个平台的日常使用建议

📱Android 用户

  1. 打开 App,点Start Scanning,授予蓝牙/附近设备权限(Android 13 以下可能还要位置权限,App 本身不使用位置信息);
  2. 建议保持Enable Foreground Service开启,这样锁屏后依然持续监测;
  3. 推荐默认的通知模式(或金丝雀模式皆可),冷却时间默认 10 秒一般不用改。

🍎iOS 用户

  1. 确认 iOS 16 以上,从 App Store 安装(名字带 "original",用来和仿冒应用区分);
  2. 点Start Scanning并开始扫描,保持 App 在前台;
  3. 盯住金丝雀:它一"躲起来"并出现黄色警戒条纹,就说明附近可能出现了智能眼镜信号;
  4. 想记录证据?日志仅保存在本地,可随时导出为 txt 分享(数据只含 BLE 厂商 ID 码,隐私安全)。

5. 小结:差异不是 Bug,是平台能力边界

一句话总结:

  • 检测能力:iOS 与 Android 完全相同,都是扫描 BLE 广播中的厂商公司 ID + 设备名 + RSSI 过滤;
  • 差异根源:Android 有 Foreground Service 可后台常驻扫描并弹通知,iOS 的 CoreBluetooth 不允许中心角色后台长扫,App 离开前台就自动停止;
  • 金丝雀模式是 iOS 的唯一报警方式,也是 Android 上的可选模式——用"金丝雀是否藏起来"代替推送通知,前台使用时同样醒目。

如果你熟悉 Swift 和 iOS 内网 API(如 Multipeer/私有方案的可行性),项目作者也欢迎在 iOS/ 目录下提交改进的开源贡献,让 iOS 版早日拥有更"安静"的监测方式。

【免费下载链接】yj_nearbyglassesattempting to detect smart glasses nearby and warn you项目地址: https://gitcode.com/gh_mirrors/yj/yj_nearbyglasses

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询