2017-04-12 9 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 분)에 스캔되지 않는 즉시 배열에서 그것을 자동적으로 제거 할 타임 아웃 방법을 설정할 수 있었다.

여기 내 질문이 있습니다. 스위프트에서 이미 한 번 스캔 된 경우 비컨을 두 번 스캔 할 수 없으므로이 방법이 다시 작동하지 않는다고 생각합니다. 비콘이 범위를 벗어나서 더 이상 스캔 할 수 없는지 확인하는 가능성이 있습니까 (비컨 손실)? 스캔을 시작할 때 CBCentralManagerScanOptionAllowDuplicatesKey를 지정 경우

답변

0

당신은 실제로 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