Swift检测信标是否超出范围

时间:2017-04-12 13:02:11

标签: android iphone swift bluetooth-lowenergy beacon

我有一个iOS应用程序,使用CoreBluetooth扫描附近的Beacons。 但我必须检测信标是否超出范围。我已经在android中做了类似的事情:

 @Override
    public void run() {
        try {
            if(expirationTime <= 0) {
                device.setLost(true);
                if(!BeaconScanCallback.getBeaconScanCallbackInstance(activity).isInBackground())
                activity.getListAdapter().removeDevice(device);
                DeviceManager.getInstance().removeDevice(device);

                if(getLocation() != null) {
                    Log.i("AUTOLOST", "Device lost: " + device.getDeviceName() +  "   " + getLocation().getLatitude());
                    activity.postDeviceLocation(device, getLocation().getLatitude(), getLocation().getLongitude(), BeaconStatus.BEACON_LOST, "Device lost");
                }
            } else {
                expirationTime -= 1;
                if(isAccepted()) {
                    handler.postDelayed(new AutoLost(device), expirationTimer);
                }
            }
        } finally {
        }

    }

在Android中,即使已经扫描过一次,也会扫描信标。所以我能够设置一个超时方法,一旦在一定时间(1分钟)内没有扫描,它将自动从数组中删除它。

所以这是我的问题: 在Swift中,如果已经扫描过一次,我无法扫描两次信标,所以我不认为这种方法会再次起作用。是否有可能检查信标是否超出范围且不再可扫描(信标丢失)?

1 个答案:

答案 0 :(得分:0)

实际上,你可以从iOS上的CoreBluetooth到func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)委托方法获得多个回调,如果,则在开始扫描时指定CBCentralManagerScanOptionAllowDuplicatesKey。像这样:

centralManager.scanForPeripherals(withServices: uuids, 
        options: [CBCentralManagerScanOptionAllowDuplicatesKey: true] )

但值得注意的是,这只允许您在应用程序位于前台时为同一广告获取多个回调。在后台,此选项将被忽略。

使用上面的方法可以像在Android中一样使用时间戳来查看暂时没有看到信标的时间并确定它不再在范围内。