Swift2.2 アプリの開発は進んだ段階にあるため、暫定的に 2.3 に移行し、後で完全な Swift 3 移行を行うことにしました。ただし、Swift 2.3 への変換後にビーコン検出を機能させることができません。メソッド「didRangeBeacons」は空の配列を返し続けます。同じコードが Swift 2.2 で機能していたので、すべてのアクセス許可などが適切に設定されていることがわかります。
また、同じ iPad で「Locate」アプリを開くと、アプリも「didRangeBeacons」でデータを返し始めます。さまざまなバージョンのアプリを試してみましたが、すべての Swift2.3 アプリが同じように動作しています。ロケートアプリが何をしているのかわかりません...同じボートに乗っている人はいますか??
これが私たちが使用しているコードです。これがここまたはコメントに書かれるべきかどうかはわかりませんが、どういうわけかコメント内にコードを入れることができませんでした...
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
let region = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "9735BF2A-0BD1-4877-9A4E-103127349E1D")!, identifier: "testing")
// Note: make sure you replace the keys here with your own beacons' Minor Values
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.locationManager.delegate = self
self.locationManager.requestAlwaysAuthorization()
self.locationManager.startMonitoringForRegion(self.region)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManager(manager: CLLocationManager, didStartMonitoringForRegion region: CLRegion) {
print("didStartMonitoringForRegion")
self.locationManager.requestStateForRegion(region)
}
func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) {
print("monitoringDidFailForRegion")
}
func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) {
print("didDetermineState")
if state == .Inside {
//Start Ranging
self.locationManager.startRangingBeaconsInRegion(self.region)
self.locationManager.startUpdatingLocation()
}
else {
//Stop Ranging here
self.locationManager.stopUpdatingLocation()
self.locationManager.stopRangingBeaconsInRegion(self.region)
}
}
func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
print(beacons.count)
}
}
[これを機能させるためのいくつかの試行を投稿してください] self.locationManager.startMonitoringForRegion(self.region) を削除し、self.locationManager.requestAlwaysAuthorization() の直後に self.locationManager.startRangingBeaconsInRegion(self.region) を呼び出すと、アプリはフォアグラウンド モードで動作します。
入口と出口のイベントまたは状態を取得しないため、これは最適ではありませんが、少なくともビーコン カウントは取得しています。