CoreLocation 3 Monitoring iBeacon

Advance preparation Customize If you are monitoring the iBeacon, Always allow (NSLocationAlwaysUsageDescription) It is necessary to set in. <Key> NSLocationAlwaysUsageDescription </ key> <String> the acquisition of position information, do you always permitted? </ String> Program of the changes // Get the status of the security authentication. let status = CLLocationManager.authorizationStatus () print ( "authorizationStatus: \ (status)"); // If you have not yet authenticated is obtained, displays an authentication dialog // (Set of permitted only during the use of this App) if(status == notDetermined) { self.myLocationManager.requestAlwaysAuthorization() } Swift 3.0 // // // ViewController.swift // CoreLocation002 // // Copyright © 2016年 FaBo, Inc. All rights reserved. // import UIKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate, UITableViewDelegate, UITableViewDataSource { var myLocationManager:CLLocationManager! var myBeaconRegion:CLBeaconRegion! var beaconUuids: NSMutableArray! var beaconDetails: NSMutableArray! var myTableView: UITableView! // 今回の検知対象は3つのUUID。(OS等のバージョンで検出可能な上限数は20個程度が目安) let UUIDList = [ "9EDFA660-204E-4066-8644-A432AE2B6EC1", "9EDFA660-204E-4066-8644-A432AE2B6EC2", "9EDFA660-204E-4066-8644-A432AE2B6EC3" ] override func viewDidLoad() { super.viewDidLoad() // Table View. let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height let displayWidth: CGFloat = self.view.frame.width let displayHeight: CGFloat = self.view.frame.height myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight)) myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell") myTableView.dataSource = self myTableView.delegate = self myTableView.rowHeight = 50 self.view.addSubview(myTableView) // ロケーションマネージャの作成. myLocationManager = CLLocationManager() // デリゲートを自身に設定. myLocationManager.delegate = self // 取得精度の設定. myLocationManager.desiredAccuracy = kCLLocationAccuracyBest // 取得頻度の設定.(1mごとに位置情報取得) myLocationManager.distanceFilter = 1 // セキュリティ認証のステータスを取得 let status = CLLocationManager.authorizationStatus() print("CLAuthorizedStatus: \(status.rawValue)"); // まだ認証が得られていない場合は、認証ダイアログを表示 if(status == .notDetermined) { // [認証手順1] まだ承認が得られていない場合は、認証ダイアログを表示. // [認証手順2] が呼び出される myLocationManager.requestAlwaysAuthorization() } // 配列をリセット beaconUuids = NSMutableArray() beaconDetails = NSMutableArray() } /* CoreLocationの利用許可が取れたらiBeaconの検出を開始する. */ private func startMyMonitoring() { // UUIDListのUUIDを設定して、反応するようにする for i in 0 ..< UUIDList.count { // BeaconのUUIDを設定. let uuid: NSUUID! = NSUUID(uuidString: "\(UUIDList[i].lowercased())") // BeaconのIfentifierを設定. let identifierStr: String = "fabo\(i)" // リージョンを作成. myBeaconRegion = CLBeaconRegion(proximityUUID: uuid as UUID, identifier: identifierStr) // ディスプレイがOffでもイベントが通知されるように設定(trueにするとディスプレイがOnの時だけ反応). myBeaconRegion.notifyEntryStateOnDisplay = false // 入域通知の設定. myBeaconRegion.notifyOnEntry = true // 退域通知の設定. myBeaconRegion.notifyOnExit = true // [iBeacon 手順1] iBeaconのモニタリング開始([iBeacon 手順2]がDelegateで呼び出される). myLocationManager.startMonitoring(for: myBeaconRegion) } } /* [認証手順2] 認証のステータスがかわったら呼び出される. */ func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { print("didChangeAuthorizationStatus"); // 認証のステータスをログで表示 switch (status) { case .notDetermined: print("未認証の状態") break case .restricted: print("制限された状態") break case .denied: print("許可しない") break case .authorizedAlways: print("常に許可") // 許可がある場合はiBeacon検出を開始. startMyMonitoring() break case .authorizedWhenInUse: print("このAppの使用中のみ許可") // 許可がある場合はiBeacon検出を開始. startMyMonitoring() break } } /* [iBeacon 手順2] startMyMonitoring()内のでstartMonitoringForRegionが正常に開始されると呼び出される。 */ func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) { print("[iBeacon 手順2] didStartMonitoringForRegion"); // [iBeacon 手順3] この時点でビーコンがすでにRegion内に入っている可能性があるので、その問い合わせを行う // [iBeacon 手順4] がDelegateで呼び出される. manager.requestState(for: region); } /* [iBeacon 手順4] 現在リージョン内にiBeaconが存在するかどうかの通知を受け取る. */ func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion) { print("[iBeacon 手順4] locationManager: didDetermineState \(state)") switch (state) { case .inside: // リージョン内にiBeaconが存在いる print("iBeaconが存在!"); // [iBeacon 手順5] すでに入っている場合は、そのままiBeaconのRangingをスタートさせる。 // [iBeacon 手順6] がDelegateで呼び出される. // iBeaconがなくなったら、Rangingを停止する manager.startRangingBeacons(in: region as! CLBeaconRegion) break; case .outside: print("iBeaconが圏外!") // 外にいる、またはUknownの場合はdidEnterRegionが適切な範囲内に入った時に呼ばれるため処理なし。 break; case .unknown: print("iBeaconが圏外もしくは不明な状態!") // 外にいる、またはUknownの場合はdidEnterRegionが適切な範囲内に入った時に呼ばれるため処理なし。 break; } } /* [iBeacon 手順6] 現在取得しているiBeacon情報一覧が取得できる. iBeaconを検出していなくても1秒ごとに呼ばれる. */ func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) { // 配列をリセット beaconUuids = NSMutableArray() beaconDetails = NSMutableArray() // 範囲内で検知されたビーコンはこのbeaconsにCLBeaconオブジェクトとして格納される // rangingが開始されると1秒毎に呼ばれるため、beaconがある場合のみ処理をするようにすること. if(beacons.count > 0){ // STEP7: 発見したBeaconの数だけLoopをまわす for i in 0 ..< beacons.count { let beacon = beacons[i] let beaconUUID = beacon.proximityUUID; let minorID = beacon.minor; let majorID = beacon.major; let rssi = beacon.rssi; //print("UUID: \(beaconUUID.UUIDString) minorID: \(minorID) majorID: \(majorID)"); var proximity = "" switch (beacon.proximity) { case CLProximity.unknown : print("Proximity: Unknown"); proximity = "Unknown" break case CLProximity.far: print("Proximity: Far"); proximity = "Far" break case CLProximity.near: print("Proximity: Near"); proximity = "Near" break case CLProximity.immediate: print("Proximity: Immediate"); proximity = "Immediate" break } beaconUuids.add(beaconUUID.uuidString) var myBeaconDetails = "Major: \(majorID) " myBeaconDetails += "Minor: \(minorID) " myBeaconDetails += "Proximity:\(proximity) " myBeaconDetails += "RSSI:\(rssi)" print(myBeaconDetails) beaconDetails.add(myBeaconDetails) } } // TableViewのReflesh. myTableView.reloadData() } /* [iBeacon イベント] iBeaconを検出した際に呼ばれる. */ func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) { print("didEnterRegion: iBeaconが圏内に発見されました。"); // Rangingを始める (Ranginghあ1秒ごとに呼ばれるので、検出中のiBeaconがなくなったら止める) manager.startRangingBeacons(in: region as! CLBeaconRegion) } /* [iBeacon イベント] iBeaconを喪失した際に呼ばれる. 喪失後 30秒ぐらいあとに呼び出される. */ func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) { print("didExitRegion: iBeaconが圏外に喪失されました。"); // 検出中のiBeaconが存在しないのなら、iBeaconのモニタリングを終了する. manager.stopRangingBeacons(in: region as! CLBeaconRegion) } /* Cellが選択された際に呼び出される */ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("Num: \(indexPath.row)") print("Value: \(beaconUuids[indexPath.row])") } /* Cellの総数を返す. */ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return beaconUuids.count } /* Cellに値を設定する */ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 再利用するCellを取得する. let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "Cell") // Cellに値を設定する. cell.textLabel?.numberOfLines = 0 cell.textLabel!.font = UIFont(name: "Arial", size: 15) cell.textLabel!.textColor = UIColor.blue cell.textLabel!.text = beaconUuids[indexPath.row] as? String cell.detailTextLabel!.text = beaconDetails[indexPath.row] as? String return cell } } Swift 2.3 // // // ViewController.swift // CoreLocation002 // // Copyright © 2016年 FaBo, Inc. All rights reserved. // import UIKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate, UITableViewDelegate, UITableViewDataSource { var myLocationManager:CLLocationManager! var myBeaconRegion:CLBeaconRegion! var beaconUuids: NSMutableArray! var beaconDetails: NSMutableArray! var myTableView: UITableView! // 今回の検知対象は3つのUUID。(OS等のバージョンで検出可能な上限数は20個程度が目安) let UUIDList = [ "cb86bc31-05bd-40cc-906d-1c9bd13d966a", "9EDFA660-204E-4066-8644-A432AE2B6EC2", "9EDFA660-204E-4066-8644-A432AE2B6EC3" ] override func viewDidLoad() { super.viewDidLoad() // Table View. let barHeight: CGFloat = UIApplication.sharedApplication().statusBarFrame.size.height let displayWidth: CGFloat = self.view.frame.width let displayHeight: CGFloat = self.view.frame.height myTableView = UITableView(frame: CGRectMake(0, barHeight, displayWidth, displayHeight)) myTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "MyCell") myTableView.dataSource = self myTableView.delegate = self myTableView.rowHeight = 50 self.view.addSubview(myTableView) // ロケーションマネージャの作成. myLocationManager = CLLocationManager() // デリゲートを自身に設定. myLocationManager.delegate = self // 取得精度の設定. myLocationManager.desiredAccuracy = kCLLocationAccuracyBest // 取得頻度の設定.(1mごとに位置情報取得) myLocationManager.distanceFilter = 1 // セキュリティ認証のステータスを取得 let status = CLLocationManager.authorizationStatus() print("CLAuthorizedStatus: \(status)"); // まだ認証が得られていない場合は、認証ダイアログを表示 if(status == .NotDetermined) { // [認証手順1] まだ承認が得られていない場合は、認証ダイアログを表示. // [認証手順2] が呼び出される myLocationManager.requestAlwaysAuthorization() } // 配列をリセット beaconUuids = NSMutableArray() beaconDetails = NSMutableArray() } /* CoreLocationの利用許可が取れたらiBeaconの検出を開始する. */ private func startMyMonitoring() { // UUIDListのUUIDを設定して、反応するようにする for i in 0 ..< UUIDList.count { // BeaconのUUIDを設定. let uuid: NSUUID! = NSUUID(UUIDString: "\(UUIDList[i].lowercaseString)") // BeaconのIfentifierを設定. let identifierStr: String = "fabo\(i)" // リージョンを作成. myBeaconRegion = CLBeaconRegion(proximityUUID: uuid, identifier: identifierStr) // ディスプレイがOffでもイベントが通知されるように設定(trueにするとディスプレイがOnの時だけ反応). myBeaconRegion.notifyEntryStateOnDisplay = false // 入域通知の設定. myBeaconRegion.notifyOnEntry = true // 退域通知の設定. myBeaconRegion.notifyOnExit = true // [iBeacon 手順1] iBeaconのモニタリング開始([iBeacon 手順2]がDelegateで呼び出される). myLocationManager.startMonitoringForRegion(myBeaconRegion) } } /* [認証手順2] 認証のステータスがかわったら呼び出される. */ func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { print("didChangeAuthorizationStatus"); // 認証のステータスをログで表示 switch (status) { case .NotDetermined: print("未認証の状態") break case .Restricted: print("制限された状態") break case .Denied: print("許可しない") break case .AuthorizedAlways: print("常に許可") // 許可がある場合はiBeacon検出を開始. startMyMonitoring() break case .AuthorizedWhenInUse: print("このAppの使用中のみ許可") // 許可がある場合はiBeacon検出を開始. startMyMonitoring() break } } /* [iBeacon 手順2] startMyMonitoring()内のでstartMonitoringForRegionが正常に開始されると呼び出される。 */ func locationManager(manager: CLLocationManager, didStartMonitoringForRegion region: CLRegion) { print("[iBeacon 手順2] didStartMonitoringForRegion"); // [iBeacon 手順3] この時点でビーコンがすでにRegion内に入っている可能性があるので、その問い合わせを行う // [iBeacon 手順4] がDelegateで呼び出される. manager.requestStateForRegion(region); } /* [iBeacon 手順4] 現在リージョン内にiBeaconが存在するかどうかの通知を受け取る. */ func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) { print("[iBeacon 手順4] locationManager: didDetermineState \(state)") switch (state) { case .Inside: // リージョン内にiBeaconが存在いる print("iBeaconが存在!"); // [iBeacon 手順5] すでに入っている場合は、そのままiBeaconのRangingをスタートさせる。 // [iBeacon 手順6] がDelegateで呼び出される. manager.startRangingBeaconsInRegion(region as! CLBeaconRegion) break; case .Outside: print("iBeaconが圏外!") // 外にいる、またはUknownの場合はdidEnterRegionが適切な範囲内に入った時に呼ばれるため処理なし。 break; case .Unknown: print("iBeaconが圏外もしくは不明な状態!") // 外にいる、またはUknownの場合はdidEnterRegionが適切な範囲内に入った時に呼ばれるため処理なし。 break; } } /* [iBeacon 手順6] 現在取得しているiBeacon情報一覧が取得できる. iBeaconを検出していなくても1秒ごとに呼ばれる. */ func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) { // 配列をリセット beaconUuids = NSMutableArray() beaconDetails = NSMutableArray() // 範囲内で検知されたビーコンはこのbeaconsにCLBeaconオブジェクトとして格納される // rangingが開始されると1秒毎に呼ばれるため、beaconがある場合のみ処理をするようにすること. if(beacons.count > 0){ // STEP7: 発見したBeaconの数だけLoopをまわす for i in 0 ..< beacons.count { let beacon = beacons[i] let beaconUUID = beacon.proximityUUID; let minorID = beacon.minor; let majorID = beacon.major; let rssi = beacon.rssi; print("UUID: \(beaconUUID.UUIDString) minorID: \(minorID) majorID: \(majorID)"); var proximity = "" switch (beacon.proximity) { case CLProximity.Unknown : print("Proximity: Unknown"); proximity = "Unknown" break case CLProximity.Far: print("Proximity: Far"); proximity = "Far" break case CLProximity.Near: print("Proximity: Near"); proximity = "Near" break case CLProximity.Immediate: print("Proximity: Immediate"); proximity = "Immediate" break } beaconUuids.addObject(beaconUUID.UUIDString) var myBeaconDetails = "Major: \(majorID) " myBeaconDetails += "Minor: \(minorID) " myBeaconDetails += "Proximity:\(proximity) " myBeaconDetails += "RSSI:\(rssi)" print(myBeaconDetails) beaconDetails.addObject(myBeaconDetails) } // TableDataのReflesh. myTableView.reloadData() } } /* [iBeacon イベント] iBeaconを検出した際に呼ばれる. */ func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) { print("didEnterRegion"); // Rangingを始める (Ranginghあ1秒ごとに呼ばれるので、検出中のiBeaconがなくなったら止める) manager.startRangingBeaconsInRegion(region as! CLBeaconRegion) } /* [iBeacon イベント] iBeaconを喪失した際に呼ばれる. */ func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) { print("didExitRegion"); // iBeaconがなくなったら、Rangingを停止する manager.stopRangingBeaconsInRegion(region) } /* Cellが選択された際に呼び出される */ func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { print("Num: \(indexPath.row)") print("Value: \(beaconUuids[indexPath.row])") } /* Cellの総数を返す. */ func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return beaconUuids.count } /* Cellに値を設定する */ func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // 再利用するCellを取得する. let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") // Cellに値を設定する. cell.textLabel?.numberOfLines = 0 cell.textLabel!.font = UIFont(name: "Arial", size: 15) cell.textLabel!.textColor = UIColor.blueColor() cell.textLabel!.text = beaconUuids[indexPath.row] as? String cell.detailTextLabel!.text = beaconDetails[indexPath.row] as? String return cell } } 2.xと3.xの差分 locationManager(manager: ...が、locationManager(_ manager: ... に変更

Be the first to comment

You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.