Swift iBeacon 只有一个信标被监控
Posted
技术标签:
【中文标题】Swift iBeacon 只有一个信标被监控【英文标题】:Swift iBeacon only one beacon got monitored 【发布时间】:2015-09-18 06:44:28 【问题描述】:我的桌子上有 3 个信标,所有三个都具有相同的 UUID,但主要和次要编号不同。我希望看到 3 个信标进入和退出事件,但只有一个显示。
我已经进行了 didEnter 和 didExit 区域,到目前为止,我始终只看到 1 个信标,当我进入和退出信标范围时,同一个信标会收到通知。
从我们的 Parse 帐户下载信标数据列表,我正在循环所有这些数据并告诉 ios 监控信标:
func downloadBeacons()
var query:PFQuery = PFQuery(className: "Beacon");
query.findObjectsInBackgroundWithBlock (objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil
NSLog("Beacons = ", objects!);
if let objects = objects as? [PFObject]
for beacon in objects
NSLog("------------------------");
NSLog("Beacon UUID = %@", beacon["UUID"] as! NSString);
NSLog("Beacon major number = %@", beacon["major"] as! NSString);
NSLog("Beacon minor number = %@", beacon["minor"] as! NSString);
NSLog("Beacon manufactureID = %@", beacon["manufacturerId"] as! NSString);
NSLog("Beacon manufacture = %@", beacon["manufacturer"] as! NSString);
var uuid:NSUUID = NSUUID(UUIDString: beacon["UUID"] as! String)!;
var majorValue:UInt16 = self.stringToUnsignedInt16(beacon["major"] as! String);
var minorValue:UInt16 = self.stringToUnsignedInt16(beacon["minor"] as! String);
// start monitoring each beacon?
var beaconObj = BeaconModel(name: beacon["manufacturerId"] as! NSString,
uuid: uuid,
majorValue: majorValue,
minorValue: minorValue,
manufacturer: beacon["manufacturer"] as! NSString);
self.startMonitoringBeaconObj(beaconObj);
else
NSLog("Error: \(error!) \(error!.userInfo!)");
我的 startMonitoringBeacon 方法如下:
func startMonitoringBeaconObj(beaconObj:BeaconModel)
var beaconRegion:CLBeaconRegion = self.beaconRegionWithBeaconObj(beaconObj);
LocationManager.sharedInstance.manager.startMonitoringForRegion(beaconRegion);
LocationManager.sharedInstance.manager.startRangingBeaconsInRegion(beaconRegion);
这是我的辅助方法:
func beaconRegionWithBeaconObj(beaconObj:BeaconModel) -> CLBeaconRegion
var beaconRegion:CLBeaconRegion = CLBeaconRegion(proximityUUID: beaconObj.uuid, major: beaconObj.majorValue, minor: beaconObj.minorValue, identifier: beaconObj.manufacturer as! String);
beaconRegion.notifyOnEntry = true;
beaconRegion.notifyOnExit = true;
return beaconRegion;
我错过了什么吗?
【问题讨论】:
【参考方案1】:区域监控基于 UUID,因此由于您的 UUID 相同,didEnterRegion:
和 didExitRegion:
都将被调用一次。但是,信标测距会返回具有该 UUID(不同的主要和次要值)的所有种类的信标。
如果您附近有 3 个信标(正如您提到的所有 3 个都坐在桌子上)广播相同的 UUID,那么侦听器只会在 didEnterRegion
中收到一次回调。您可以尝试将三个信标保持在远处,然后移动侦听器。您应该会看到 didEnterRegion
被调用了 3 次,前提是 didExitRegion:
在您再次进入同一区域之前被调用过。
【讨论】:
我不是在问为什么didEnterRegion
和 didExitRegion
被调用一次,我是在问为什么我的所有三个信标设备都没有对 didEnterRegion 和 didExitRegion 做出反应?
你对didEnterRegion
没有反应是什么意思?我在帖子中添加了更多解释。
我尝试将另外两个信标移到我家的角落,这样它们之间的距离就会超过 10 米。只有同一个信标对我的 iPhone 有反应,另外两个没有反应。它们是 Kontakt 信标,我已经下载了 Kontakt 应用程序,它显示所有三个信标的电池寿命都在 90% 左右。
这也是意料之中的。区域监控以 +、- 150m 的精度工作。如果您看过 2012 年的 WWDC 视频,其中 Apple 展示了 Apple Store 客户行为,客户一到停车场就会收到通知。因此,即使您有 3 个 UUID 相距 > 10 m 的信标,您仍然只能找到一个信标。如果您真的想测试它,最好使用 3 UUID 并听所有三个 :)!我希望我说清楚了。
不知道到底发生了什么或我做了什么,但不知何故,所有三个信标现在都在工作 =/ 很奇怪。以上是关于Swift iBeacon 只有一个信标被监控的主要内容,如果未能解决你的问题,请参考以下文章
cordova-plugin-ibeacon:当监控发现信标时,主要/次要不可用
iBeacon 监控具有相同 UUID 和不同主要、次要的多个信标