信标接近检测器在 iOS swift 中不工作
beacon proximity detector not working in iOS swift
我正在构建一个应用程序,该应用程序使用 iPhone 6 中的定位信标应用程序和 iPhone 7 中的我的应用程序来检测 Beacon 设备接近度,但应用程序无法检测到 Beacon 发射器。我输入了正确的 UUID 和 Major Minor 编号,但它不起作用。我在 iPhone 7 iOS 13.5 和 iPhone 6 iOS 12 上 运行 它没有检测到。
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var distancestatuslbl: UILabel!
var locationmanager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationmanager = CLLocationManager()
locationmanager.delegate = self
locationmanager.requestAlwaysAuthorization()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways
{
print("Allowed any time")
startScanning()
}
else if status == .authorizedWhenInUse
{
print("Allowed only during run time")
startScanning()
}
}
func startScanning() {
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self)
{
let uuid = UUID(uuidString: "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6")
let majornumber: CLBeaconMajorValue = 123
let minornumber: CLBeaconMinorValue = 456
let beaconregion = CLBeaconRegion(uuid: uuid!, major: majornumber, minor: minornumber, identifier: "com.mybeacon")
locationmanager.startMonitoring(for: beaconregion)
print("Started scanning")
}
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if region is CLBeaconRegion
{
if CLLocationManager.isRangingAvailable()
{
locationmanager.startRangingBeacons(in: region as! CLBeaconRegion)
print("Starting ranging...")
}
}
}
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
let nearestbeacon = beacons.first!
switch nearestbeacon.proximity {
case .near:
distancestatuslbl.text = "Near"
break
case .immediate:
distancestatuslbl.text = "Immediate"
break
case .far:
distancestatuslbl.text = "Far"
break
default:
print("sdf")
}
}
}
您可能需要在 viewDidLoad
中调用 startScanning()
。如所写,它仅在首次授予权限后调用,这意味着它仅在您第一次 运行 应用程序并授予权限时启动,然后再也不会启动。
此外,通过 运行在与您的应用相同的 phone 上使用定位应用,检查信标是否确实在传输。 Locate 是否检测到?
我正在构建一个应用程序,该应用程序使用 iPhone 6 中的定位信标应用程序和 iPhone 7 中的我的应用程序来检测 Beacon 设备接近度,但应用程序无法检测到 Beacon 发射器。我输入了正确的 UUID 和 Major Minor 编号,但它不起作用。我在 iPhone 7 iOS 13.5 和 iPhone 6 iOS 12 上 运行 它没有检测到。
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var distancestatuslbl: UILabel!
var locationmanager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationmanager = CLLocationManager()
locationmanager.delegate = self
locationmanager.requestAlwaysAuthorization()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways
{
print("Allowed any time")
startScanning()
}
else if status == .authorizedWhenInUse
{
print("Allowed only during run time")
startScanning()
}
}
func startScanning() {
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self)
{
let uuid = UUID(uuidString: "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6")
let majornumber: CLBeaconMajorValue = 123
let minornumber: CLBeaconMinorValue = 456
let beaconregion = CLBeaconRegion(uuid: uuid!, major: majornumber, minor: minornumber, identifier: "com.mybeacon")
locationmanager.startMonitoring(for: beaconregion)
print("Started scanning")
}
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if region is CLBeaconRegion
{
if CLLocationManager.isRangingAvailable()
{
locationmanager.startRangingBeacons(in: region as! CLBeaconRegion)
print("Starting ranging...")
}
}
}
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
let nearestbeacon = beacons.first!
switch nearestbeacon.proximity {
case .near:
distancestatuslbl.text = "Near"
break
case .immediate:
distancestatuslbl.text = "Immediate"
break
case .far:
distancestatuslbl.text = "Far"
break
default:
print("sdf")
}
}
}
您可能需要在 viewDidLoad
中调用 startScanning()
。如所写,它仅在首次授予权限后调用,这意味着它仅在您第一次 运行 应用程序并授予权限时启动,然后再也不会启动。
此外,通过 运行在与您的应用相同的 phone 上使用定位应用,检查信标是否确实在传输。 Locate 是否检测到?