2017-12-05 8 views
2

Xcode 9.2 및 iOS 11.1.2에 문제가 있습니다. "didDiscover"가 정상적으로 작동하고 연결을 호출하기 전에 주변 장치가 배열에 저장되지만 코드에서,Bluetooth didConnect 또는 didFailToConnect가 iOS 11.1.2와 함께 Xcode 9.2로 호출되지 않았습니다.

var myPeripheral:CBPeripheral? 

보다 : 이

var manager: CBCentralManager! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    manager = CBCentralManager(delegate: self, queue: nil) 
    //manager = CBCentralManager (delegate: self, queue: DispatchQueue.main) 
    //manager = CBCentralManager.init(delegate: self, queue: nil, options:[:]) 
    //manager.delegate = self 
} 

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 
    guard let name = peripheral.name else { return } 
    print("BR peripheral.name = \(name), rssi = \(RSSI), adertisementData = \(advertisementData)") 

    if (peripheral.name?.hasPrefix("testBT"))! { 
     peripheralArray.append(peripheral) 
     manager.connect(peripheralArray.first!, options: [:]) 
     print("Connecting to peripheral \(peripheral)") 
    } 
} 

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { 
    print("BT connected!") 
    manager.stopScan() 
    peripheral.delegate = self 
    peripheral.discoverServices(nil) 
} 

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { 
    print("BT disconnected!") 
} 

func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { 
    print("BT failed!") 
} 
+0

아마도 문제가 아니지만 주변 장치의 주변 장치 인 peripheralArea.append (peripheral); central.connect (peripheralArray.last !, options : [:])'당신은'central.connect (peripheralArray.last !, 옵션 : [:])'을 의미 했습니까? – Larme

+0

@Larme 지적 해 주셔서 고맙습니다. 나는 "중앙"에서 "관리자"로 바꿔서 다시 시도했지만 운은 없습니다. –

답변

1

변수 글로벌을 시도 도와주세요 ... "didConnect"또는 "didFailToConnect는"호출되지, 그래서 주변 상태가 "연결"에 남아있을 것입니다 편집 :

if (peripheral.name?.hasPrefix("testBT"))! { 
     myPeripheral = peripheral 
     //HERE WRITE DELEGATE, NOT IN didConnect 
     myPeripheral!.delegate = self 
     //peripheralArray.append(myPeripheral) 
     manager.connect(myPeripheral!, options: nil) 
     print("Connecting to peripheral \(peripheral)") 
    } 

이제는 제대로 작동해야한다고 생각합니다. 이상의 상태가

func centralManagerDidUpdateState(_ central: CBCentralManager) { 
    switch central.state{ 
    case .poweredOn: 
     startScan() // own method where i start scanning 
    case .poweredOff: 
     print("blth powered off") 
    case .unsupported: 
     print("bltyh noit supported") 
    } 
} 

등, 당신이 문서에서 확인할 수 있습니다 : 나는 또한 확인 블루투스가 작동 할 centralManagerDidUpdateState에 스캔을 시작 것처럼 떨어지게. (전무) : 자기, 큐 관리자 = CBCentralManager (위임)

그것은 당신이 거기에 연결된 주변 기기를 저장하는 배열을하고있다, BTW

을하는 데 도움이 희망 centralManagerDidUpdateState 방법은 vievDidLoad에 CBCentralManager var에 초기화 후에 호출에 beeing한다 . 배열을 저장 한 컨트롤러에서 돌아와 배열로 돌아 가면 배열이 다시 비어 있다는 것을 명심하십시오. 그래서 전 세계적으로 블루투스 클래스가 필요하다면 싱글 톤을 구현 한 BluetoothService 클래스를 만들 것을 제안합니다. 프로젝트의 모든 상태에 액세스 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 블루투스 싱글 톤 ^^ 모든 기능이 작동 중입니다. –