2017-04-12 8 views
0

CoreBluetoothを使用して近くのビーコンをスキャンするiOSアプリケーションがあります。 しかし、ビーコンが範囲外であるかどうかを検出する必要があります。私はすでにアンドロイドでこのようなことをしていました:ビーコンが範囲外であるかを迅速に検出

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

    } 

アンドロイドでは、ビーコンは既にスキャンされていてもスキャンされます。だから私はタイムアウト方法を設定することができました。タイムアウト方法は、一定の時間(1分)でスキャンされないと自動的に配列から削除されます。

これは私の質問です: スウィフトでは、既に1回スキャンされていた場合はビーコンを2回スキャンすることができませんので、この方法が再び機能するとは思いません。ビーコンが範囲外で、それ以上スキャンできないかどうかをチェックする可能性はありますか?

答えて

0

あなたはスキャンを開始するときにCBCentralManagerScanOptionAllowDuplicatesKeyを指定場合は、実際にfunc centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)デリゲートメソッド、にiOSのCoreBluetoothから複数のコールバックを得ることができます。このように:

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

これが唯一のアプリケーションがフォアグラウンドにあるときに、同じ広告に対して複数のコールバックを取得することができますことを、しかし、注目に値します。バックグラウンドでは、このオプションは無視されます。

上記を使用して、Androidで行うようにタイムスタンプを使用して、ビーコンがしばらく見えていないことを確認し、それがもはや範囲内にないと判断することができます。

+0

私は試してこれが動作します。これで私は最終的に私がアンドロイドで持っていたソリューションを適応させることができます。ありがとうございました!ビーコンロス検出のネイティブサポートはありますか? –

+0

iOS上のネイティブビーコンサポートは、すべてCoreLocationを使用したiBeacon用です。また、識別子パターンに一致するビーコンが見えなくなったときに 'didExit(region:region)'コールバックをサポートしています。しかし、あなたがCoreBluetoothを話しているなら、特定の「CBPeripheral」が特定の時間内に検出されなかったときにあなたに伝えるネイティブAPIを認識していません。私の前提は、iBeaconを使用していないということです。なぜならAppleはこれらのAPIを使って広告を読んでブロックしているので、CoreBluetoothで検出できないからです。 – davidgyoung

関連する問題