Je suis tout à fait nouveau pour la programmation iOS et je travaille avec Core Bluetooth dans Swift 3 pour connecter et échanger des données vers un périphérique spécifique (fait sur mesure). Si l'utilisateur sélectionne un mode spécifique dans l'application, j'ai besoin d'envoyer des données (caractéristiques d'écriture) à l'appareil à intervalles réguliers (chaque minute) ou à un moment précis même si l'utilisateur ouvre une autre application ou tourne l'écran de. Si l'application est active, je peux le faire avec un SchedulerTimer mais il s'arrête dès que l'application est devenue inactive. Il y a un moyen de continuer à envoyer des données au périphérique si l'application va au premier plan? Est-ce possible?Comment envoyer des données à un périphérique BLE sur une application IOS (swift) en arrière-plan?
Modifier
Voici mes modes d'arrière-plan (comme décrit par Deepak Tagadiya): Background Modes
Et ci-dessous un code de mon contrôleur:
class MyDevice: UIViewController {
var centralManager: CBCentralManager?
var selectedPeripheral: CBPeripheral?
var mRXCharacteristic: CBCharacteristic?
var mTXCharacteristic: CBCharacteristic?
var auto_timer = Timer()
@IBOutlet weak var AutoSwitch: UISwitch!
@IBAction func AutoSwitch(_ sender: UISwitch) {
if(sender.isOn == true){
activateAutoModeTask()
} else {
disableAutoModeTask()
}
}
override func viewDidLoad() {
super.viewDidLoad()
centralManager = CBCentralManager(delegate: self, queue: nil)
(…)
}
func activateAutoModeTask(){
auto_timer.invalidate() // just in case this button is tapped multiple times
// start the timer
auto_timer = Timer.scheduledTimer(timeInterval: 20, target: self, selector: #selector(updateTask), userInfo: nil, repeats: true)
}
func disableAutoModeTask(){
auto_timer.invalidate()
}
func updateTask(){
let new_value = getNewValue() //function that get the new value
send(text: new_value)
}
func send(text aText : String) {
(…)
self.selectedPeripheral?.writeValue(data, for: self.mRXCharacteristic!, type: .withResponse)
}
}
extension MyDevice: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
(…)
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
(…)
peripheral.delegate = self
selectedPeripheral = peripheral
}
}
l'extension MyDevice: CBPeripheralDelegate {
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
(...)
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
(…)
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
(…)
}
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
(…)
responseReceived(response: response_text)
}
}
donc je suis en mesure d'écrire sur le périphérique si l'application est active, mais pas quand l'application va en arrière-plan (si je clique sur le bouton Accueil par exemple). Peut-être qu'il manque encore quelque chose ...
Merci d'avance!
Non, il n'est pas possible d'initier le transfert de la centrale (votre application) sur une base temporisée lorsqu'il est en arrière-plan. Votre périphérique pourrait émettre une notification chaque minute qui déclencherait votre application qui pourrait alors écrire une valeur. – Paulw11
après 3 minutes, votre application n'est pas en mode vivant donc ce n'est pas possible. –
@ Paulw11 pouvez-vous me donner de la documentation ou quelque chose où je peux trouver l'information qui prend en charge votre réponse? – sergio32