gpt4 book ai didi

ios - 设置监控后无法在 iOS 10 中检测到 iBeacon

转载 作者:行者123 更新时间:2023-11-28 15:49:26 25 4
gpt4 key购买 nike

我一直致力于使用 swift 3 和 Xcode 8.2.1 在 iOS 10 上检测 iBeacons。

我一直在关注 this教程,到目前为止,我已经能够在前台检测到信标。但是,我需要的是在后台以及应用程序关闭时检测到信标。

我已经设置了 key NSLocationAlwaysUsageDescriptioninfo.plist并添加了 Location updates在应用程序中 Background Modes .

我还请求 requestAlwaysAuthorization来自用户。

一切正常,直到我将以下语句添加到代码中:locationManager.startMonitoring(for: beaconRegion)

在我添加上述语句并运行代码后,我的应用程序检测到前台的信标并向我打印一条消息。但是,一旦我最小化该应用程序并重新打开它,该应用程序似乎就找不到信标了。如果我注释掉该行然后重新运行我的程序,该应用程序会检测到前景中的信标以及当我最小化并再次重新打开该应用程序时。我不明白我做错了什么。

这是我的 ViewController代码:

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager: CLLocationManager!

override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.allowsBackgroundLocationUpdates = true
locationManager.requestAlwaysAuthorization()
}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways {
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
if CLLocationManager.isRangingAvailable() {
startScanning()
}
}
}
}

func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
if beacons.count > 0 {
NSLog("Found beacon")
} else {
NSLog("Beacon not found")
}
}

func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
let beaconRegion = region as! CLBeaconRegion
print("Did enter region: " + (beaconRegion.major?.stringValue)!)
}

func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
let beaconRegion = region as! CLBeaconRegion
print("Did exit region: " + (beaconRegion.major?.stringValue)!)
}

func startScanning() {
let uuid = UUID(uuidString: "2f234454-cf6d-4a0f-adf2-f4911ba9ffa6")!
let beaconRegion = CLBeaconRegion(proximityUUID: uuid, major: CLBeaconMajorValue(0), minor: CLBeaconMinorValue(1), identifier: "MyBeacon")

beaconRegion.notifyEntryStateOnDisplay = true
beaconRegion.notifyOnEntry = true
beaconRegion.notifyOnExit = true

// locationManager.startMonitoring(for: beaconRegion)
locationManager.startRangingBeacons(in: beaconRegion)
}
}

这是我的日志的样子:

Found beacon
Found beacon
Found beacon
// App minimised and reopened here
Found beacon
Found beacon
Found beacon
Found beacon
Found beacon
Found beacon
Beacon not found
Beacon not found
Beacon not found
Beacon not found
Beacon not found
Beacon not found

最佳答案

尝试添加监控委托(delegate)回调 didEnter(region: region)didExit(region: region)。不知道为什么它会改变事情,有点不寻常的是代码开始监视但没有它们。

编辑:看到更新后的代码后,我怀疑问题可能出在测距开始的方式上。不要在 didChangeAuthorization 回调中启动它,只需在 viewDidLoad 中启动它。如果没有授权,代码不会崩溃。它只是在扫描之前不会真正扫描。

关于ios - 设置监控后无法在 iOS 10 中检测到 iBeacon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com