它';检测由iOS设备生成的背景信标源是可能的

它';检测由iOS设备生成的背景信标源是可能的,ios,swift,ibeacon,Ios,Swift,Ibeacon,我试着用一台iOS设备作为信标(比如我的iPhone5),它应该被另一台iOS设备(比如我的iPad)检测到。 当两台设备都在前台时,我的iPad能够正确检测到iPhone生成的信标信号。通过我的didRangeBeaconsdelegate方法,我做到了 func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {

我试着用一台iOS设备作为信标(比如我的iPhone5),它应该被另一台iOS设备(比如我的iPad)检测到。 当两台设备都在前台时,我的iPad能够正确检测到iPhone生成的信标信号。通过我的
didRangeBeacons
delegate方法,我做到了

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)]
[CLBeacon(uuid:AD065817-291B-4422-BD59-CBBFBDB81F17,大调:9,小调:6,接近度:2+/-0.81米,rssi:-56)]

当我的iPhone(信标)处于后台模式(屏幕未处于活动状态)时,我无法检测到来自iPad的任何信标信号,是否有任何解决方案?我在网上做了很多研究,但我找不到有启发性的东西。

当应用程序在后台时,对信标的监控是有效的,因为iOS正在为该应用程序执行该服务。然而,只有当应用程序在前台时,测距才起作用。如果短期背景范围不够,则需要在项目设置的“功能”选项卡中启用“背景模式”选项,并在
Info.plist中使用
ui背景模式
设置为
location
,当应用程序位于后台时,信标监控工作正常,因为iOS正在执行该操作应用程序的服务。然而,只有当应用程序在前台时,测距才起作用。如果短期背景距离不够,则需要在项目设置的“能力”选项卡中启用“背景模式”选项,并在
Info.plist中使用
ui背景模式设置为
location
,是的,可以在背景中对信标进行距离测量。通常情况下,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。您的手机将覆盖您设置为查找的任何CLBeacon区域。我喜欢使用iBeacons进行测试,因为它提供了模拟和检测功能,尽管有很多信标模拟器应用程序,或者你可以购买一个真正的ibeacon


我会尽可能少地在背景中使用测距,因为如果使用过量,这个过程可能会消耗大量电池。尝试在不需要知道通过测距提供的接近度和RSSI等信息以节省电池寿命的情况下使用监控。

是的,您可以在后台测距信标。通常情况下,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。您的手机将覆盖您设置为查找的任何CLBeacon区域。我喜欢使用iBeacons进行测试,因为它提供了模拟和检测功能,尽管有很多信标模拟器应用程序,或者你可以购买一个真正的ibeacon


我会尽可能少地在背景中使用测距,因为如果使用过量,这个过程可能会消耗大量电池。尝试在不需要知道通过测距提供的接近度和RSSI等信息以节省电池寿命的情况下使用监控。

监控信标在前台和后台都能正常工作。 监测

通过监视区域,您的应用程序可以了解设备何时进入或退出该区域定义的信标范围。想象一个博物馆,两个入口安装了音频指南应用程序和信标。该应用程序正在监视包含两个信标的区域(想想:“所有入口信标”区域),并在用户进入博物馆时收到通知。然后它会启动一个通知,提醒用户音频指南功能

范围

虽然监视使您能够检测信标范围内和范围外的移动,但测距更精确。它返回范围内的信标列表,以及每个信标的估计距离。回到我们的博物馆示例:想象一个“展品附近的所有信标”区域。音频指南应用程序可以扫描此区域中的所有信标,然后检查哪个信标最近。由于每个信标都与特定的展品相关联,因此应用程序将播放与用户上下文相关的艺术品描述

仅当应用程序正在运行时,测距才起作用,这在大多数情况下意味着用户正在积极使用应用程序。这也意味着它只需要“在您使用应用程序时访问您的位置”的权限

如果您确定需要信标的持久背景范围,则需要激活应用程序的背景模式功能,特别是位置更新模式

请注意,要使StartRangBeaconRegion在后台工作,您还需要通过CLLocationManager的startUpdatingLocation启动标准位置更新(这意味着您的应用程序中需要CLLocationManager和ESTBeaconManager)

注意:在iOS 9中,还需要将CLLocationManager的allowsBackgroundLocationUpdates属性设置为true

(来自community.estimote.com)

监控信标在前台和后台都能正常工作。 监测

通过监视区域,您的应用程序可以了解设备何时进入或退出该区域定义的信标范围。想象一个博物馆,两个入口安装了音频指南应用程序和信标。该应用程序正在监视包含两个信标的区域(想想:“所有入口信标”区域),并在用户进入博物馆时收到通知。然后它会启动一个通知,提醒用户音频指南功能

范围

W