Flutter:IOS 到 IOS 广播信标不工作

Flutter : IOS to IOS Broadcast Beacon not working

我目前正在构建一个应用程序,将我的设备变成一个 Beacon,同时扫描其他 Beacon。 所以我可以跟踪我接触过的信标。


问题

目前我已经在以下场景中测试了这段代码:

  1. Android 到 Android - 广播和扫描 - 运作良好
  2. Android 至 IOS - 双向广播和扫描 - 运作良好
  3. IOS 到 IOS - 不工作(当我从 IOS 设备广播 UUID 时,我可以在 Android 设备中看到 UUID,但看不到 UUID在任何 IOS 设备中。)

这很奇怪,我需要帮助解决这个问题!


我目前已经实现了 2 个包来实现此功能:

(1) 广播

beacon_broadcast: https://pub.dev/packages/beacon_broadcast version : 0.2.1

(2) 扫描其他信标

flutter_blue: https://pub.dev/packages/flutter_blue version : 0.6.3+1


这些是我的代码的一部分

(1) 用于广播

String UUID = 'DYNAMIC_UUID_FOR_EACH_DEVICE';
static const MAJOR_ID = 1;
static const MINOR_ID = 30;
static const TRANSMISSION_POWER = -59;
static const IDENTIFIER = 'com.example.myDeviceRegion';
static const LAYOUT = 'm:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24';
static const MANUFACTURER_ID = 0x004c;

BeaconBroadcast beaconBroadcast = BeaconBroadcast();
beaconBroadcast
   .setUUID(UUID)
   .setMajorId(MAJOR_ID)
   .setMinorId(MINOR_ID)
   .setTransmissionPower(TRANSMISSION_POWER)
   .setIdentifier(IDENTIFIER)
   .setLayout(LAYOUT)
   .setManufacturerId(MANUFACTURER_ID);
   .start();

(2) 用于扫描

FlutterBlue flutterBlue = FlutterBlue.instance;
flutterBlue.startScan(timeout: Duration(seconds: 30));
flutterBlue.scanResults.listen((List<ScanResult> results) {
  print('scanningListen...');
  for (ScanResult result in results) {
      result.advertisementData.manufacturerData.forEach((item, hexcodeAsArray) => {
         print("calculated UUID String : " + calculateHexFromArray(v));
         _addToScanResult(calculateHexFromArray(v));
      });
  }
}
String calculateHexFromArray(decimalArray) {
  String uuid = '';
  decimalArray.forEach((i) => {uuid += i.toRadixString(16).padLeft(2, '0')});
  String uuid1 = uuid.substring(4, uuid.length - 12);
  return uuid1.toUpperCase();
}

遗憾的是,您无法使用 FlutterBlue 检测 iOS 上的 iBeacon 数据包。

为什么? FlutterBlue 使用原始蓝牙扫描来检测信标,这意味着在 iOS 上使用原生 CoreBluetooth 扫描 APIs。 Apple 阻止 CoreBluetooth APIs 读取任何可解码为 iBeacon 广告的蓝牙广告的原始字节。虽然这听起来很疯狂,但很可能是出于 Apple 误导的安全考虑。在我的博客 post 中阅读更多内容:CoreBluetooth Doesn't Let You See iBeacons

解决此问题的两个选项:

  1. 切换到使用 AltBeacon 格式。只需更改 LAYOUT = 'm:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25';MANUFACTURER_ID = 0x0118;

    这会起作用,但缺点是只能在前台 iOS 检测到广告。

  2. 切换到在 iOS 上使用不同的检测库,该检测库使用 CoreLocation(唯一 API 允许在 iOS 上检测 iBeacon)而不是 CoreBluetooth。这意味着放弃 FlutterBlue,转而使用 FlutterBeacon 或类似的东西。