Флаттер: IOS до IOS Не работает радиомаяк - PullRequest
2 голосов
/ 28 марта 2020

В настоящее время я создаю приложение, которое превращает мое устройство в маяк, одновременно сканируя другие маяки. Поэтому я могу отслеживать маяки, с которыми я соприкасался.


Проблема

Ток Я тестировал этот код в следующем сценарии ios:

  1. Android TO Android - Трансляция и сканирование - Хорошо работает
  2. Android До IOS - Broadcast & Scanning В обоих направлениях - Хорошо работает
  3. IOS до IOS - Не работает (Когда я транслирую UUID с устройства IOS, я вижу UUID на устройстве Android, но не вижу UUID на любом устройстве IOS.)

  • Я установил этот фрагмент кода на 4 устройствах (2 Android & 2 IOS). Теперь все 4 устройства передают разные UUID и одновременно прослушивают.
  • В Android Устройствах я вижу 1 UUID другого Android Устройства и 2 UUID из IOS Устройств
  • В IOS Устройствах, я вижу 2 Android UUID, но Я не вижу другого IOS устройства UUID.

Это очень странно, и мне нужна помощь, чтобы решить эту проблему, пожалуйста!


I В настоящее время реализованы 2 пакета для достижения этой функциональности:

(1) Для трансляции

beacon_broadcast: https://pub.dev/packages/beacon_broadcast версия: 0.2.1

(2) Для сканирования других маяков

flutter_blue: https://pub.dev/packages/flutter_blue версия: 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();
}

1 Ответ

1 голос
/ 28 марта 2020

К сожалению, вы не можете использовать FlutterBlue для обнаружения пакетов iBeacon на iOS.

Почему? FlutterBlue использует необработанное сканирование Bluetooth для обнаружения маяков, что под капотом означает использование собственных API-интерфейсов сканирования CoreBluetooth на iOS. Apple блокирует API-интерфейсы CoreBluetooth от чтения необработанных байтов любой рекламы Bluetooth, декодируемой как реклама iBeacon. Хотя это может показаться сумасшедшим, оно, вероятно, мотивировано ошибочными соображениями безопасности Apple. Читайте больше в моем блоге здесь: CoreBluetooth не позволяет вам видеть 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, позволяющий обнаруживать iBeacon на iOS) вместо CoreBluetooth. Это означает отказ от FlutterBlue в пользу FlutterBeacon или аналогичного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...