必要な Bluetooth デバイスの RSSI がオフセット値よりも強い場合、iOS と CoreBluetooth を使用してある種の HTTP 要求をトリガーしたいと考えています。
// Listen to centralManager state
func centralManagerDidUpdateState(central: CBCentralManager) {
switch(central.state){
case CBCentralManagerState.PoweredOff:
stopScanningForPeripherals()
break
case CBCentralManagerState.PoweredOn:
startScanningForPeripherals()
break
case CBCentralManagerState.Resetting:
break
case CBCentralManagerState.Unauthorized:
break
case CBCentralManagerState.Unknown:
break
case CBCentralManagerState.Unsupported:
break
}
}
// Start scanning peripherals
func startScanningForPeripherals(){
print("Start scanning for peripherals \(cbuuid)")
if(cbuuid == nil){
self.centralManager.scanForPeripheralsWithServices(nil, options: nil)
}else{
self.centralManager.scanForPeripheralsWithServices([cbuuid!], options: nil)
}
}
// Callback when received scanning results
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
print("\(RSSI.intValue) \(peripheral.identifier.UUIDString) != \(appSettings.listeningPeripheralIdentifier?.UUIDString)")
if(!peripheral.identifier.isEqual(appSettings.listeningPeripheralIdentifier)){
return;
}
if(RSSI.intValue == 127 || RSSI.integerValue < appSettings.rssiOffset){
return;
}
httpGateway.postDetectBeacon((appSettings.listeningPeripheralIdentifier?.UUIDString)!, userId: appSettings.userId, callback: { isOk in
print("Sent detect beacon request")
})
}
// Stop scanning
func stopScanningForPeripherals(){
print("Stop scanning for peripherals")
self.centralManager.stopScan()
}
フォアグラウンド タスク バージョン (内部に配置UIViewController
) とバックグラウンド タスク バージョン (内部に配置AppDelegate
してバックグラウンド フックを設定) を実装してみました。その結果、アドバタイズ パケットを受信する頻度は、フォアグラウンド タスク バージョンの方がはるかに優れています。しかし、フォアグラウンド タスク バージョンは、アプリがバックグラウンドにあるときに受信を停止し、アプリがバックグラウンドにある間も作業を実行したいと考えています。
だから私が欲しいのは、広告パケットを受信するアプリです
- アプリがフォアグラウンドにあるときの頻度が高い
- アプリがバックグラウンドにあるときの頻度が低い
両方とも単一のコード ベースであり、自動的に切り替えられます。出来ますか?もしそうなら、上記のコードをどこに書くべきですか?