Déconnecter un BLE périphérique en SWIFT
J'ai quelques problèmes pour déconnecter un BLE périphérique en Swift. Tout d'abord, j'ai essayé d'utiliser uniquement le cancelPeripheralConnection:
fonction. Mais si je viens d'appeler cette fonction, le didDisconnectPeripheral
fonction n'est jamais appelée. J'ai donc essayé de suivre Apple guide de référence. Il y a-dire, que vous devez supprimer toutes les notifications avant de le débrancher. Est-ce vraiment nécessaire? Et est-il possible d'annuler toutes les notifications en une seule étape? - Je configurer un grand nombre de notifications, j'ai donc à la recherche dans de nombreux services et caractéristiques à les rétablir. Je suppose, qui ne peut pas être un "bien fait" solution.
EDIT:
Ok j'ai compris, que le cancelPeripheralConnection
fonctionne assez bien, si je l'appelle dans mon BluetoothManager
classe, où CBCentralManager
et CBPeripheralDelegate
sont inclus... Est-il un moyen de déconnexion d'un périphérique à l'extérieur de cette fonction?
EDIT 4:
import UIKit
class ValueCollectionView: UICollectionViewController
{
var valueCollectionViewCell: ValueCollectionViewCell = ValueCollectionViewCell()
var bluetoothManager: BluetoothManager = BluetoothManager()
override func viewDidLoad()
{
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "back:")
self.navigationItem.leftBarButtonItem = newBackButton;
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
}
func back(sender: UIBarButtonItem)
{
bluetoothManager.disconnectPeripheral(selectedPeripheralIndex!)
self.navigationController?.popViewControllerAnimated(true)
}
//Some Collection View functions...
}
Et c'est ma mise en œuvre de la disconnectPeripheral
fonction (intégré dans la BluetoothManager classe):
func disconnectPeripheral(peripheralIndex: Int)
{
CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral)
}
Mais de toute façon, si j'appelle cette fonction, le didDisconnectPeripheral
fonction n'est pas appelée. Quand je mets la fonction dans le BluetoothManager catégorie par exemple, après que j'ai découvert la dernière caractéristique, tout fonctionne.
EDIT 5:
class BluetoothManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate
{
var CBmanager: CBCentralManager = CBCentralManager()
override init()
{
super.init()
self.CBmanager = CBCentralManager(delegate: self, queue: nil)
}
func connectPeripheral(peripheralIndex: Int)
{
CBmanager.connectPeripheral(peripheralArray![peripheralIndex].peripheral, options: nil)
}
func disconnectPeripheral(peripheralIndex: Int)
{
CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral)
}
//The other CentralManager functions...
}
J'ai ajouté mes deux classes différentes. Le BluetoothManager classe contient les fonctions déléguées et les ValueCollectionView classe doit débrancher le c? BLE de connexion lorsque vous appuyez sur le bouton retour.
Avoir les fonctions Bluetooth en vue contrôleur n'est pas une conception très bonne parce que vous êtes en mélangeant les deux fonctions et la nécessité de conserver une référence à une vue contrôleur peut ne pas être nécessaire. Il serait préférable de déplacer l'ensemble de vos fonctions Bluetooth dans un Bluetooth objet et passer une référence à l'objet en cas de besoin
J'ai essayé de la mettre en œuvre comme vous l'avez dit, mais le didDisconnectPeripheral fonction n'est pas appelée de toute façon.
Vous devez vous assurer que vous êtes seulement de l'instanciation d'une seule instance de Bluetooth de la classe (et donc CBCentral).
OriginalL'auteur Passe | 2015-10-21
Vous devez vous connecter pour publier un commentaire.
À votre premier doute, oui, nous devrions faire radier l'enregistrement d'abonné caractéristiques avant de se déconnecter de périphérique pour une raison que dans La Documentation D'Apple:
Maintenant, pour en venir à votre question -
Vous avez besoin de le débrancher de l'instance que vous instancié et a commencé connexion. Aussi longtemps que vous pouvez appeler à l'annulation sur le même objet, il doit travailler.
Dans mon application, j'ai eu à utiliser BLE dispose de plusieurs classes différentes qui m'a amené à écrire un singleton
MyBLEManager
et toutes les classes ont été à venir de ce singleton pour tous BLE des activités connexes. Cette offre fonctionne très bien et aide pour le dépannage de confinée à une seule classe. Vous pouvez essayer cela.Oui, c'est un problème. Vous devez créer classe singleton. Qui fonctionne comme un charme assurer qu'un objet de traiter de tous les temps.
OriginalL'auteur Abhinav