如何知道最近的iBeacon

2023-12-01

我有一个代码可以知道哪个信标是最近的,但是当信标的精度为 -1.00000 时,我遇到一个问题,应用程序采用第二个信标。

因此,有一个小伙子寻找最近的信标,寻找其他信标,并将最近的信标与周围发现的其他信标进行比较。然后,当我知道哪个是最近的一个时,我会向用户显示它的视图,但是当其他信标更接近 ipad 时,视图会关闭并显示视图。

我在两台 iPad 上使用 iOS 7.1 和 7.0.4,第一台是 iPad3,第二台是 iPad Mini Retina。

这里有代码:

    - (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void)initRegion {
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"00000000-0000-0000-0000-000000000002"];
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.devfright.myRegion"];
    [self.locationManager startMonitoringForRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"Beacon Found");
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"Left Region");
    [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
}
-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    CLBeacon *beacon = [[CLBeacon alloc] init];
    CLBeacon *closestBeacon = [[CLBeacon alloc] init];
    closestBeacon = [beacons lastObject];

    //Search for the closest and show the view
    for (int i=0; i<beacons.count; i++) {
        beacon = beacons[i];
        if (beacon.accuracy < closestBeacon.accuracy && beacon.accuracy != -1.000000 && beacon.minor != closestBeacon.minor && beacon.proximity != CLProximityFar) {
            closestBeacon = beacons[i];
            //NSString *closeAccuracy = closestBeacon.minor.stringValue;
        }
        NSLog(@"\nActualBeacon:%@\nAccuracy:%f", beacon.minor.stringValue,beacon.accuracy);
        NSLog(@"\nCloserBeacon: %@\nAccuracy:%f", closestBeacon.minor.stringValue, closestBeacon.accuracy);

    }
    NSLog(@"\nClosestBeacon: %@", closestBeacon.minor.stringValue);
    if (viewShown == NO) {
        if ([closestBeacon.minor.stringValue  isEqual: @"1"]) {
            actualSection = 1;
            [self immediateDetection];
        }else if ([closestBeacon.minor.stringValue  isEqual: @"2"]){
            actualSection = 2;
            [self immediateDetection];
        }else if ([closestBeacon.minor.stringValue  isEqual: @"3"]){
            actualSection = 3;
            [self immediateDetection];
        }else if ([closestBeacon.minor.stringValue  isEqual: @"4"]){
            actualSection = 4;
            [self immediateDetection];
        }else if ([closestBeacon.minor.stringValue  isEqual: @"5"]){
            actualSection = 5;
            [self immediateDetection];
        }else if ([closestBeacon.minor.stringValue  isEqual: @"6"]){
            actualSection = 6;
            [self immediateDetection];
            NSLog(@"6");
        }else if ([closestBeacon.minor.stringValue  isEqual: @"7"]){
            actualSection = 7;
            [self immediateDetection];
            NSLog(@"7");
        }else if ([closestBeacon.minor.stringValue  isEqual: @"8"]){
            actualSection = 8;
            [self immediateDetection];
            NSLog(@"8");
        }else if ([closestBeacon.minor.stringValue  isEqual: @"9"]){
            actualSection = 9;
            [self immediateDetection];
            NSLog(@"9");
        }else if ([closestBeacon.minor.stringValue  isEqual: @"10"]){
            actualSection = 10;
            [self immediateDetection];
            NSLog(@"10");
        }else if ([closestBeacon.minor.stringValue  isEqual: @"11"]){
            actualSection = 11;
            [self immediateDetection];
            NSLog(@"11");
        }else if ([closestBeacon.minor.stringValue  isEqual: @"30"]){
            actualSection = 30;
            [self immediateDetection];
        }
    } else if (viewShown == YES) {
        if (closestBeacon.minor.integerValue != actualSection) {
            //Alarm: Beacon 11
//            if (closestBeacon.minor.integerValue != 11 || closestBeacon.minor.integerValue != 10) {
                [self dismissViewControllerAnimated:NO completion:nil];
                //actualSection = 0;
                viewShown = NO;
//            }
        }
    }
}
- (void)immediateDetection
{
    viewShown = YES;
    if (self.presentedViewController)
    {
        return;
    }
    if (actualSection == 1) {
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 1;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 2){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 2;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 3){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 3;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 4){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 4;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 5){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 5;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 6){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 6;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 7){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 7;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 8){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 8;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 9){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 9;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }else if (actualSection == 10){
        ThiefAlarmViewController *thiefAlarmView = [[ThiefAlarmViewController alloc] init];
        [self presentViewController:thiefAlarmView animated:NO completion:nil];
    }else if (actualSection == 11){
        ThiefAlarmViewController *thiefAlarmView = [[ThiefAlarmViewController alloc] init];
        [self presentViewController:thiefAlarmView animated:NO completion:nil];
    }else if (actualSection == 30){
        SectionViewController *sectionView = [[SectionViewController alloc] init];
        sectionView.section = 30;
        [self presentViewController:sectionView animated:NO completion:nil];
        sectionView.lbl_name.text = self.lbl_name.text;
    }
}

