可以检测iOS设备生成的后台信标源
Posted
技术标签:
【中文标题】可以检测iOS设备生成的后台信标源【英文标题】:It's that possible to detect a background beacon source generated by an iOS device 【发布时间】:2016-03-25 21:16:03 【问题描述】:我尝试将 ios 设备用作信标(比如我的 iPhone5),它应该被其他 iOS 设备(比如我的 iPad)检测到。
当两个设备都在前台时,我的 iPad 能够正确检测到我的 iPhone 生成的信标信号。从我的didRangeBeacons
委托方法,我做到了
func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion)
if beacons.count > 0
print(beacons)
我记录了信标信息
[CLBeacon (uuid:<__NSConcreteUUID 0x124e483b0> AD065817-291B-4422-BD59-CBBFBDB81F17, major:9, minor:6, proximity:2 +/- 0.81m, rssi:-56)]
当我的 iPhone(信标)处于后台模式(屏幕未激活)时,我无法检测到来自我的 iPad 的任何信标信号,这种情况有什么解决方案吗?我在网上做了很多研究,但我找不到有启发性的东西。
【问题讨论】:
【参考方案1】:当应用程序处于后台时,信标监控会起作用,因为 iOS 正在为应用程序执行该服务。然而,测距仅在应用程序处于前台时才有效。如果短期背景范围不够,那么您需要在项目设置的 Capability 选项卡中启用 Background Modes 选项,并在您的 Info.plist
中使用 UIBackgroundModes
设置为 location
。
【讨论】:
【参考方案2】:是的,您可以在后台定位信标。通常 iOS 只允许您在进入后台后执行此操作 10 秒,但是,您可以使用此代码将后台唤醒时间延长至最多 3 分钟:
func extendBackgroundRunningTime()
if backgroundTask != UIBackgroundTaskInvalid
// if we are in here, that means the background task is already running.
// don't restart it.
return
NSLog("Attempting to extend background running time")
var self_terminate: Boolean = true
self.backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithName("DummyTask", expirationHandler: () -> Void in
NSLog("Background task expired by iOS")
if self_terminate != nil
UIApplication.sharedApplication().endBackgroundTask(backgroundTask)
self.backgroundTask = UIBackgroundTaskInvalid
)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), () -> Void in
NSLog("Background task started")
while true
NSLog("background time remaining: %8.2f", UIApplication.sharedApplication().backgroundTimeRemaining)
NSThread.sleepForTimeInterval(1)
)
您实际上不需要后台模式。您需要在 info.plist 中设置 NSLocationAlwaysUsageDescription。您的手机将覆盖您设置为查找的任何 CLBeaconRegions。我喜欢使用this app 来使用 iBeacon 进行测试,因为它提供了模拟和检测功能,尽管市面上有很多信标模拟器应用程序,或者您可以购买真正的 iBeacon。
我会尽量少在后台使用测距,因为如果过度执行此过程可能会消耗大量电量。尝试在您不需要了解通过测距提供的接近度和 RSSI 等信息的情况下使用监控,以节省电池寿命。
【讨论】:
【参考方案3】:监控信标在前台和后台都可以很好地工作。 监控
监控区域可以让您的应用了解设备何时进入或退出该区域定义的信标范围。想象一个博物馆,在两个入口处安装了语音导览应用程序和信标。该应用程序正在监视包含两个信标的区域(想想:“所有入口信标”区域),并在用户进入博物馆时收到通知。然后它会启动一个通知,提醒用户有关音频指南功能。
测距
虽然监控使您能够检测出进出信标范围的运动,但测距更加精细。它返回范围内的信标列表,以及与每个信标的估计接近度。回到我们的博物馆示例:想象一个“展品附近的所有信标”区域。语音导览应用程序可以扫描该区域中的所有信标,然后检查哪个信标是最近的。由于每个信标都与特定展览相关联,因此该应用将播放与用户上下文相关的艺术品描述。
测距仅在应用运行时起作用,这在大多数情况下意味着用户正在积极使用该应用。这也意味着它只需要“在您使用应用程序时访问您的位置”的权限。
如果您确定需要为信标提供持久的背景测距,则需要为您的应用程序激活后台模式功能,特别是位置更新模式。
请注意,要让 startRangingBeaconsInRegion 在后台工作,您还需要通过 CLLocationManager 的 startUpdatingLocation 启动标准位置更新(这意味着您的应用中需要 CLLocationManager 和 ESTBeaconManager)。
注意:在 iOS 9 中,您还需要将 CLLocationManager 的allowBackgroundLocationUpdates 属性设置为true。
(来自 community.estimote.com) https://community.estimote.com/hc/en-us/articles/203914068-Is-it-possible-to-use-beacon-ranging-in-the-background-
【讨论】:
以上是关于可以检测iOS设备生成的后台信标源的主要内容,如果未能解决你的问题,请参考以下文章