我正在尝试检测用户是否在附近或输入我想要的位置。我正在使用CLLocationManager
监视此操作,但是由于某些原因它不起作用。我在当前位置,但未调用didEnterRegion
。这是我的代码:
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
let center = CLLocationCoordinate2D(latitude: lat, longitude: long)
if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
// Register the region.
let maxDistance = locationManager.maximumRegionMonitoringDistance
let region = CLCircularRegion(center: center,
radius: maxDistance, identifier: "identifier")
region.notifyOnEntry = true
region.notifyOnExit = false
locationManager.startMonitoring(for: region)
}
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if region is CLCircularRegion {
print("entered....")
}
}
我还在plist文件中添加了隐私说明:
如何解决此问题?
编辑:
requestState(for region:)
和didDetermineState:for:
现在可以使用,但是如何检查用户是在附近还是在该位置?例如,如果用户在附近或区域内,则执行某项操作,否则执行其他操作。编辑2
let center = CLLocationCoordinate2D(latitude: lat, longitude: long)
let region = CLCircularRegion(center: center, radius: 1000, identifier: "Store")
let controller = LocationController()
controller.requestWhenInUseAuthorization()
controller.requestState(for: region) { (state) in
switch state {
case .inside:
print("inside region")
case .outside:
print("outside region")
case .unknown:
print("unknown")
}
}
最佳答案
如果您在模拟器上运行此程序,则看到的结果与在设备上运行时所看到的结果不同
例如,如果您已经在定义的区域内,则可以使用模拟器进行测试。您可能并不总是能获得理想的结果。出于某种原因,如果您位于打开电源时要检测的区域内,则模拟器不喜欢它。
此外,在我自己使用信标进行了许多测试之后,结果发现在模拟器上与区域的距离不准确。使用模拟器时,这通常是错误的。计算机和信标之间的任何物理干扰也会严重影响它。该区域中的许多其他设备和金属设备可能会由于报告正确的数据而严重影响您的模拟器。
我建议在物理设备上测试所有代码。
使用应用程序加载设备时。从计算机上拔下设备的电源,然后打开信标区域之外的应用程序。
为了进行进一步和更好的测试,您可以在应用程序上创建自己的本地“调试器”,因此在使用设备时,无需连接计算机即可查看所需的信息。
关于ios - CLLocationManager的didEnterRegion有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60277501/