如何在后台定期向 IOS(swift)应用程序上的 BLE 外设发送数据?

ser*_*o32 5 ios core-bluetooth bluetooth-lowenergy swift

我对 iOS 编程相当陌生,我正在使用 Swift 3 中的核心蓝牙来连接特定(定制)ble 外设并交换数据。

\n\n

如果用户在应用程序中选择特定模式,即使用户打开另一个应用程序或关闭屏幕,我也需要定期(每分钟)或在特定时间向设备发送数据(写入特征)。如果应用程序处于活动状态,我可以使用预定计时器来实现此目的,但一旦应用程序变为非活动状态,它就会停止。如果应用程序进入前台,有什么方法可以继续向外设发送数据?这可能吗?

\n\n

编辑

\n\n

这是我的背景模式(如 Deepak Tagadiya 所描述):\n背景模式

\n\n

下面是我的控制器的一些代码:

\n\n
class MyDevice: UIViewController {\n\nvar centralManager: CBCentralManager?\nvar selectedPeripheral: CBPeripheral?\nvar mRXCharacteristic: CBCharacteristic?\nvar mTXCharacteristic: CBCharacteristic?\nvar auto_timer = Timer()\n\n\n@IBOutlet weak var AutoSwitch: UISwitch!\n@IBAction func AutoSwitch(_ sender: UISwitch) {\n        if(sender.isOn == true){\n            activateAutoModeTask()\n        } else {\n           disableAutoModeTask()\n        }\n\n}\n\noverride func viewDidLoad() {\n    super.viewDidLoad()\n\n    centralManager = CBCentralManager(delegate: self, queue: nil)   \n    (\xe2\x80\xa6)\n}\n\nfunc activateAutoModeTask(){\n\n\n    auto_timer.invalidate() // just in case this button is tapped multiple times\n\n    // start the timer\n    auto_timer = Timer.scheduledTimer(timeInterval: 20, target: self, selector: #selector(updateTask), userInfo: nil, repeats: true)\n\n}\n\nfunc disableAutoModeTask(){\n    auto_timer.invalidate()\n}\n\nfunc updateTask(){\n    let new_value = getNewValue() //function that get the new value\n\n\n    send(text: new_value)\n}\n\nfunc send(text aText : String) {\n    (\xe2\x80\xa6)\n    self.selectedPeripheral?.writeValue(data, for: self.mRXCharacteristic!, type: .withResponse)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

扩展 MyDevice: CBCentralManagerDelegate {

\n\n
func centralManagerDidUpdateState(_ central: CBCentralManager) {\n    (\xe2\x80\xa6) \n}\n\nfunc centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {\n    (\xe2\x80\xa6)\n    peripheral.delegate = self\n    selectedPeripheral = peripheral\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

扩展 MyDevice: CBPeripheralDelegate {

\n\n
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {\n    (...)\n}\n\n\nfunc peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {\n    (\xe2\x80\xa6)\n}\n\nfunc peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {\n    (\xe2\x80\xa6)\n}\n\nfunc peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {\n    (\xe2\x80\xa6)\n\n    responseReceived(response: response_text)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

因此,如果应用程序处于活动状态,我可以写入外围设备,但当应用程序进入后台时(例如,如果我单击“主页”按钮),则不能写入外围设备。也许还缺少一些东西......

\n\n

提前致谢!

\n

Poo*_*pta 2

我也面临同样的问题并通过这样做解决了它。根据您的功能要求启用后台模式功能。

在此输入图像描述

希望对你有帮助。