【问题标题】:Ranging beacons interval测距信标间隔
【发布时间】:2014-02-11 05:07:58
【问题描述】:

在 iOS 上,在我的应用程序委托中,我开始区域监控,一旦进入信标区域,我就会使用 locationManager:didRangeBeacons:inRegion 启动测距逻辑。根据 Apple 文档,只有当区域在范围内或超出范围或范围发生变化时,才应调用此方法。

我的问题是,只要我在该区域内,我就会每秒钟都会调用此方法。如何在测距的同时减少对该方法的调用次数?

【问题讨论】:

    标签: ios cllocationmanager region ibeacon


    【解决方案1】:

    locationManager:didRangeBeacons:inRegion 被称为每秒一次,无论如何。每次调用时,beacons 参数将包含应用程序当前可以看到的所有信标的数组,按接近度排序。没有办法限制调用此方法的频率,除非停止测距。

    监控区域(而不是测距)时,您的应用将调用didEnterRegion:didExitRegion,以及didDetermineState:。请参阅this answer 了解更多详情。

    【讨论】:

    • 有没有办法只使用区域信息来获取信标信息(基本上是在后台获取信标信息)?
    • didEnterRegion: 被调用时,您似乎可以调用startRangingBeaconsInRegion:,但应用程序只会在很短的时间内保持清醒。真的不建议尝试在后台执行此操作。
    【解决方案2】:

    根据文档:

    “每当信标进入范围内或超出范围时,位置管理器都会调用此方法。当信标的范围发生变化时,位置管理器也会调用此方法;例如,当信标变得更近时。”

    可能发生的情况是范围略有变化,这导致了您描述的行为。

    为什么会出现这个问题

    编辑:

    在后台,您将通过应用委托方法收到进入区域的通知:

    - (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{}
    

    您可以使用它来确定状态:

    if(state == CLRegionStateInside)
    {
        //Inside a region:
    }
    else if(state == CLRegionStateOutside)
    {
        //Outside a region
    }
    else {
        //Something else
    }
    

    您可以使用它来收集有限的信息或通过本地通知提示用户加载应用程序。当您的应用恢复时,您可以通过 locationManager 收集更多信息。

    【讨论】:

    • 我想在后台处理测距。当用户进入信标范围时,我想获取有关信标的详细信息——这发生在这种方法中。我对邻近信息不感兴趣,所以这就是为什么我不希望如此调用此方法的原因。我还了解到测距需要比区域监控更多的功率,这可能会耗尽用户电池。
    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 2019-08-24
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2014-11-09
    • 2014-10-24
    相关资源
    最近更新 更多