2017-04-12 3 views
0

Ich habe eine iOS App, die in der Nähe befindliche Beacons mit CoreBluetooth scannt. Aber ich muss erkennen, wenn ein Beacon außer Reichweite ist. Ich habe schon so etwas wie dies in android:Schnelle Erkennung, wenn Beacon außerhalb des Bereichs liegt

@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 { 
     } 

    } 

In android ein Leuchtfeuer gescannt wird, obwohl es bereits einmal gescannt wurde. So konnte ich eine Timeout-Methode festlegen, die sie automatisch aus einem Array entfernt, sobald sie in einer bestimmten Zeit (1 Minute) nicht gescannt wurde.

Also hier ist meine Frage: In Swift kann ich ein Beacon nicht zweimal scannen, wenn es schon einmal gescannt wurde, also glaube ich nicht, dass diese Methode wieder funktioniert. Gibt es eine Möglichkeit zu überprüfen, ob ein Beacon außerhalb der Reichweite ist und nicht mehr scannen kann (Beacon verloren)?

Antwort

0

Sie können tatsächlich mehrere Rückrufe von CoreBluetooth auf iOS zu dem func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) Delegatmethode erhalten, wenn Sie die CBCentralManagerScanOptionAllowDuplicatesKey angeben, wenn Sie mit dem Scannen beginnen. Wie folgt aus:

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

Es ist erwähnenswert, jedoch, dass dies nur erlaubt Ihnen, mehrere Rückrufe für die gleiche Anzeige zu erhalten, wenn die App im Vordergrund steht. Im Hintergrund wird diese Option ignoriert.

Mit dem oben genannten ist es möglich, einen Zeitstempel wie in Android zu verwenden, um zu sehen, wenn der Beacon seit einiger Zeit nicht mehr gesehen wurde und festzustellen, dass er nicht mehr in Reichweite ist.

+0

Ich habe versucht und das funktioniert. Damit kann ich endlich die Lösung, die ich in Android hatte, anpassen. Vielen Dank! Gibt es eine native Unterstützung für die Erkennung von Beacon-Loss? –

+0

Nun, native Beacon-Unterstützung auf iOS ist alles für iBeacon mit CoreLocation. Und, ja, es unterstützt einen "didExit (region: region)" Callback, wenn Beacons, die einem Bezeichnermuster entsprechen, nicht mehr gesehen werden. Wenn Sie über CoreBluetooth sprechen, sind mir jedoch keine nativen APIs bekannt, die Ihnen sagen, wann ein bestimmtes 'CBPeripheral' in einer bestimmten Zeit nicht erkannt wurde. Meine Vermutung ist, dass Sie nicht iBeacon verwenden, denn wenn Sie es wären, wären Sie sowieso nicht in der Lage, sie mit CoreBluetooth zu erkennen, da Apple das Lesen ihrer Werbung mit diesen APIs blockiert. – davidgyoung

Verwandte Themen