coreBluetooth BLEの検出
現在、xcode8.1 swift3.0.1を使用しているプログラミング初心者です。
逆引きswiftのcoreBluetooth 操作アプリのサンプルコードを入力しました。
http://docs.fabo.io/swift/corebluetooth/006_corebluetooth.html
コンパイル出来たのですが、実機の検索ボタンを押しても検出されません。
デバックエリアには以下のような表記がなされます。
[CoreBluetooth] XPC connection invalid
state CBManagerState
Bluetoothの電源はOn
原因が全くわからないのですが、何か分かる方いらっしゃいますでしょうか?
import UIKit
import CoreBluetooth
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CBCentralManagerDelegate, CBPeripheralDelegate{
var myTableView: UITableView!
var myUuids: [String] = []
var myNames: [String] = []
var myPeripheral: [CBPeripheral] = []
var myCentralManager: CBCentralManager!
var myTargetPeripheral: CBPeripheral!
let myButton: UIButton = UIButton()
let dataSets = NSMutableArray()
override func viewDidLoad() {
super.viewDidLoad()
// Status Barの高さを取得.
let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height
// Viewの高さと幅を取得.
let displayWidth = self.view.frame.width
let displayHeight = self.view.frame.height
// TableViewの生成( status barの高さ分ずらして表示 ).
myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
// Cellの登録.
myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
// DataSourceの設定.
myTableView.dataSource = self
// Delegateを設定.
myTableView.delegate = self
// Viewに追加する.
self.view.addSubview(myTableView)
// サイズ
myButton.frame = CGRect(x:0,y:0,width:200,height:40)
myButton.backgroundColor = UIColor.red;
myButton.layer.masksToBounds = true
myButton.setTitle("検索", for: UIControlState.normal)
myButton.setTitleColor(UIColor.white, for: UIControlState.normal)
myButton.layer.cornerRadius = 20.0
myButton.layer.position = CGPoint(x: self.view.frame.width/2, y:self.view.frame.height-50)
myButton.tag = 1
myButton.addTarget(self, action: #selector(ViewController.onClickMyButton
), for: .touchUpInside)
// UIボタンをViewに追加.
self.view.addSubview(myButton);
}
/*
ボタンイベント.
*/
func onClickMyButton(sender: UIButton){
// 配列をリセット.
myUuids = []
myNames = []
myPeripheral = []
// CoreBluetoothを初期化および始動.
myCentralManager = CBCentralManager(delegate: self, queue: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: - CBCentralManagerDelegate
func centralManagerDidUpdateState(_ central: CBCentralManager) {
print("state \(central.state)");
switch (central.state) {
case .poweredOff:
print("Bluetoothの電源がOff")
case .poweredOn:
print("Bluetoothの電源はOn")
// BLEデバイスの検出を開始.
myCentralManager.scanForPeripherals(withServices: nil, options:nil)
case .resetting:
print("レスティング状態")
case .unauthorized:
print("非認証状態")
case .unknown:
print("不明")
case .unsupported:
print("非対応")
}
}
/*
BLEデバイスが検出された際に呼び出される.
*/
func centralManager(central: CBCentralManager,
didDiscoverPeripheral peripheral: CBPeripheral,
advertisementData: [String : AnyObject],
RSSI: NSNumber!)
{
print("pheripheral.name: \(peripheral.name)")
print("advertisementData:\(advertisementData)")
print("RSSI: \(RSSI)")
print("peripheral.identifier.UUIDString: \(peripheral.identifier.uuidString)")
let kCBAdvDataLocalName = advertisementData["kCBAdvDataLocalName"] as? String
if let name = kCBAdvDataLocalName {
myNames.append(name)
} else {
myNames.append("no name")
}
myPeripheral.append(peripheral)
myUuids.append(peripheral.identifier.uuidString)
myTableView.reloadData()
}
/*
Cellが選択された際に呼び出される.
*/
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
print("Num: \(indexPath.row)")
print("Uuid: \(myUuids[indexPath.row])")
print("Name: \(myNames[indexPath.row])")
self.myTargetPeripheral = myPeripheral[indexPath.row]
myCentralManager.connect(self.myTargetPeripheral, options: nil)
}
/*
Cellの総数を返す.
*/
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return myUuids.count
}
/*
Cellに値を設定する.
*/
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier:"MyCell" )
// Cellに値を設定.
cell.textLabel!.sizeToFit()
cell.textLabel!.textColor = UIColor.red
cell.textLabel!.text = "\(myNames[indexPath.row])"
cell.textLabel!.font = UIFont.systemFont(ofSize: 20)
// Cellに値を設定(下).
cell.detailTextLabel!.text = "\(myUuids[indexPath.row])"
cell.detailTextLabel!.font = UIFont.systemFont(ofSize: 12)
return cell
}
/*
Peripheralに接続
*/
func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
print("connect")
// 遷移するViewを定義する.
let mySecondViewController: SecondViewController = SecondViewController()
print("setPeripheral")
mySecondViewController.setPeripheral(target: peripheral)
mySecondViewController.setCentralManager(manager: central)
mySecondViewController.searchService()
// アニメーションを設定する.
mySecondViewController.modalTransitionStyle = UIModalTransitionStyle.partialCurl
print(self.navigationController)
// Viewの移動する.
self.navigationController?.pushViewController(mySecondViewController, animated: true)
}
/*
Peripheralに接続失敗した際
*/
func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {
if let e = error {
print("Error: \(e.localizedDescription)")
return
}
print("not connnect")
}
}