Swift iBeacon只有一个信标受到监控

时间:2015-09-18 06:44:28

标签: ios parse-platform ibeacon

我的桌子上有3个信标,三个都有相同的UUID但不同的主要和次要数字。我期待看到3个信标进入和退出事件,但只有一个显示。

我已经完成了输入和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 个答案:

答案 0 :(得分:0)

区域监控基于UUID,因此,由于您的UUID相同,因此didEnterRegion:didExitRegion:都会被调用一次。但是,信标测距会返回所有具有该UUID的信标(不同的主要和次要值)。

如果您有三个信标非常接近(正如您提到的那样,所有3个坐在您的桌子上)广播相同的UUID,那么听众只能在didEnterRegion中回拨一次。您可以尝试将三个信标保持在远处,然后移动监听器。在再次输入相同区域之前,您应该看到didEnterRegion被调用3次,前一次调用didExitRegion: