2017-10-30 38 views
0

バックグラウンドでBLEと接続しようとしていますが、バックグラウンドで接続しませんでした。 私のアプリがフォアグラウンドで動作しています。 周辺機器のUUIDでスキャンしようとしています。 添付のコードはこちらです。バックグラウンドスキャン迅速なBLE

override func viewDidLoad() { 
     super.viewDidLoad() 

     manager = CBCentralManager(delegate: self, queue: nil) 

    } 


    func centralManagerDidUpdateState(_ central: CBCentralManager) { 

     var msg = "" 

     switch central.state { 

      case .poweredOff: 
       msg = "Bluetooth is Off" 
      case .poweredOn: 
       msg = "Bluetooth is On" 
       let arrayOfServices: [CBUUID] = [CBUUID(string: "CCAExxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")] 

       manager?.scanForPeripherals(withServices:arrayOfServices, options: nil) 
      case .unsupported: 
       msg = "Not Supported" 
      default: 
       msg = "Not Connected" 

     } 

     print("STATE: " + msg) 

    } 

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 

     print("Name: \(peripheral.name)") //print the names of all peripherals connected. 

     //you are going to use the name here down here ⇩ 

     if peripheral.name == "Name of device" { //if is it my peripheral, then connect 

      self.myBluetoothPeripheral = peripheral  //save peripheral 
      self.myBluetoothPeripheral.delegate = self 

      manager.stopScan()       //stop scanning for peripherals 
      manager.connect(myBluetoothPeripheral, options: nil) //connect to my peripheral 

     } 
    } 

どのように解決できますか?

+0

なぜバックグラウンドでデバイスに接続しますか?あなたがバックグラウンドで接続することができたら、あなたが何をしたいのかを正確に教えてくれますか? – EmirC

+0

これはいくつかのデータ、すなわちハートビットを送信するためのものであり、任意のデータである可能性があります.iはscanForPeripheralsメソッドのoptionsパラメータにnilを指定しています。 – user12346

+0

デバイス名を確認するifを削除し、何が起こるかを確認します。既知の周辺機器を認識するためには、名前ではなく識別子を使用する必要があります。バックグラウンドでスキャンするときは名前を使用できません – Paulw11

答えて

0

[背景モード]機能をオンにします。

以下の2つのオプションをオンにしてください。 1.ユーザーのBluetooth LEアクセサリ。 2. Bluetooth LEアクセサリとして動作します。

同じスクリーンショットのように実行します。

enter image description here

今BLEは、iOSアプリケーションのバックグラウンドモードで動作しています。

0

CentralManagerをインスタンス化するときに、復元識別子でインスタンス化する必要があります。

例:それは「コアBluetoothは復元識別子を持つオブジェクトのみの状態を維持する」と言うリンゴのドキュメントのように

CBCentralManager(delegate: self,options: 
[CBCentralManagerOptionRestoreIdentifierKey: "bleCentralManager"]) 

これが必要です。その後

アプリがあなたの内側同じ復元識別子appDelegateのアプリケーションを使用して、適切な中央マネージャを再インスタンス化する必要が背景にリニューアルされた:didFinishLaunchingWithOptions:

let centralManagerIdentifiers = launchOptions![UIApplicationLaunchOptionsKey.bluetoothCentrals] 
:method.Youは次のように復元識別子を取得することができます

最後に、セントラルマネージャーのCentralManager(_ central:CBCentralManager、willRestoreState dict:[String:Any])デリゲートメソッドで、セントラルマネージャーが接続された、または接続しようとしていたすべての周辺機器のリストを取得して、この方法で行う。

func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) { 

    let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey] 

}