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: 在您再次进入同一区域之前被调用过。

【讨论】:

我不是在问为什么 didEnterRegiondidExitRegion 被调用一次,我是在问为什么我的所有三个信标设备都没有对 didEnterRegion 和 didExitRegion 做出反应? 你对didEnterRegion 没有反应是什么意思?我在帖子中添加了更多解释。 我尝试将另外两个信标移到我家的角落,这样它们之间的距离就会超过 10 米。只有同一个信标对我的 iPhone 有反应,另外两个没有反应。它们是 Kontakt 信标,我已经下载了 Kontakt 应用程序,它显示所有三个信标的电池寿命都在 90% 左右。 这也是意料之中的。区域监控以 +、- 150m 的精度工作。如果您看过 2012 年的 WWDC 视频,其中 Apple 展示了 Apple Store 客户行为,客户一到停车场就会收到通知。因此,即使您有 3 个 UUID 相距 > 10 m 的信标,您仍然只能找到一个信标。如果您真的想测试它,最好使用 3 UUID 并听所有三个 :)!我希望我说清楚了。 不知道到底发生了什么或我做了什么,但不知何故,所有三个信标现在都在工作 =/ 很奇怪。

以上是关于Swift iBeacon 只有一个信标被监控的主要内容,如果未能解决你的问题,请参考以下文章

信标区域的 iBeacon 监控模式接近度

cordova-plugin-ibeacon:当监控发现信标时,主要/次要不可用

iBeacon 监控具有相同 UUID 和不同主要、次要的多个信标

ibeacons 和地理围栏结合 swift

在对iBeacons进行测距和监控之后,蓝牙设备无法连接,直到重置蓝牙

iOS 在后台监控/测距信标会消耗大量电池