当我知道最接近的 iBeacon 时,我会显示它的视图,但是当它的精度为 -1.00000 并与其他应用程序进行比较时,该应用程序采用第二个,因为第一个的精度 = -1.00000 。

希望任何人都可以帮助我,因为我不知道该怎么办,也许这是一个 iBeacon 问题,但我认为这个问题有一个解决方案。

Thanks.


locationManager:didRangeBeacons:inRegion:将返回您按邻近顺序排列的信标列表。也就是说,列表中的第一个信标将是离您最近的。

然而,这一规则有一个例外:如果任何信标的接近度为“未知”,那么它们将位于列表的顶部(因为它们的精度为 -1)。为了解决这个问题,只需过滤掉任何未知信标,然后选择列表中的第一个:

beacons = [beacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity != %d", CLProximityUnknown]];
CLBeacon *nearestBeacon = [beacons firstObject];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何知道最近的iBeacon 的相关文章

随机推荐

  • 如何在禁用 MongoDB 但仍安装的情况下运行 Spring?

    我正在阅读这个 Git 问题 https github com spring projects spring boot issues 7589关于Java Spring启动 我正在尝试找出一种方法来绕过启动时的崩溃 简短的版本是 如果包含创
  • 将文件数组从 android 上传到 $_FILES

    我想从我的 android 代码上传一些文件 以便它可以在 FILES 数组中使用 服务器正在以数组形式查找文件 服务器中的 php 代码如下所示 for i 0 i lt NumFiles i filename FILES fileset
  • 如何在Powershell中运行C++程序,就像CMD一样?

    就像在 CMD 中一样 要运行 C 程序 我使用以下命令g filename cpp 然后我使用命令运行它a exe 这会在 CMD 本身中打开输出 如何使用 PowerShell 来做这样的事情 我无法通过简单的命令打开文件a exe 我
  • ASP.NET 2.0 - 如何使用 app_offline.htm

    我读过有关app offline htm该文件可以放置在 NET 2 0 应用程序的根目录中 这实际上会关闭该应用程序并禁止请求任何其他页面 我已将该文件放置在根目录中 并且我的网站仍然可以加载 我进入 IIS 中的默认文档并将其设置为ap
  • 在Java中使用XML作为数据库

    我想使用 XML 文件作为数据库 我想在其中存储 ID 及其相应的字符串路径 喜欢
  • 尝试让 Laravel 5 电子邮件正常工作

    我尝试通过输入 URL 向指定用户发送电子邮件 但收到以下错误 AbstractSmtpTransport php 第 383 行中的 Swift TransportException 预期响应代码 250 但得到代码 530 消息为 53
  • JButton长按事件

    我正在 NetBeans 平台上开发 Java 桌面应用程序 我有一些JFrames并且在这些框架内我有几个JButtons 我的应用程序将在工业 PC 基于 Linux 的平板电脑等触摸屏上运行 所以我需要使用按钮的长按事件 我该如何处理
  • 将 MKAnnotation 坐标转换为视图坐标

    当用户单击图钉时 如 Zillow 应用程序 我将显示自定义 UIView 现在的问题是我需要将视图放置在实际引脚的正上方 MKAnnotationView坐标系与地图相关 如何获取相对于 iPhone 屏幕的坐标 然后将我的视图放置在该坐
  • 在不使用库的情况下以格式打印表格,SQLite 3 python

    我想以更好的格式打印数据库中的数据 这是我制作的游戏 这是代码 def read all tables self self cursor execute SELECT Name Gender Age Score Date Time FROM
  • 仿制药的服务定位器

    我说了十几种T继承自EntityObject and IDataObject 我有以下通用接口 IDataManager
  • ASP.NET MVC 网站在任何浏览器上被重定向到本地 IIS 而不是 IIS Express

    Aim 在任何浏览器上的 IIS Express 上本地运行 ASP NET MVC 网站 History 相关项目是一个 ASP NET MVC 网站 最初设置为使用启用了 SSL 的本地 IIS 我尝试在 IIS Express 上进行
  • 如何在不使用 $scope 的情况下在兄弟组件之间传递数据?

    我正在以这种方式制作一个包含 3 个子组件的组件
  • 使用 Swift 将精灵旋转到 SpriteKit 中不精确的精灵位置

    我正在尝试将球员旋转到触球位置 使用触摸移动功能 我将位置设置为变量 然后我调用一个函数 可以用 但是角度不对 Location 是全局变量 player 是我想要转动的精灵 大约倾斜了15度 func rotatePlayer let a
  • 离线应用程序的分析+统计?

    正如标题所示 我需要做的是在各种 iO Android Windows 应用程序中跟踪各种用户事件 例如点击 滑动 在页面上花费的时间等 这些应用程序基于响应式 HTML CSS JS 并具有简单的操作系统特定容器 所有数据 例如图像 视频
  • 如何使用 OpenMP 编译使 R 包 xgboost 在 OS X 中并行?

    我在 R 中使用 xgb cv 和 xgboost 但是 它不能并行工作 我的示例代码如下 library xgboost library parallel param lt list objective reg logistic eval
  • 如何在 *n* 个测试失败后停止 MsTest 测试执行

    我想通过 MS Test 从 Windows 控制台 运行单元测试 这样我就可以在以下情况下停止 终止测试执行 失败的测试计数超过一定的阈值 对于我的用例 当一定比例的测试已经失败时 没有必要继续运行测试 我只能考虑创建一个新的控制台应用程
  • 在 CombinedDomainXYPlot 中创建标记/十字准线

    我想在CombinedDomainXYPlot 中显示一个标记 这是行不通的 我可以为每个子图添加标记 但我想将其添加到CombinedDomainXYPlot 中 任何人都可以告诉我有关这个问题的信息 我认为十字准线的行为是相同的 这是创
  • 如何将字符串从一个 SWF 传递到另一个 SWF

    希望这是一个足够简单的问题 一些细节 我用的是Flash CS5 从来没有接触过Flex 此外 正在加载的 SWF 将是clientSWF 因此希望有一个可以使用简单几行代码的解决方案 基本上我正在处理的 SWF 内部只包含一个简单的字符串
  • 将关键代码发送到 OS X 上的命令行程序

    我想制作一个启动程序然后向其发送按键输入的脚本 在伪脚本中 bin bash program lt lt PRESS CONTROL Z 程序正在运行 因此如果脚本中有其他命令 则将无法访问它们 除非说 control z 终止程序 这可能
  • 如何知道最近的iBeacon

    我有一个代码可以知道哪个信标是最近的 但是当信标的精度为 1 00000 时 我遇到一个问题 应用程序采用第二个信标 因此 有一个小伙子寻找最近的信标 寻找其他信标 并将最近的信标与周围发现的其他信标进行比较 然后 当我知道哪个是最近的一个