1

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) を呼び出すと、アプリはフォアグラウンド モードで動作します。

入口と出口のイベントまたは状態を取得しないため、これは最適ではありませんが、少なくともビーコン カウントは取得しています。

4

3 に答える 3

2

iOS 10 でのビーコン検出の問題について、いくつかの逸話的な報告があります。 症状は次のとおりです。

  • 特にアプリがバックグラウンドにある場合の不適切な領域終了イベントと、その後にショルダー ボタンが押された場合の開始イベント。
  • ビーコンが近くにある場合、空のビーコン リストを提供するコールバックを使用して、範囲指定されたビーコンの検出で定期的にドロップアウトします。
  • 範囲指定ビーコン コールバックは、iOS 9.x をターゲットとする別のビーコン範囲指定アプリまたは検出アプリが実行されている場合に、適切な結果を返します。

これはおそらく iOS アップデートで修正されるバグです。それまでは、一部のユーザーは、XCode でアプリの展開ターゲットを 9.x に設定すると問題が解決すると報告しています。

于 2016-09-22T13:57:46.407 に答える