显示关闭时未调用 didRangeBeacons 方法

Posted

技术标签:

【中文标题】显示关闭时未调用 didRangeBeacons 方法【英文标题】:didRangeBeacons method not getting called when display is Off 【发布时间】:2013-12-11 13:37:31 【问题描述】:

我从几个星期开始使用 ibeacons,我试图发布一些本地通知,当 iphone 击中信标区域时(接近时)。

当应用程序在后台锁定并打开显示时,它工作正常,但是当我的显示器变黑时, didRangeBeacons 方法停止被调用。

我知道通过使用

 region.notifyEntryStateOnDisplay = true;

我们可以在显示屏开启时收到通知。

有什么方法可以在应用程序处于后台并锁定并关闭显示时实现发布通知。

请帮帮我。

【问题讨论】:

【参考方案1】:

完全可以在后台定位信标。

您可以通过与您当前的位置经理一起设置或创建一个平行的来绕过限制(我认为这没有区别)。您还需要在项目中启用后台位置更新功能。

locationManager2 = [[CLLocationManager alloc] init];
locationManager2.delegate = self;
locationManager2.desiredAccuracy = kCLLocationAccuracyKilometer;
[locationManager2 startUpdatingLocation];

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
     //Do nothing here, but enjoy ranging callbacks in background :-)

现在,当 Apple 询问您为什么需要在应用程序中使用后台位置更新模式时,您需要有一个很好的解释。他们对此非常挑剔。

【讨论】:

是的,终于发生了,我在一个数组中有 10 个信标,正在调用 for 循环中的所有信标进行测距,最后它为信标测距,即使我的应用程序处于睡眠模式的锁定状态(即没有光),我所做的是我尝试为邻近 uuid 的每个循环创建 CLBeaconregion 对象,然后将其传递给 [_locationManager startMonitoringForRegion:beaconRegionsObj]; [_locationManager startRangingBeaconsInRegion:beaconRegionsObj];【参考方案2】:

如果您同时请求了信标进入通知和测距,并且您在屏幕锁定时输入了一个新区域,您将收到一条 didEnterRegion 消息(或可能是 didDetermineState 消息),然后是大约 5 秒的测距消息。如果用户在这 5 秒内没有唤醒设备,则测距消息停止。

因此,您无法真正根据与背景信标的接近程度进行过滤。如果您尝试等到您获得接近的范围值,那么您很可能不会获得它,因为设备在用户接近之前停止发送您的测距消息。然后,在用户再次离开该区域或唤醒手机并将您的应用带回前台之前,您将不会再收到有关该信标区域的任何通知。

我正在开发的应用程序在收到 didEnterRegion(或 didDetermineState)消息时会发布本地通知。这会导致屏幕亮起,但似乎不会延长您收到测距通知的时间。

【讨论】:

听起来你在这 5 秒时是对的,我会像你刚刚进入信标区一样发出警报,然后在 5 秒后我可能会在灯亮时收到通知,我会试试这个。谢谢邓肯【参考方案3】:

不,这是设计使然,反映了 ios 节省电池的目标。您只能在应用程序处于前台时依靠didRangeBeacons:

David Young 有一篇非常详尽的文章,可能有助于澄清。

【讨论】:

【参考方案4】:

我遇到了与 Madhu 相同的问题。我使用了适合我的 didUpdateLocations 而不是 didUpdateToLocation。现在,我可以在应用程序处于后台或以锁定和显示关闭时终止信标。

iOS 8.4

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) 
    //Do nothing here

【讨论】:

以上是关于显示关闭时未调用 didRangeBeacons 方法的主要内容,如果未能解决你的问题,请参考以下文章

即使调用了 didDetermineState,也没有调用 didrangebeacons

didRangeBeacons 委托调用一次只返回一个信标

关闭时未调用 Alamofire 请求

CLLocationManager:没有调用 didChangeAuthorization 和 didRangeBeacons

iBeacon:运行应用程序时没有调用 didRangeBeacons

关闭模式视图时未调用 ViewDidAppear